Abstract class VS Interface

최민수·2023년 7월 19일
0

프로그래밍 언어

목록 보기
8/14

추상클래스와 인터페이스

Abstract class (추상클래스)

  • 선언만 해두고 구현은 상속받을 클래스에게 강제하는 클래스
  • cannot be instantiated directly (클래스에서 바로 객체화(new ...() 불가능)
  • 상속받을 클래스는 extends (상위클래스)

Interface

  • 구현과 사용의 분리.
  • 클래스가 아님. (따라서 new 객체생성 불가)
  • 약속, Spec 을 따르는 명세서
  • Java에서 다중 상속이 안되어 발생하는 Abstract Class의 한계도 보완해줄 수 있음
  • 상속받을 클래스는 implements (Interface)

final - 재정의 불가! 키워드

  • 클래스에 final이 붙으면? - 상속 금지. (상속을 하게 되면 이 클래스를 기반으로 여러 클래스가 재정의 되므로)
  • 메서드에 final이 붙으면? - 메서드 오버라이딩 금지. (메서드 재정의 금지)
  • 변수에 final이 붙으면? - 상수화. (재할당 불가)

둘 간의 차이점

추상클래스는 그래도 클래스다.
따라서 상태가 존재.

반면 인터페이스는 약속.
따라서 상수 값추상메서드 가 존재.


추상클래스의 종류

크게 2가지 종류가 있다.

  1. 추상메서드가 있는 경우
    : 하위 클래스가 필수적으로 재정의 책임이 있음

  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 관계로 보기 애매하다 -> 인터페이스

이 정도로 정리하면 되겠다.


profile
CS, 개발 공부기록 🌱

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 좋은 정보 감사합니다!

답글 달기