타입 코드를 서브클래스로 바꾸기
더 많은 작업
타입 코드를 서브클래스로 바꾸기(Replace Type Code with Subclasses)는 객체의 종류를 정수·문자열 상수 필드(타입 코드)로 구분하던 클래스를, 타입 코드 값마다 하위 클래스를 만들고 그 값에 따라 달라지던 동작을 하위 클래스로 옮기는 리팩토링 기법이다.
타입 코드는 별도의 자료형 대신 TYPECODE_LINE, TYPECODE_OVAL 같은 숫자·문자열 상수의 목록으로 객체의 종류를 나타내는 것을 말한다. 타입 코드가 switch·if 조건에 쓰여 객체의 동작을 갈라 놓으면, 종류가 하나 늘 때마다 그 조건문들을 모두 찾아 고쳐야 한다. 이 기법은 타입 코드 값마다 하위 클래스를 만들고 관련 동작을 하위 클래스로 뽑아낸 뒤, 조건 분기를 다형성으로 바꾼다.[1]
마틴 파울러(Martin Fowler)의 리팩토링 카탈로그에도 실려 있다. 카탈로그의 예는 new Employee(name, type) 처럼 종류를 인자로 받던 생성을, 종류에 따라 Engineer·Salesman·Manager 하위 클래스를 만들어 돌려주는 형태로 바꾼다. 반대 방향 기법은 '하위 클래스 제거하기(Remove Subclass)'이고, 별칭으로 '타입 코드를 상태/전략으로 바꾸기', '하위 클래스 추출하기'가 함께 적혀 있다.[2]
- 타입 코드 필드를 직접 읽지 않고 getter 로 읽게 한다(자체 캡슐화)
- 상위 클래스 생성자를 숨기고, 타입 코드 값을 받아 알맞은 하위 클래스 객체를 만들어 주는 정적 팩토리 메서드를 둔다. 조건문은 이 팩토리 한곳에만 남는다
- 타입 코드 값마다 하위 클래스를 만들고, 각 하위 클래스가 자기 타입 코드 값을 돌려주게 한다
- 상위 클래스의 타입 코드 필드를 지우고 getter 를 추상 메서드로 만든다
- 타입 코드에 따라 갈라지던 메서드를 하위 클래스로 옮긴다. 이 단계에는 조건문을 다형성으로 바꾸기를 쓴다[1]
바꾸기 전에는 Shape 가 _typecode 필드를 가지고, draw() 안의 switch 문이 선·사각형·타원마다 다른 코드를 실행한다.
public class Shape {
private final int _typecode;
public void draw() {
switch (_typecode) {
case TYPECODE_LINE: ... break;
case TYPECODE_RECTANGLE: ... break;
case TYPECODE_OVAL: ... break;
}
}
}
바꾼 뒤에는 Shape 가 추상 클래스가 되고, 타입 코드 값마다 생긴 하위 클래스가 draw() 를 오버라이딩한다.
public abstract class Shape { public abstract void draw(); }
public class ShapeLine extends Shape { @Override public void draw() { ... } }
public class ShapeRectangle extends Shape { @Override public void draw() { ... } }
public class ShapeOval extends Shape { @Override public void draw() { ... } }
| 기법 | 하는 일 | 구별 포인트 |
|---|---|---|
| 타입 코드를 서브클래스로 바꾸기 | 타입 코드 값마다 하위 클래스를 만들고 동작을 옮긴다 | 타입 코드가 동작을 가르는 조건문에 쓰일 때. 하위 클래스가 생긴다 |
| 타입 코드를 클래스로 바꾸기(Replace Type Code with Class) | 타입 코드 값들을 하나의 새 클래스(값 객체)의 인스턴스로 바꾼다 | 타입 코드가 동작에 영향을 주지 않을 때만 쓴다. 하위 클래스를 만들지 않는다[3] |
| 타입 코드를 상태/전략으로 바꾸기 | 타입 코드를 별도의 상태 객체 계층으로 옮기고 위임한다 | 상속을 쓸 수 없거나 값이 실행 중 바뀔 때 |
| 조건문을 다형성으로 바꾸기 | 타입별 분기를 하위 클래스의 오버라이딩으로 옮긴다 | 하위 클래스가 이미 있거나, 이 기법의 마지막 단계로 함께 쓰인다 |
| 메서드 올리기(Pull Up Method) | 여러 하위 클래스에 똑같이 있는 메서드를 상위 클래스로 옮긴다 | 하위 클래스를 만드는 것이 아니라 중복을 상위로 모은다. 방향이 반대다 |
| 매개변수를 메서드로 바꾸기(Replace Parameter with Method Call) | 호출하는 쪽이 계산해 넘기던 인자를 받는 쪽이 직접 메서드를 불러 구하게 하고 매개변수를 없앤다 | 매개변수 목록 정리 기법이다. 타입 코드·상속과 무관하다 |
- ↑ 1.0 1.1 1.2 1.3 「Replace Type Code with Subclasses」, Refactoring.Guru, https://refactoring.guru/replace-type-code-with-subclasses, 확인일: 2026-11-04.
- ↑ Martin Fowler, 「Replace Type Code with Subclasses」, Refactoring Catalog, https://refactoring.com/catalog/replaceTypeCodeWithSubclasses.html, 확인일: 2026-11-04.
- ↑ 「Replace Type Code with Class」, Refactoring.Guru, https://refactoring.guru/replace-type-code-with-class, 확인일: 2026-11-04.