상세 컨텐츠

본문 제목

분류 코드를 클래스로 치환( Replace Type Code with Class) 리팩토링

자바강좌/리팩토링

by somiyuralove 2020. 1. 28. 22:36

본문

* 분류 코드를 클래스로 치환( Replace Type Code with Class) 리팩토링

- 객체를 식별하기 위한 분류코드가 int 같은 기본 타입이면 타입 판별이 안되는 문제가 생김
  이 문제를 해결하기 위해서 분류코드를 나타내는 새로운 클래스를 작성하는데 이것을 분류 코드를 클래스로 치환 리팩토링이라고 함.
 
* 순서

1) 우선 int를 사용하는 기존 인터페이스(API)를 사용함.

2) 그후 int를 사용하지 않는 새로운 인터페이스(API)로 변경함.

3) 마지막으로 기존 인터페이스(API)를 삭제함.

* 리팩토링 전 코드

package ReplaceTypeCodeWithClass;

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() + " ]";
}

}


package ReplaceTypeCodeWithClass;

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());

}
}

위의 코드에서 기본타입을 사용한 분류 코드에 대한 문제점에 대해서 알아봅시다.

이상한 값이 될 수도 있는데, Item.TYPECODE_BOOK처럼 기호 상수를 사용했다고 하더라도 컴파일러는
이를 0이라는 int값으로 판담함.
그러므로, 프로그래머는 분류 코드로 아무값이나 넘길 수 있음.
new Item(12345,...)와 같이 12345가 잘못된 분류코드라는 사실을 컴파일 단계가 아닌 실행단계에서 판단함.

다른 분류 코드와 혼동할 수 있음.

분류 코드를 클래스로 치환을 하면 이런 잘못을 컴파일할 때 검출할 수 있음.

* 리팩토링 후 코드

package ReplaceTypeCodeWithClass;

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;

public ItemType(int typecode) {
_typecode = typecode;
}

public int getTypecode() {
return _typecode;
}
}

package ReplaceTypeCodeWithClass;

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 ItemType _itemtype;
private final String _title;
private final int _price;

public Item(ItemType itemtype, String title, int price) {
// _typecode = typecode;
_itemtype = itemtype;
_title = title;
_price = price;
}

// public int getTypecode() {
// return _typecode;
// }

public String getTitle() {
return _title;
}

public int getPrice() {
return _price;
}

public String toString() {
return "[ "
+ _itemtype.getTypecode() + ", "
+ getTitle() + ", "
+ getPrice() + " ]";
}

}

package ReplaceTypeCodeWithClass;

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());

}
}

관련글 더보기

댓글 영역