Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python enum 모듈 완벽 가이드: 열거형(Enum)의 정의와 활용법

열거형(Enumeration)은 고유하고 변하지 않는 상수 값을 가지는 식별자(멤버)들의 집합입니다. 열거형 내부에서는 멤버들을 동일성(identity) 기준으로 비교할 수 있으며, 열거형 객체는 반복(iteration)도 가능합니다.

Python에서는 표준 라이브러리인 enum 모듈을 통해 열거형을 손쉽게 정의하고 사용할 수 있습니다. 이 글에서는 enum 모듈의 핵심 개념과 실제 사용 예제를 단계별로 살펴보겠습니다.

enum 모듈의 주요 클래스

enum 모듈은 다음과 같은 클래스를 제공합니다.

  • Enum : 열거형 상수를 생성하기 위한 기본 클래스입니다.
  • IntEnum : 열거형 상수를 생성하는 동시에 int의 하위 클래스가 되도록 하는 기본 클래스입니다. 즉, 멤버가 정수처럼 동작합니다.

클래스 문법으로 열거형 정의하기

열거형은 일반적인 클래스 문법을 사용해 만듭니다. Enum을 상속받고, 멤버 이름에 값을 할당하면 됩니다.

# enumexample.py
from enum import Enum

class langs(Enum):
    Python = 1
    Java = 2
    Cpp = 3
    Ruby = 4

멤버의 문자열 표현 확인하기

열거형 멤버는 사람이 읽기 쉬운 문자열 표현(str)과 repr 표현을 모두 제공합니다.

>>> from enumexample import langs
>>> print(langs.Python)
langs.Python
>>> print(repr(langs.Python))
<langs.Python: 1>

name과 value 속성

모든 열거형 멤버는 name(이름)과 value(값)라는 두 가지 속성을 가집니다.

>>> x = langs.Python
>>> x.name
'Python'
>>> x.value
1

반복문으로 전체 멤버 순회하기

열거형은 반복 가능한(iterable) 객체이므로, for 루프를 사용해 모든 멤버를 순회할 수 있습니다.

>>> for lang in langs:
...     print(lang.name, lang.value)
Python 1
Java 2
Cpp 3
Ruby 4

값 또는 이름으로 멤버 접근하기

멤버는 값(value)을 호출 인자로 넘기거나, 대괄호 안에 이름을 넣어 접근할 수 있습니다.

>>> langs(3)
<langs.Cpp: 3>
>>> langs['Java']
<langs.Java: 2>

is 연산자로 멤버 비교하기

열거형 멤버끼리는 동일성 연산자인 is, is not으로 비교할 수 있습니다.

>>> x = langs(2)
>>> y = langs(4)
>>> x is y
False

같은 값을 가지는 멤버와 별칭(Alias)

열거형에서 두 멤버가 같은 이름을 가지는 것은 허용되지 않습니다. 하지만 서로 다른 이름이 같은 값을 가지는 것은 허용되며, 이때 나중에 정의된 이름은 앞선 멤버의 별칭(alias) 역할을 합니다.

다음과 같이 코드를 수정해 보겠습니다.

from enum import Enum

class langs(Enum):
    Python = 1
    Java = 2
    Cpp = 3
    Ruby = 4
    Cplusplus = 3
>>> from enumexample import langs
>>> langs.Cpp
<langs.Cpp: 3>
>>> langs.Cplusplus
<langs.Cpp: 3>
>>> langs(3)
<langs.Cpp: 3>

Cplusplus는 값 3을 공유하므로 Cpp의 별칭으로 취급되어, 조회 시 항상 먼저 정의된 Cpp 멤버가 반환됩니다.

@enum.unique로 값 중복 방지하기

기본적으로 열거형은 같은 값에 대해 여러 이름(별칭)을 허용합니다. 만약 모든 멤버의 값이 반드시 고유해야 한다면, 열거형 전용 클래스 데코레이터인 @enum.unique를 사용하세요. 중복된 값이 존재하면 ValueError가 발생하여 오류를 조기에 잡아낼 수 있습니다.

from enum import Enum, unique

@unique
class langs(Enum):
    Python = 1
    Java = 2
    Cpp = 3
    Ruby = 4
    # Cplusplus = 3  # ValueError 발생!