# [[Replace Type Code with Subclasses (분류 부호를 하위 클래스로 바꾸기)]]

## 📌 Brief Summary
'분류 부호를 하위 클래스로 바꾸기(Replace Type Code with Subclasses)'는 객체의 동작에 영향을 미치는 불변(immutable)의 타입 코드(Type Code)를 하위 클래스 상속 구조로 대체하는 리팩토링 기법이다 [1]. 이 기법은 주로 타입 코드에 따라 다르게 동작하는 조건문을 다형성(Polymorphism)으로 해결하기 위한 필수적인 준비 단계로 활용된다 [2]. 결과적으로 클라이언트 코드가 가지고 있던 분기 처리 지식을 클래스 내부로 이동시켜, 새로운 타입이 추가될 때 기존 코드를 수정할 필요 없이 새로운 하위 클래스만 추가하도록 시스템을 유연하게 만든다 [3].

## 📖 Core Content
* **적용 목적 및 배경**
  타입 코드가 객체의 동작에 영향을 주지 않는 순수 데이터라면 단순히 '클래스로 타입 코드 대체하기(Replace Type Code with Class)'를 적용하면 되지만, 타입 코드 값에 따라 객체의 동작이 달라질 경우에는 다형성을 활용하여 변형된 동작을 처리하는 것이 가장 이상적이다 [1]. 이러한 동작의 변형은 주로 `switch`나 `if-then-else` 같은 조건문으로 나타나며, 조건문을 다형성으로 바꾸기(Replace Conditional with Polymorphism) 위해서는 먼저 이 기법을 통해 다형성 동작을 수용할 하위 클래스 상속 구조를 구축해야 한다 [2, 4].

* **구조적 장점 및 활용**
  이 리팩토링은 변형된 동작에 대한 지식을 클래스의 클라이언트에서 클래스 자체로 이동시킨다 [3]. 다형성을 적용하지 않은 상태에서는 새로운 타입이 추가될 때마다 프로그램 곳곳에 흩어진 모든 조건문을 찾아 수정해야 하지만, 이 기법을 도입하면 새로운 하위 클래스를 생성하기만 하면 되므로 타입 변형이 지속적으로 변경되는 환경에서 특히 가치가 높다 [3, 5]. 또한, 특정 타입 코드에만 해당하는 고유한 기능(메서드나 필드)이 존재할 경우, 이 리팩토링 이후에 '메서드 내리기(Push Down Method)'와 '필드 내리기(Push Down Field)'를 적용하여 각 하위 클래스로 책임을 명확히 분리할 수 있다 [3].

* **실행 절차(Mechanics)**
  1. 타입 코드를 자가 캡슐화(Self-encapsulate)한다. 생성자에 타입 코드가 전달된다면 생성자를 팩토리 메서드(Factory Method)로 교체한다 [6, 7].
  2. 타입 코드의 각 값에 대응하는 하위 클래스를 생성한다. 하위 클래스에서는 상위 클래스의 타입 코드 게터(getter) 메서드를 재정의(override)하여 해당 하위 클래스에 맞는 값을 반환하도록 한다 [6].
  3. 상위 클래스에서 타입 코드 필드를 제거하고, 타입 코드 접근자를 추상(abstract) 메서드로 선언한다 [6, 8].

* **코드 스멜과의 연관성**
  이 기법은 객체지향 원칙을 남용하여 절차적으로 작성된 코드나 '원시 타입 집착(Primitive Obsession)', '반복되는 switch 문(Switch Statements)' 등의 코드 스멜을 해결하는 주요 해결책으로 제시된다 [5, 9-11].

## ⚖️ Trade-offs & Caveats
* **객체 생성 후 타입 코드 변경 불가 (상태 가변성 문제)**
  객체가 생성된 이후 생명주기 동안 타입 코드의 값이 변경되어야 하는 상황이라면 이 기법을 사용할 수 없다 [4]. 객체지향 언어에서 객체는 생성 후 자신의 클래스를 변경할 수 없기 때문이다 [12].
* **기존 상속 구조와의 충돌**
  대상 클래스가 이미 다른 논리적 이유로 인해 하위 클래스화(subclassing)되어 상속 구조를 띄고 있다면 이 기법을 적용할 수 없다 [4].
* **대안 기법의 필요성**
  위의 두 가지 제약 사항(타입 코드가 가변적이거나 이미 상속이 사용 중인 경우) 중 하나라도 해당한다면, 상속을 통한 '하위 클래스로 바꾸기' 대신 위임(Delegation)을 활용하는 '타입 코드를 상태/전략 패턴으로 바꾸기(Replace Type Code with State/Strategy)' 기법을 대안으로 사용해야 한다 [4, 13, 14].

---
*Last updated: 2026-05-03*