[자바로 배우는 리팩토링 입문] 7장 분류 코드를 클래스로 치환

2022. 6. 4. 14:28·Major/Java
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
'Major/Java' 카테고리의 다른 글
  • [자바로 배우는 리팩토링 입문] 9장 분류 코드를 상태/전략 패턴 치환
  • [자바로 배우는 리팩토링 입문] 8장 분류 코드를 하위 클래스로 치환
  • [자바로 배우는 리팩토링 입문] 6장 클래스 추출
  • [자바로 배우는 리팩토링 입문] 5장 메서드 추출
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    백준
    react
    프로그래머스
    파일처리
    리팩토링
    자료구조
    데브코스
    Algorithm
    C++
    lisp
  • hELLO· Designed By정상우.v4.10.2
BeNI
[자바로 배우는 리팩토링 입문] 7장 분류 코드를 클래스로 치환
상단으로

티스토리툴바