안녕하세요. enum은 보통 상수값을 선언하고, 제약하기 위해서 많이 쓰게 됩니다. 이번 시간에는 그 중에, valie 값으로 대응되는 enum member를 얻어오는 방법과 name to enum을 하는 방법을 알아보겠습니다. 상당히 많이 쓰일 듯 하니 알아두면 좋을 듯 합니다.

 


 그 전에 몇 가지 용어를 알아볼 거에요.

 

 enum은 name과 value가 있어요. 5번째 줄을 보겠습니다. RED = "red"라고 되어 있어요. 여기서 우리는 RED를 name이라고 합니다. 그리고, 이 이름에 대응되는 값 "red"를 값이라 불러요.

 

 8 ~ 9번째 줄은 Color.Red의 이름과 Color.Red의 value를 출력합니다.

 

 각각 RED와 red가 출력되게 됩니다. 이 둘을 묶어놓은 것을 member라고 합니다. 즉, enum에서 member는 name과 value를 가지고 있다고 볼 수 있어요. 여기까지 정리해 봅시다.

 

 

어렵지 않지요?

 


 이제 이 내용을 바탕으로 value를 enum member로 바꾸는 방법을 알아봅시다.

 

 먼저 enum member는 3개가 있어요. RED, BLUE, ORANGE입니다. 

 

 

 먼저 value를 기준으로 값을 얻어오는 방법은 아래와 같이 불러오는 것입니다.

 

 Color("red"). enum 클래스가 E라고 한다면, E(value)로 불러오면 됩니다. 그러면 value에 대응되는 member가 나오게 됩니다.

 

 위 프로그램의 실행 결과는 Color.RED가 나옵니다. 이건 어떤 메소드를 호출할까요?

 

 디버그를 쭉 따라가다 보면, enum.py의 __call__을 호출함을 볼 수 있습니다. 계속 따라 들어가면 __new__를 호출하게 됩니다.

 

 cls._value2member_map_이라는 딕셔너리에서 값을 얻어오는데요. 이를 통해, value를 키 값으로, member를 value 값으로 하는 딕셔너리가 있어서, enum의 값이 매우 많아도 효율적으로 작동할 거라는 추측을 할 수 있습니다.

 

 


 이제, name으로 member를 부르고 싶습니다. 이 때에는 어떻게 하면 될까요?

 

 

enum 클래스가 E라고 한다면, E["name"] 이렇게 부르면 됩니다. 위 예제는 Color["RED"]로 member를 호출하였는데요. 이러면, enum Color에서, 이름이 "RED"인 멤버를 부르게 됩니다.

 

 

 내부적으로 __getitem__을 부르게 되고, _member_map_이라는 딕셔너리에서 값을 얻어오게 되므로, 이 역시 효율적인 연산이 됩니다.