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 관계로 보기 애매하다 -> 인터페이스
이 정도로 정리하면 되겠다.
정말 좋은 정보 감사합니다!