[Refactoring] 6. 타입 코드

타입 코드(type code)라는 것은 오브젝트의 종류를 표현하는 값입니다. 


어떤 프로그램이 서적, DVD, 소프트웨어를 다룬다고 가정합니다. 

그리고 이 상품의 종류를 표현하기 위해 

다음과 같이 서적 = 0, DVD = 1, 소프트웨어 = 2라고 int형 값을 할당한다고 하면,

이 때, 1, 2, 3 이라는 값이 타입 코드가 됩니다.





그러나

타입코드가 int와 같은 기본형이면 문제가 생깁니다. 


Item* book2 = new Item(1000, "Jobs", 3000);

Item* software2 = new Item(Payment::TYPECODE_CREDIT, "Word", 3000);

와 같은 코드도 문제 없이 돌아가는데요.


타입 코드의 범위 이외의 값인 1000도, 

item 타입이 아닌 payment 타입코드를 넣어도 문제없이 객체가 생성됩니다.


이것은 타입 코드의 맹점인데요 ,

컴파일 에러도, 런타임 에러도 아니고 버그입니다.

월화수목금금금을 하게 만드는....crying



잘못된 코딩이라면 에러를 나게 해야 개발자들은 빨리~ 고치고 집에 갈수 있게 되겠져!

에러를 생성합시다!


1)  클래스

타입 코드를 클래스로 고쳐봅시다.


9~11 라인의 타입 코드 대신 클래스를 도입합니다.

class ItemType

{

public:

    static const ItemType BOOK;    

    static const ItemType DVD;

    static const ItemType SOFTWARE;

private:

    ItemType(int code) : typecode(code) {} 

    int typecode;

public :

    int get_typecode() const { return typecode; }
};


그리고 Item 클래스에서는 14라인의 typecode int형 대신

const ItemType typecode; 을 사용합니다.

19 라인의 Item 생성자의 첫번째 인자에 역시 ItemType 타입을 사용하구요





이렇게 하면

Item* book2 = new Item(1000, "Jobs", 3000);

Item* software2 = new Item(Payment::TYPECODE_CREDIT, "Word", 3000);


이 두 코드는 ItemType이 아니기 때문에 모두 컴파일 에러가 나게 됩니다.

얼른 집에 갈 수 있겠돠아



그런데 타입을 따로 클래스로 만들어 관리하자니 너무 복잡하네요.


2) enum

열거형 상수, enumeration을 사용하면 됩니다.

enumeration을 통해 미리 정해진 일정한 값을 가진 새로운 자료형을 직접 만들 수 있습니다.


다시 ItemType 클래스를 없애고

Item 클래스에

enum ITEM_TYPE { BOOK = 0, DVD, SOFTWARE };을 추가해줍니다.

int 타입도, ItemType 타입도 아닌 142, 148 라인 모두 ITEM_TYPE 타입을을 사용합니다.





이렇게 enum으로 표현하면

클래스로 치환하지 않아도 간단하게이외에는 컴파일 타임에 에러가 나게 됩니다.


<정리>
기본형을 사용하는 타입 코드는 논리적으로 문제가 생긴다.
타입코드를 클래스로 치환하거나 혹은 enum을 통해 문제 없이 사용하자.






눈물나게도 제가 전할 부분은 여기까지구요. 흑흑

읽어주셔서 감사합니다 :D 

혹시나 잘못된 부분 있으면 말해주세요!


"남을 위한" 것이니 (한달 후에는 나도 남이지요. 내가 코드를 왜이렇게 짜놓은건지;;)

리팩토링 열심히 해요 cool



반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️