본문 바로가기
프로그래밍/JAVA

23 추상클래스와 인터페이스(interface)

by 윤지(●'◡'●) 2021. 4. 15.
반응형

 


추상클래스

 

추상적인 내용을 정의하고 있는 클래스로, 구현되지 않은 메소드가 존재하는 클래스 이다.
이렇게 구현되지 않은 메소드는 자식 클래스에서 구현되도록 설계한다.
중괄호 없이(= 바디가 없다) 정의만 된 메소드를 추상 메소드 라고 부르며,

이런 추상 메소드가 있는 클래스를 추상 클래스라고 한다.
자식 클래스에서 반드시 재정의하여 구현하는 메소드를 추상메소드로 정의해놓고 이를 강제성이라고 한다

 

[문법]

abstract class 추상클래스명{
	abstract 리턴타입 메소드명();
}

 

 

바로 예제로 살펴보자 :)

 

 

1. 도형의 넓이를 구하는 추상메소드를 가지고 있는 추상클래스를 정의한다.

 

abstract class Shape{
	double area;
	abstract void getArea(double w, double h);
	
}

 

 

2. 추상 클래스를 상속받는 클래스를 생성한다.

추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야 한다.
추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메소드를 구현하지 않으면 해당 클래스도 추상 클래스가 된다.
class Rect extends Shape{
	
	@Override
	void getArea(double w, double h) {
		area = w * h;
		System.out.println(area);
	}
}

class Tri extends Shape{
	@Override
	void getArea(double w, double h) {
		area = w * h /2 ;
		System.out.println(area);		
	}
}

 

 

3. 사용해보자 :)

 

public class Main {
	public static void main(String[] args) {
		Tri t = new Tri();
		t.getArea(5,6);
		
		Rect r = new Rect();
		r.getArea(3.68, 5.9);
	
	}
}

 

자식클래스에서 추상메소드를 구현할때, 오버라이딩 되는것을 알 수 있는데

쉽게 생각하면 추상클래스는 틀만 만들어놓고 자식클래스에게 이 틀을 가지고 재정의해서 쓰는것이다.

 

 

 


 

 

인터페이스(interface)

 

추상클래스를 고도화 시킨 문법이며, 반드시 추상 메소드와 상수만 선언해야 한다.

(즉, 메소드 앞에는 public abstract가 생략되어있고 변수 앞에는 final static이 생략되어있다. )

 

public interface Soldier {
	//인터페이스 첫글자도 대문자로 시작함
	final static int arms = 2;
	int leg = 2;
	// final static 생략가능 - 어짜피 상수밖에 사용이 안되기때문에

	abstract void eat();
	void sleep(); // abstract 생략 가능 - 어짜피 추상메소드 밖에 사용이 안되기때문에
	void work();
	void salute();
}

 

다른 클래스에서 인터페이스를 지정할 때에는 implements를 사용한다.

public class Private implements Soldier


지정된 인터페이스가 가지고 있는 모든 추상 메소드들은 반드시 구현되어야 한다.

 

public class Private implements Soldier {

	@Override
	public void eat() {
		System.out.println("허리를 곧게 펴고 직각식사를 한다.");
	}

	@Override
	public void sleep() {
		System.out.println("잠에 쉽게 들지 못한다.");
	}

	@Override
	public void work() {
		System.out.println("열심히 하지만 처음이라 어렵다.");
	}

	@Override
	public void salute() {
		System.out.println("충!!!!!!!!!!!!!성!!!!!!!!!");
	}

}

 

인터페이스는 여러개의 인터페이스를 다중상속 비슷하게 받을 수 있다 

class A implements a, b, c

 

인터페이스는 위에서 말했듯이 지정된 인터페이스가 가지고 있는 모든 추상 메소드들은 반드시 구현되어야 한다.

하지만, 모든 메소드가 아닌 선택적으로 메소드가 필요한 경우에는 어떻게 해야할까?

 

중간다리 역할을 할, Adapter 클래스를 생성 해 사용한다.(필요 없는 메소드를 구현해 놓는다)

 

Adapter

public abstract class SoldierAdapter implements Soldier {
	@Override
	public void work() {;}
	
	@Override
	public void salute() {;}

}

 

그 후 , Adapter 클래스를 상속 받으면, Adapter class에 적히지않은 메소드에만 강제성이 부여된다.

(즉, 강제성을 제거하고 싶은 메소드는 Adapter 클래스에 구현을 해놓는다)

 

public class Sergeant extends SoldierAdapter{

	@Override
	public void eat() {
		System.out.println("편의점 간다");
	}
	@Override
	public void sleep() {
		System.out.println("숨어서 잔다");
	}
}

 

Marker Interface

클래스들의 공통 그룹명으로 인터페이스를 생성한다.
하지만 반드시 인터페이스 필드는 비워놓아야 한다.

(왜? 클래스들이 같은 그룹으로 묶였다는 표시하기 위해 사용하기 위해서)

 

public interface AnimationMarker {
	//AnimationMarker 생성, 필드는 비워놓는다
}

 

public class Pokemon implements AnimationMarker{
	// 포켓몬 - AnimationMarker
}
public class Digimon implements AnimationMarker{
	// 디지몬 - AnimationMarker
}
public class Titanic {
	// 타이타닉 - 애니메이션이 아니니 AnimationMarker (X)
}

 

Marker Interface를 통해 애니메이션을 구분해놓았다 :) 제대로 되었는지 실행해보자!

 

public class Test {
	public static void main(String[] args) {
		Pokemon pk = new Pokemon();
		Digimon dg = new Digimon();
        Titanic tt = new Titanic();
		if(pk instanceof AnimationMarker) {
			System.out.println("포켓몬은 애니메이션이야");
		}
        if(dg instanceof AnimationMarker) {
			System.out.println("디지몬은 애니메이션이야");
		}
        if(!(tt instanceof AnimationMarker)) {
			System.out.println("타이타닉은 애니메이션이 아니야");
		}
	}
}

 

 

포켓몬은 애니메이션이야
디지몬은 애니메이션이야
타이타닉은 애니메이션이 아니야

 

 


추상클래스와 Interface?

 

비슷해보이는 둘 차이점이 무엇일까?

 

추상클래스 인터페이스
클래스이다(abstract class로 선언) 클래스가 아니다(interface로 선언)
일반메소드와 추상메소드 모두 가능하다 추상메소드만 가능하다. 
확장을 하며 extends로 서브클래스 정의 구현을 하면 implements로 서브 클래스 정의
단일 상속만 가능하다. 다중 상속도 가능하다.
변수와 상수를 모두 가질 수 있다. static final 형태의 상수만 가질 수 있다.
모든 추상 메소드는 인스턴스 생성을 위한 서브클래스에서 반드시 구현 되어야 한다(강제성)

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

25 예외처리(Exception)  (0) 2021.04.16
24 내부클래스와 익명클래스  (0) 2021.04.15
22 Casting(Up casting/Down casting)과 instanceof  (0) 2021.04.13
21 다형성(Polymorphism)  (0) 2021.04.08

댓글