본문 바로가기
java/java 리팩토링

04. 분류 코드를 클래스로 만들기

by 문자메일 2023. 2. 8.

분류 코드를 사용할 때의 문제점

  • 기본 타입 분류 코드 : 객체의 종류를 특정 값으로 나타낸다
  • BOOK:0, TOY:1, BREAD:2, APPLE:3 등
  • 실수로 정의 하지 않은 값이 들어갈 수 있음
  • 다른 그룹의 분류 코드와 혼란 일으킬 가능성 존재
  • 컴파일시에 정의되지 않은 코드 넣어도 에러 발생하지 않음.
  • 아래는 안 좋은 예시
public static final int BOOK = 0;
public static final int FOOD = 1;
public static final int TOY = 2;

new Category(100); // 문제 부분, 100 값은 정의되어 있지 않아서 오류지만 컴파일 에러 없음

 

리팩토링 순서

- 분류 코드를 클래스로 치환하기

  1. 새로운 분류 코드 클래스를 작성하여 기존 코드에서 사용
  2. 새로운 분류 코드 클래스에 새로운 메서드를 추가하고, 이를 기존 코드에 적용
  3. 기존 코드에서 사용하지 않는 메서드 등은 삭제

 

 

AS-IS

package typecodewithclass.before;

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 int typeCode;
	private String title;
	private int price;
	
	public Item(int typeCode, String title, int price) {
		this.typeCode = typeCode;
		this.title = title;
		this.price = price;
	}
	
	public int getTypeCode() {
		return typeCode;
	}

	public String getTitle() {
		return title;
	}

	public int getPrice() {
		return price;
	}
	
	public String toString() {
		return getTypeCode() + "," + title + "," + price;
	}

}

 

package typecodewithclass.before;

public class Main {

	public static void main(String[] args) {
		Item bookItem = new Item(Item.TYPECODE_BOOK, "토지", 10000);
		Item dvdItem = new Item(Item.TYPECODE_DVD, "바람과 함께 사라지다", 20000);
		Item softwareItem = new Item(Item.TYPECODE_SOFTWARE, "Window", 30000);

		System.out.println(bookItem);
		System.out.println(dvdItem);
		System.out.println(softwareItem);
	}

}

 

TO-BE

1단계 : 새로운 분류 코드 클래스를 작성하여 기존 코드에서 사용

package typecodewithclass.after;

public class Item {
	public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
	public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
	public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
	
	private int typeCode;
	private String title;
	private int price;
	
	public Item(int typeCode, String title, int price) {
		this.typeCode = typeCode;
		this.title = title;
		this.price = price;
	}
	
	public int getTypeCode() {
		return typeCode;
	}

	public String getTitle() {
		return title;
	}

	public int getPrice() {
		return price;
	}
	
	public String toString() {
		return getTypeCode() + "," + title + "," + price;
	}

}

 

package typecodewithclass.after;

public class ItemType {
	private int typeCode;
	
	public static final ItemType BOOK = new ItemType(0);
	public static final ItemType DVD = new ItemType(1);
	public static final ItemType SOFTWARE = new ItemType(2);
	
	public ItemType(int typeCode) {
		this.typeCode = typeCode;
	}
	
	public int getTypeCode() {
		return typeCode;
	}
	
	public ItemType getItemType(int typeCode) {
		switch(typeCode) {
		case 0: return BOOK;
		case 1: return DVD;
		case 2: return SOFTWARE;
		default: return null; 
		}
	}
}

 

package typecodewithclass.after;

public class Main {

	public static void main(String[] args) {
		Item bookItem = new Item(Item.TYPECODE_BOOK, "토지", 10000);
		Item dvdItem = new Item(Item.TYPECODE_DVD, "바람과 함께 사라지다", 20000);
		Item softwareItem = new Item(Item.TYPECODE_SOFTWARE, "Window", 30000);

		System.out.println(bookItem);
		System.out.println(dvdItem);
		System.out.println(softwareItem);
	}

}

 

 

2단계 : 새로운 분류 코드 클래스에 새로운 메서드를 추가하고, 이를 기존 코드에 적용

 

package typecodewithclass.after;

public class Item {
	public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
	public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
	public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
	
	//private int typeCode;
	private ItemType itemType;
	private String title;
	private int price;
	
	public Item(ItemType typeCode, String title, int price) {
		//this.typeCode = typeCode;
		this.itemType = typeCode;
		this.title = title;
		this.price = price;
	}

	public String getTitle() {
		return title;
	}

	public int getPrice() {
		return price;
	}
	
	public String toString() {
		return itemType.getTypeCode() + "," + title + "," + price;
	}

}

 

package typecodewithclass.after;

public class Main {

	public static void main(String[] args) {
		Item bookItem = new Item(ItemType.BOOK, "토지", 10000);
		Item dvdItem = new Item(ItemType.DVD, "바람과 함께 사라지다", 20000);
		Item softwareItem = new Item(ItemType.SOFTWARE, "Window", 30000);

		System.out.println(bookItem);
		System.out.println(dvdItem);
		System.out.println(softwareItem);
	}

}

 

3단계 : 기존 코드에서 사용하지 않는 메서드 등은 삭제

package typecodewithclass.after;

public class Item {
	public static final int TYPECODE_BOOK = ItemType.BOOK.getTypeCode();
	public static final int TYPECODE_DVD = ItemType.DVD.getTypeCode();
	public static final int TYPECODE_SOFTWARE = ItemType.SOFTWARE.getTypeCode();
	
	private ItemType itemType;
	private String title;
	private int price;
	
	public Item(ItemType typeCode, String title, int price) {
		this.itemType = typeCode;
		this.title = title;
		this.price = price;
	}

	public String getTitle() {
		return title;
	}

	public int getPrice() {
		return price;
	}
	
	public String toString() {
		return itemType.getTypeCode() + "," + title + "," + price;
	}

}

 

package typecodewithclass.after;

public class ItemType {
	private int typeCode;
	
	public static final ItemType BOOK = new ItemType(0);
	public static final ItemType DVD = new ItemType(1);
	public static final ItemType SOFTWARE = new ItemType(2);
	
	public ItemType(int typeCode) {
		this.typeCode = typeCode;
	}
	
	public int getTypeCode() {
		return typeCode;
	}
}

댓글