여기서 의미하는 태그란 해당 클래스가 어떠한 타입인지에 대한 정보를 담고있는 필드(멤버 변수)를 의미한다.
이러한 태그를 가지고 있으면 여러가지 단점이 존재하게 된다.
결국 태그 달린 클래스는 읽기 어렵기만 하고 오류는 발생하기 쉬우며 비효율적이다.
이러한 태그 달린 클래스의 구현은 클래스의 계층구조를 어설프게 흉내 낸 아류이다.
이를 개선하기 위해 다음과 같은 순서를 밟도록 하자.
root가 될 추상 클래스를 정의하자.
태그에 따라 행동이 달라지던 메서드는 추상 메서드로 구현하자. 그렇지 않다면 일반 메서드로 구현하자.
공통된 필드는 모두 root 클래스로 올리자.
root 클래스를 확장한 구체 클래스를 의미별로 정의하자. 각 의미에 해당하는 데이터 필드를 구체 클래스에 정의하자.
구체 클래스에서 추상 메서드를 의미에 맞게 구현하자.
이렇게 함으로써 컴파일러가 override 메서드를 모두 구현했는지에 대한 도움을 받을수 있고, 각 구체 클래스의 멤버변수 또한 final로 선언 할 수 있다.