하나의 클래스가 두 가지 이상의 기능을 가지고 있으며, 그 중 어떤 기능을 제공하는지 표시는 태그가 달린 클래스를 만날 때가 있다.
위의 클래스에는 다양한 문제점이 있다. enum 선언, 태그 필드 , switch문 등의 상투적인 코드가 반복되며, 서로 다른 기능을 위한 코드가 한 클래스에 모여있으니 가독성도 떨어진다. 객체를 만들때마다 필요없는 필드도 함께 생성되므로 메모리도 낭비다. 즉 태그 기반 클래스는 너저분하고 오류 발생 가능성이 높고 효율적이지 않다. 이러한 클래스는 계승을 이용하여 리팩토링 해야한다.
먼저 태그 값에 따라 달리 동작하는 메서드를 추상 메서드로 선언하는 추상 클래스를 정의한다. 그 추상 클래스를 클래스 계층 맨 위에 둔다. 그리고 태그 값에 좌우되지 않는 메서드, 데이터 필드를 모두 그 추상클래스에 둔다. 그 다음으로 태그 기반 클래스가 제공하던 각각의 기능을 방금 만든 최상의 클래스의 객체 생성 가능 하위 클래스로 정의하는 것이다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[클래스와 인터페이스]규칙22. 멤버 클래스는 가능하면 static으로 선언하라 (0) | 2017.04.26 |
---|---|
[클래스와 인터페이스]규칙21.전략을 표현하고 싶을 때는 함수 객체를 사용하라 (0) | 2017.04.26 |
[클래스와 인터페이스]규칙19. 인터페이스는 자료형을 정의할 때만 사용하라 (0) | 2017.04.25 |
[클래스와 인터페이스]규칙18. 추상 클래스 대신 인터페이스를 사용하라 (0) | 2017.04.25 |
[클래스와 인터페이스]규칙17. 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라 (0) | 2017.04.24 |