열거

열거형 에서 C++

1개의 연습 문제

열거형 소개

열거형

지금까지는 주로 숫자와 문자열을 다뤄 왔어요. 실제 세계를 모델링하려면 변수가 가질 수 있는 값을 몇 가지로 제한하고 싶을 때가 있어요. 서로 다른 이름을 가진 몇 가지 값만 담는 전용 타입이 필요할 수도 있어요. 예를 들어 스케이트보드 공장에서는 데크 소재를 단풍나무, 대나무, 플라스틱 중에서만 고르도록 할 수 있어요.

정수로 그 값들을 인코딩할 수도 있지만, 그러려면 시스템에서 소재에 대해 잘못된 값이 들어오지 않는지 확인하는 추가 코드를 써야 해요. 이런 매직 넘버의 의미는 소스 코드를 따라가며 파악하기 어렵고, 서로 뒤섞이기 쉬워요. enumerations를 사용하면 표현력 있는 코드를 장려하고, 의도하지 않은 비교 실수를 막을 수 있어요.

사용 예시

이런 종류의 열거형을 가리키는 구체적인 용어는 scoped enumeration이에요. 아래 코드 조각은 DeckMaterial enumeration을 작성하는 방법을 보여줘요. 정의 끝에 붙는 enum class 키워드와 ;를 눈여겨봐요:

enum class DeckMaterial {
    maple,
    bamboo,
    plastic
};

이제 스케이트 숍의 가격 책정 함수를 보고, enumeration의 enumerator를 지정하는 범위 지정 연산자(::)에 주목해 봐요:

double deck_price(double base_price, DeckMaterial material) {
    if(material == DeckMaterial::plastic) {
        return base_price * 0.9;
    }
    return base_price * 1.3;
}

스코프

바퀴 소재를 위한 두 번째 enumeration이 있다고 상상해 봐요:

enum class WheelMaterial {
    steel,
    clay,
    plastic
};

바퀴와 데크 둘 다 _플라스틱_으로 만들 수 있지만, 이 둘을 혼동할 수는 없어요. 이 둘은 서로 다른 _타입_이거든요. DeckMaterial의 플라스틱과 WheelMaterial의 플라스틱이에요. 각 enumeration은 자신의 enumerators를 자기만의 스코프, 곧 자기만의 namespace 안에 두게 돼요. 그래서 이들을 scoped enumerations라고 불러요.

Advanced

범위 없는 열거형

scoped라는 이름이라면 unscoped 열거형도 있겠구나 하고 생각할 수 있는데, 맞아요. Unscoped enumerations는 모두 같은 전역 namespace를 공유하기 때문에 점점 덜 쓰이고 있어요. 이렇게 공유하기 때문에 위 예시의 _플라스틱_처럼 같은 enumerators를 가진 unscoped enumerations 두 개를 만들 수는 없어요.

또한 unscoped enumerations는 암묵적으로 정수로 변환돼요. 놀라운 결과를 보여 주는 아래 예시를 봐요:

enum CitrusFruits {
    lemons,  // 0
    oranges, //1
};

enum IceCream {
    walnut,  // 0
    apples,  // 1
};

bool comparison{apples == oranges};
// => true

// Example from above:
bool comparison{DeckMaterial::plastic == WheelMaterial::plastic};
// => Does not compile!

scoped enumerations를 정수로 변환하고 싶다면 static_cast<int>를 사용하면 돼요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

열거형 배우기

연습이 잠겨 있어요

열거형 개념을 연습하려면 연습 문제 1개를 더 잠금 해제해요