-
추상클래스와 인터페이스의 차이와 선택 기준각종 학습 요약/Java 2022. 5. 13. 16:17
추상클래스와 인터페이스의 차이와 선택 기준
이 글은 추상화나
abstract
키워드에 대해 설명하는 글이 아니고, 추상화 개념이 동일하게 적용되었으면서도 각각 다른 방식으로 상속하는 추상클래스와 인터페이스의 차이를 알아보기 위함이다.추상클래스의 특징
추상클래스는 일반 필드와 일반 메소드 그리고 추상 메소드를 가질 수 있는 클래스다.
인터페이스의 특징
static final
변수만 가질 수 있으며 추상 메소드를 가질 수 있는 추상객체다.한 가지 의문
추상 클래스의 설명을 읽다가 문득 이런 의문이 들었다.
추상 클래스도 주 목적은 추상메소드 구현을 통한 강제 Overriding이고, 인터페이스의 주 목적도 동일하게 구현체의 기능 구현을 강제하는 건데, 굳이 둘이 나눠져 있는 이유는 뭐지?
인터페이스가 다중 상속이 가능해서 그런 거라면...
다중 상속을 통한 기능 구현 강제를 한 클래스에 몰아 넣고,abstract class
를 맨 앞에 붙이면 추상 클래스로 인터페이스의 기능을 대체할 수 있게 되는 거 아닌가? static final 키워드도 쓸 수 있고 말이야.맞다. '기능만 보면' 똑같다.
하지만 그렇게 해서는 안된다. 둘의 기능(오버라이딩 강제)에 포커스를 맞출 게 아니다.
잠시 잊고 있었다. 자바의 상속 관계는 반드시 상속의 규칙에 따라 올바른 상속인지 아닌지를 구분해야 한다(흔히 하는 표현으로 "is-a/has-a를 따져야 한다").상속(extends)을 통한 상위클래스-하위클래스 관계는 일시적인 역할이나 일부 기능으로 구분되는 개념이 아니다. 구현(implements) 관계는 기능과 역할에 따라 중첩될 수가 있다(물론, 역할을 마구 얽는게 좋다는건 당연히 아니다).
마무리
인터페이스/추상클래스 선택 기준 : 일시적인 역할이나 일부 하위클래스만이 가지고 있는 기능 때문이라면 상속(extends)를 고려해서는 안되고, 인터페이스를 구현하는 쪽으로 가야한다.
한마디로 인터페이스냐, 추상클래스냐 중요한게 아니고, 상속이 필요한 순간인지를 확실히 판단하는 것이 중요하다.
'각종 학습 요약 > Java' 카테고리의 다른 글
Java: 내부 클래스(Inner Class)의 기본적인 이해 (4) 2022.05.18 Java: 컬렉션 프레임워크(Collection Framework) 개요 (0) 2022.05.17 Java: 제네릭 Generic (4) 2022.05.17 # Java의 상속 개념 : inheritance, composite (2) 2022.05.12 Java: 생성자(Constructor)의 기본적인 이해 (0) 2022.05.11 클래스와 인스턴스의 관계 이해하기 (0) 2022.05.10