본문 바로가기

롱런 프로젝트

인터페이스와 추상 클래스를 함께 쓴다면

 

 

인터페이스 설계 도중

 

1.

interface Group 

class Study implements Group

enum StudyType

 

으로 설계 후 Study 에서 StudyType을 필드로 갖는 방법

 

2.

interface Group

abstract class Study implements Group

class LectureStudy extends Study

class DebateStudy extends Study

 

으로 설계 후 구현하는 방법

 

두가지 관점에서 고민을 했다.

 

1번 경우를 사용하면

새로운 타입이 추가될 때 열거 타입에 추가되는 객체를 추가하면 쉽게 처리되지만

새로운 타입의 정의에 따라 달라질 수 있는 필드 또는 상태가 추가 될경우

( 여기선 Lecture 일 때 가르치는 사람 필드가 필요했다 )

해당 필드가 필요 없는 경우 ( 여기선 Debate 일 때 가르치는 사람 필드가 필요 없음 )

해당 값을 null 또는 0 등으로 처리해야 한다.

 

2번 경우를 사용하면

새로운 타입이 추가 될 때 결국 새로 구현해 내야 하는 단점 ( 귀찮음 ) 이 있지만

해당 클래스명으로 상태를 명확히 나타내기에 (더) 좋고 

중복된 내용들은 abstract 로 작성한 상위 클래스에 두며

필요한 내용들은 생성할 때 작성할 수 있다.

 

 

 

Effective Java 3/E - item20

 

"인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로

 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있다."

 

같은 메서드나 필드값을 굳이 하위 클래스에서 중복되게 정의할 필요는 없는

클래스 확장의 장점을 취하는 방법인데 이를 통하면

여러 타입 정의(interface)와 중복 리소스 재정의(class) 의 장점을 취할 수 있다.

장점이 더 있을거 같은데 일단 이것만 떠오른다.

 

뭐가 더 좋은지는 경험치 부족으로 확정 내릴 순 없다.

 

 

--------

 

추가 

abstract 클래스로 정의한 Study 하위 클래스들이 로직상 필요 없어져서 코드에는 없음