본문 바로가기

JAVA

[리팩토링] 분류코드를 클래스로 치환

반응형

 

분류코드를 int 같은 기본타입이라면 두가지 이유로 문제가 생긴다.

첫 번째로 분류 코드 범위 밖의 값이 사용되는 것이고 두번째로는 다른 분류 코드와 착각할 수 가 있ㄷ는 것이다.

타입이 판별되지 않거나 타입 세이프가 아닌 문제가 생긴다.

그런 문제를 해결하기 위해서 분류 코드를 클래스로 치환하는 리팩토링이 필요하다.

 

방법

1. 새로운 클래스를 작성해 기존 인터페이스(API)에서 사용

2. 새로운 인터페이스로 전환

3. 기존 인터페이스 삭제

 

결과적으로 장점으로는 분류 코드의 타입 판별이 가능해지고 단점으로는 클래스 개수가 늘어나는 것이다.

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

 

Main 클래스

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

 

문제점

1. 이상한 값이 될 수 있다.

아무리 기호 상수를 사용한다고 해도 컴파일러는 이를 int 값으로 판단한다. 따라서 이상한 분류코드를 넣어도 컴파일러가 알 수 없다. 그래서 실행 단계에서 판단 된다.

 

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

보통 한 프로그램에서 여러 분류 코드를 사용한다. 컴파일러는 분류코드가 잘 못 된것을 알지 못한다.

 

리팩토링

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

	public Item(ItemType 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(
			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());
	}
}
반응형

'JAVA' 카테고리의 다른 글

Java의 Future이란  (0) 2021.01.03
일급컬렉션  (0) 2020.07.06
Java의 배열  (0) 2020.05.18
Enum에 대해서  (0) 2020.05.17
Reference 와 Garbage Collection  (0) 2020.03.13