1. 기본적인 Enum 사용법

Enum을 사용하면 관련된 상수들을 그룹화할 수 있습니다.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED)       # Color.RED
print(Color.RED.value) # 1
print(Color.RED.name)  # 'RED'

2. 자동 값 할당 (auto)

값을 직접 지정하지 않고 자동으로 할당할 수 있습니다.

from enum import Enum, auto

class Status(Enum):
    # auto()는 자동으로 1부터 시작하는 정수 값을 할당합니다.
    PENDING = auto()
    IN_PROGRESS = auto()
    COMPLETED = auto()

print(Status.PENDING.value)  # 1
print(Status.IN_PROGRESS.value)  # 2
print(Status.COMPLETED.value)  # 3

3. 열거형 순회

Enum은 이터러블(iterable)이라서 루프를 돌면서 접근할 수 있습니다.

for color in Color:
    print(color.name, color.value)

# 출력
RED 1
GREEN 2
BLUE 3

4. 문자열 매핑 (Enum을 딕셔너리처럼 활용)

열거형을 사용하면 문자열을 특정 값으로 쉽게 변환할 수 있습니다.

class Role(Enum):
    ADMIN = "admin"
    USER = "user"
    GUEST = "guest"

role = Role["ADMIN"]  # 문자열 키로 접근
print(role.value)  # "admin"

5. 열거형 비교

Enum 값은 동일성(is)과 동등성(==) 비교가 가능합니다.

if role == Role.ADMIN:
    print("관리자입니다.")  # 출력됨

6. 딕셔너리 키로 사용

Enum 값은 해시 가능하므로 딕셔너리의 키로 사용할 수 있습니다.

permissions = {
    Role.ADMIN: "모든 권한",
    Role.USER: "일반 권한",
    Role.GUEST: "읽기 전용"
}

print(permissions[Role.ADMIN])  # "모든 권한"

7. Mixin을 활용한 커스텀 기능 추가

메서드를 포함하여 더 복잡한 Enum을 만들 수도 있습니다.

class ExtendedEnum(Enum):
    @classmethod
    def list(cls):
        return [item.name for item in cls]

class Animal(ExtendedEnum):
    DOG = 1
    CAT = 2
    BIRD = 3

print(Animal.list())  # ['DOG', 'CAT', 'BIRD']

8. IntEnum을 활용한 숫자 Enum

IntEnum을 사용하면 숫자 기반 Enum을 다른 정수와 함께 사용할 수 있습니다.

from enum import IntEnum

class Priority(IntEnum):
    LOW = 1
    MEDIUM = 2
    HIGH = 3

print(Priority.LOW < Priority.HIGH)  # True
print(Priority.LOW + 1)  # 2

9. 플래그(Flag) Enum을 활용한 비트 연산

비트 플래그를 활용할 때 Flag 또는 IntFlag를 사용할 수 있습니다.

비트 연산을 활용하면 권한 시스템을 만들 때 유용합니다.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

perm = Permission.READ | Permission.WRITE
print(perm)  # Permission.READ|WRITE

# 특정 권한 포함 여부 확인
print(Permission.READ in perm)  # True
print(Permission.EXECUTE in perm)  # False

 

+ Recent posts