728x90
1. 리팩토링
1) 분류 코드를 클래스로 치환
- 분류 코드는 객체 종류를 나타내는 값
- 분류 코드가 int와 같은 기본 타입이면 분류 코드 범위 밖의 값이 사용되거나 다른 분류 코드와 착각할 수있음
👉 타입 판별이 되지 않는 또는 타입 세이프가 아닌 문제
2) 리팩토링 카탈로그
이름 | 분류 코드를 클래스로 치환 |
상황 | 객체를 식별하기 위한 분류 코드가 int 같은 기본 타입임 |
문제 | 타입 판별이 안됨 |
해법 | 분류 코드를 나타내는 새로운 클래스 작성 |
결과 | o 분류 코드의 타입 판별이 가능해짐 x 클래스 개수가 늘어남 |
2. 예제 프로그램
클래스명 | 역할 |
Item | 상품(책, DVD, 소프트웨어)을 나타내는 클래스 |
ItemType | 분류 코드를 나타내는 클래스(리팩토링으로 새로 작성) |
Main | Item 사용법 예제 클래스 |
1) 리팩토링 전
public class Item {
public static final int TYPECODE_BOOK = 0;
public static final int TYPECODE_DVD = 1;
public static final int TYPECODE_SOFTWARE = 2;
private final int _typecode;
private final String _title;
private final int _price;
public Item(int typecode, String title, int price) {
_typecode = typecode;
_title = title;
_price = price;
}
public int getTypecode() { return _typecode; }
public String getTitle() { return _title; }
public int getPrice() { return _price; }
public String toString() {
return "[ "
+ getTypecode() + ", "
+ getTitle() + ", "
+ getPrice() + " ]";
}
// ...
}
public class Main {
public static void main(String[] args) {
Item book = new Item(
Item.TYPECODE_BOOK,
"세계 역사",
4800);
Item dvd = new Item(
Item.TYPECODE_DVD,
"뉴욕의 꿈 특별판",
3000);
Item soft = new Item(
Item.TYPECODE_SOFTWARE,
"튜링 머신 에뮬레이터",
3200);
System.out.println("book = " + book.toString());
System.out.println("dvd = " + dvd.toString());
System.out.println("soft = " + soft.toString());
}
}
2) 기본 타입을 사용한 분류 코드의 문제점
① 이상한 값이 될 수있다.
② 다른 분류 코드와 혼동할 수 있다.
3) 리팩토링 실행
① 새로운 클래스를 작성해 기존 인터페이스(API)사용
⑴ 분류 코드를 나타내는 새로운 클래스 작성
⑵ 기본 타입을 분류 코드로 사용하는 클래스가 새로운 클래스를 사용하도록 변경
⑶ 컴파일해서 테스트
② 새로운 인터페이스로 변환
⑴ 기본 타입을 사용하지 않는 새로운 인터페이스 작성
⑵ 기본 타입을 사용한 기존 인터페이스를 새로운 인터페이스로 치환
⑶ 치환할 때마다 컴파일해서 테스트
③ 기존 인터페이스 삭제
⑴ 기존 인터페이스를 사용하는 클래스가 없어지면 기존 인터페이스 삭제
⑵ 컴파일해서 테스트
4) 리팩토링 후
public class ItemType {
public static final ItemType BOOK = new ItemType(0);
public static final ItemType DVD = new ItemType(1);
public static final ItemType SOFTWARE = new ItemType(2);
private final int _typecode;
private ItemType(int typecode) {
_typecode = typecode;
}
public int getTypecode() { return _typecode; }
}
public class Item {
private final ItemType _itemtype;
private final String _title;
private final int _price;
public Item(ItemType itemtype, String title, int price) {
_itemtype = itemtype;
_title = title;
_price = price;
}
public String getTitle() { return _title; }
public int getPrice() { return _price; }
public String toString() {
return "[ "
+ _itemtype.getTypecode() + ", "
+ getTitle() + ", "
+ getPrice() + " ]";
}
// ...
}
public class Main {
public static void main(String[] args) {
Item book = new Item(
ItemType.BOOK,
"세계 역사",
4800);
Item dvd = new Item(
ItemType.DVD,
"뉴욕의 꿈 특별판",
3000);
Item soft = new Item(
ItemType.SOFTWARE,
"튜링 머신 에뮬레이터",
3200);
System.out.println("book = " + book.toString());
System.out.println("dvd = " + dvd.toString());
System.out.println("soft = " + soft.toString());
}
}
3. 한 걸음 더 나아가기
1) 기본 타입을 사용한 분류 코드의 문제점
- 분류코드를 클래스로 치환하여 문제점을 해결할 수 있다.
2) enum
- enum을 이용하여 간단히 타입 세이프 상수를 사용할 수 있다.
public enum ItemType {
BOOK(0),
DVD(1),
SOFTWARE(2);
private final int _typecode;
private ItemType(int typecode) {
_typecode = typecode;
}
public int getTypecode() { return _typecode; }
}
728x90
'Major > Java' 카테고리의 다른 글
[자바로 배우는 리팩토링 입문] 9장 분류 코드를 상태/전략 패턴 치환 (0) | 2022.06.08 |
---|---|
[자바로 배우는 리팩토링 입문] 8장 분류 코드를 하위 클래스로 치환 (0) | 2022.06.07 |
[자바로 배우는 리팩토링 입문] 6장 클래스 추출 (0) | 2022.06.02 |
[자바로 배우는 리팩토링 입문] 5장 메서드 추출 (0) | 2022.06.01 |
[자바로 배우는 리팩토링 입문] 4장 널 객체 도입 (0) | 2022.04.15 |