Abstract class (추상클래스)
new ...()
불가능)extends (상위클래스)
Interface
구현과 사용
의 분리.new
객체생성 불가)implements (Interface)
final
- 재정의 불가! 키워드
추상클래스는 그래도 클래스다
.
따라서 상태
가 존재.
반면 인터페이스는 약속
.
따라서 상수 값
와 추상메서드
가 존재.
크게 2가지 종류
가 있다.
추상메서드
가 있는 경우
: 하위 클래스가 필수적으로 재정의 책임이 있음
추상메서드
가 없는 경우
: 하위 클래스가 필수로 재정의 할 메서드가 없고, 선택적 재정의
아래와 같은 상황을 생각해보자.
임의의 도형의 넓이를 계산하는 ShapeUtil
클래스를 설계하고 싶다. 그래서 Shape
클래스를 만들었다.
Shape
클래스의 대략적인 내용은 다음과 같다.
double area;
double circum;
printFormat(){...}
calculateArea();
특정 도형에 대한 정보가 없으므로(사각형이면 가로, 세로 원이면 반지름...등) 넓이를 구하는 메서드를 구현할 수 없다.
따라서
calculateArea()
의 메서드를 구현하지 않고추상메서드
로 설계해서 이후 하위 클래스에게 구현 책임을 강제하도록 했다.
나중에 Circle
클래스가 Shape
클래스를 상속하고, 이때에는 해당 클래스 안에 반지름 등의 정보가 있을 것이므로 calculateArea()
메서드를 이제야 비로소 실제 구현할 수 있다.
여기서 포인트는,
⭐
ShapeUtil
클래스는 이러한Circle
클래스가 추상 메서드를 구현해놓기만 하면, 구체적인 내용을 모르고도 다음과 같은 메서드를 컴파일 오류 없이 설계 해놓을 수 있다.
ShapeUtil
calcArea(Shape s){
s.calculateArea(); // 컴파일 오류 없음
}
확실하게 A is a B 관계다
또는 변수나 상태를 지녀야 한다
-> 추상 클래스
다중 상속
또는 A is a B 관계로 보기 애매하다
-> 인터페이스
이 정도로 정리하면 되겠다.
정말 좋은 정보 감사합니다!