[Refactoring] 6. 타입 코드
- 컴퓨터공학과/그외
- 2015. 11. 18.
타입 코드(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 타입코드를 넣어도 문제없이 객체가 생성됩니다.
이것은 타입 코드의 맹점인데요 ,
컴파일 에러도, 런타임 에러도 아니고 버그입니다.
월화수목금금금을 하게 만드는....
잘못된 코딩이라면 에러를 나게 해야 개발자들은 빨리~ 고치고 집에 갈수 있게 되겠져!
에러를 생성합시다!
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
혹시나 잘못된 부분 있으면 말해주세요!
"남을 위한" 것이니 (한달 후에는 나도 남이지요. 내가 코드를 왜이렇게 짜놓은건지;;)
리팩토링 열심히 해요
'컴퓨터공학과 > 그외' 카테고리의 다른 글
검색엔진 서버 - 아파치 솔라·루씬·넛치 알아보기(인덱서, 서처, 크롤러 특장점/기능/검색방법) (0) | 2020.04.22 |
---|---|
IEEE Citation Reference. 참고문헌 표기법. (0) | 2020.03.15 |
[Refactoring] 5. 널 객체 (0) | 2015.11.18 |
[Refactoring] 4. 상속 (0) | 2015.11.18 |
[Refactoring] 3. 캐스팅 (0) | 2015.11.18 |