반응형
클래스에 상황에 따라서 역할을 변경하는
태그 달린 클래스를 볼 수 있다.
예를 들어, 아래 유형과 같이 탈것을 나타내는 클래스는
어떤 형태로 사용하느냐에 따라서 자동차가 될수도, 자전거가 될 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Vehicle { enum Type { CAR, BICYCLE }; final Type type; public Vehicle (double pedalCount) { this.type = Type.BICYCLE; } public Vehicle (double license, int sheetCount) { this.type = Type.CAR; } // 바퀴수를 반환하는 메서드 public int getWheelCount() { switch (type) { case CAR: return 4; break; case BICYCLE: return 2; break; } } } | cs |
하지만 이럴경우, 종류에 따라 Vehicle 클래스에서
다루어주어야 할 부분이 너무 많다.
예를 들면,
위에 보면 Vehicle클래스 타입에 따라 getWheelCount 메서드를 사용할 때, switch문을 사용해야 하고 굉장히 번잡스럽다.
이러한 이유들로
관리도 힘들고 버그가 발생할 위험도 있다.
또한 이런 경우 단일 책임 원칙 (Single Responsibility Principle) SRP를 위해하는 행위이다.
이런 경우 태그 기반 클래스(tagged class)를 사용하지 말고 계층기반으로 변경한다.
1 2 3 | public abstract class Vehicle { abstract int getWheelCount(); } | cs |
Vehicle을 추상클래스로 생성하고, 이를 Car, Bicycle클래스에서 상속받아 구현하여
getWheelCount를 자신의 클래스에 맞게 재정의 하여 사용하도록 처리한다.
그럴 경우, 처리도 단순해지고 유지보수에도 수월해진다.
결론을 말하자면,
태그 기반 클래스를 피하고 클래스 계층을 사용한다.
출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙20인용.
반응형
'JAVA > Effective Java' 카테고리의 다른 글
클래스와 인터페이스 - 규칙22 멤버 클래스는 가능하면 static으로 선언하라. (0) | 2018.05.29 |
---|---|
클래스와 인터페이스 - 규칙 21 전략을 표현하고 싶을 때는 함수 객체를 사용하라. (0) | 2018.05.29 |
클래스와 인터페이스 - 규칙 19 인터페이스는 자료형을 정의할 때만 사용하라. (0) | 2018.05.29 |
클래스와 인터페이스 - 규칙 18 추상 클래스 대신 인터페이스를 사용하라. (0) | 2018.05.29 |
클래스와 인터페이스 - 규칙 17 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라. (0) | 2018.05.29 |