ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상클래스와 인터페이스의 차이와 선택 기준
    각종 학습 요약/Java 2022. 5. 13. 16:17

    추상클래스와 인터페이스의 차이와 선택 기준

    이 글은 추상화나 abstract 키워드에 대해 설명하는 글이 아니고, 추상화 개념이 동일하게 적용되었으면서도 각각 다른 방식으로 상속하는 추상클래스와 인터페이스의 차이를 알아보기 위함이다.

    추상클래스의 특징


    추상클래스는 일반 필드와 일반 메소드 그리고 추상 메소드를 가질 수 있는 클래스다.

    인터페이스의 특징


    static final 변수만 가질 수 있으며 추상 메소드를 가질 수 있는 추상객체다.

    한 가지 의문


    추상 클래스의 설명을 읽다가 문득 이런 의문이 들었다.

    추상 클래스도 주 목적은 추상메소드 구현을 통한 강제 Overriding이고, 인터페이스의 주 목적도 동일하게 구현체의 기능 구현을 강제하는 건데, 굳이 둘이 나눠져 있는 이유는 뭐지?
    인터페이스가 다중 상속이 가능해서 그런 거라면...
    다중 상속을 통한 기능 구현 강제를 한 클래스에 몰아 넣고, abstract class를 맨 앞에 붙이면 추상 클래스로 인터페이스의 기능을 대체할 수 있게 되는 거 아닌가? static final 키워드도 쓸 수 있고 말이야.

    맞다. '기능만 보면' 똑같다.
    하지만 그렇게 해서는 안된다. 둘의 기능(오버라이딩 강제)에 포커스를 맞출 게 아니다.
    잠시 잊고 있었다. 자바의 상속 관계는 반드시 상속의 규칙에 따라 올바른 상속인지 아닌지를 구분해야 한다(흔히 하는 표현으로 "is-a/has-a를 따져야 한다").

    상속(extends)을 통한 상위클래스-하위클래스 관계는 일시적인 역할이나 일부 기능으로 구분되는 개념이 아니다. 구현(implements) 관계는 기능과 역할에 따라 중첩될 수가 있다(물론, 역할을 마구 얽는게 좋다는건 당연히 아니다).

    마무리


    인터페이스/추상클래스 선택 기준 : 일시적인 역할이나 일부 하위클래스만이 가지고 있는 기능 때문이라면 상속(extends)를 고려해서는 안되고, 인터페이스를 구현하는 쪽으로 가야한다.

    한마디로 인터페이스냐, 추상클래스냐 중요한게 아니고, 상속이 필요한 순간인지를 확실히 판단하는 것이 중요하다.

    댓글

Designed by Tistory.