#20 태그(tagged) 클래스보다는 클래스 계층을 이용하자
인스턴스의 특성을 분류하는 태그(tag) 필드를 갖는 클래스를 태그(tagged) 클래스라 합니다.
이러한 태그 클래스들을 이용한 경험들이 다들 있을 텐데, 가독성 측면에서 정말 안 좋습니다.
특성별로 쓰이는 필드들로 인해 필요 없는 메모리 할당 해지가 늘어나 성능면에서도 안 좋고 쓸데없이 커지고 가독성이 안 좋아집니다.
결국 태그 클래스는 코드가 쓸데없이 장황하고, 에러가 나기 쉬우며, 비효율 적입니다.
태그 클래스를 클래스 계층으로 변환하면, 이러한 문제들을 해결할 수 있습니다.
1. 우선 태그 값에 따라 동작이 달라지는 메서드(area 메서드)를 추상 클래스의 추상 메서드로 정의합니다.
만약 태그 값에 의존하지 않고 공통적으로 쓰이는 메서드나 필드가 있다면 이 또한 추상 클래스에 넣습니다.
2. 태그 클래스의 각 인스턴스 종류를 추상 클래스(Figure 2)의 서브 클래스(Circle, Rectangle)로 정의합니다.
각 인스턴스에 속하는 데이터 필드를 각각의 서브 클래스에 넣습니다.
그리고 아래와 같이 추상 메서드(area)를 구현합니다.
이렇게 구현하면 앞서 태그 클래스의 문제점들도 사라지게 됩니다.
그리고 서브 클래스를 추가해서 이 클래스 계층을 쉽게 확장할 수 도 있습니다.
따라서 태그 클래스를 이용할 때, 클래스 계층으로 변환이 가능한지를 우선 생각해야 합니다.