반응형

Python을 사용하다 보면 반복되는 값이나 의미 있는 고정 값들을 다루게 된다. 이때 Enum을 사용하면 코드의 가독성, 안정성, 그리고 유지보수성을 크게 향상시킬 수 있다. 이 글에서는 Python 공식 문서를 바탕으로 Enum의 기본 개념부터 고급 기능, 그리고 실무에서 어떻게 활용할 수 있는지까지 정리해 보았다.



Enum이란?

EnumEnumeration(열거형)의 줄임말로, 이름이 붙은 상수들의 집합이다. 예를 들어 요일이나 상태값처럼 제한된 선택지를 다룰 때 사용하면 좋다.

from enum import Enum

class Weekday(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3

왜 Enum을 사용할까?

  • 의미 있는 이름으로 값을 표현할 수 있음 (1Weekday.MONDAY)
  • 잘못된 값 사용 방지 (Weekday("FRIDAY") 같은 잘못된 값 차단)
  • 자동완성, 타입 안정성, 가독성 향상

기본 사용법

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

print(Color.RED.name)   # 'RED'
print(Color.RED.value)  # 1
  • Enum.name: 이름 (RED)
  • Enum.value: 값 (1)

다중 상속 (str, int)

파이썬에서는 str, intEnum을 함께 상속해 혼합형 Enum(Mixin Enum)을 만들 수 있다.

class Status(str, Enum):
    PENDING = "pending"
    DONE = "done"

이렇게 하면 Status.PENDING == "pending"처럼 문자열 비교가 가능해져 웹 API에서 매우 유용하게 사용된다.

실무 활용 예: FastAPI

@app.get("/tasks/")
def get_tasks(status: Status):
    return {"status": status}
  • /tasks/?status=pending 요청에서 "pending"이 자동으로 Enum으로 매핑된다.
  • 직렬화 시 status: "pending"처럼 자연스럽게 문자열로 반환된다.

고급 기능들

1. auto() – 값 자동 부여

from enum import Enum, auto

class State(Enum):
    START = auto()
    PROCESSING = auto()
    END = auto()

값을 일일이 지정하지 않아도 순차적으로 자동 할당된다 (1, 2, 3, ...).


2. IntEnum, StrEnum

from enum import IntEnum

class Level(IntEnum):
    LOW = 1
    MEDIUM = 2
    HIGH = 3
  • IntEnum은 숫자처럼 정렬, 덧셈 등이 가능
  • StrEnum은 Python 3.11부터 도입된 문자열 Enum

3. Flag / IntFlag – 비트 연산 가능 Enum

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()
perm = Permission.READ | Permission.WRITE
print(Permission.READ in perm)  # True

여러 값을 동시에 지정해야 할 때 유용 (예: 권한 조합)


4. 사용자 정의 메서드

class Mood(Enum):
    HAPPY = 1
    SAD = 2

    def emoji(self):
        return "😊" if self == Mood.HAPPY else "😢"

Enum 멤버에 직접 로직을 넣어 동작 정의 가능


5. 커스텀 속성 추가

class Country(Enum):
    KOREA = ("KR", "대한민국")
    JAPAN = ("JP", "일본")

    def __init__(self, code, label):
        self.code = code
        self.label = label
print(Country.KOREA.code)   # KR
print(Country.KOREA.label)  # 대한민국

코드값, 한글명, 설명 등 다양한 정보를 함께 저장 가능


6. 역방향 조회 (name, value)

print(Color["RED"])     # Color.RED
print(Color(1))         # Color.RED

Enum을 이름이나 값으로도 조회할 수 있음
JSON 역직렬화에 유용


📌 요약 테이블

기능 설명 실무 활용
auto() 값 자동 부여 반복 최소화
IntEnum, StrEnum 정수/문자열처럼 동작 숫자 비교, API 직렬화
Flag 비트 연산 지원 권한/설정 조합
커스텀 메서드 .emoji() 등 동작 정의 캡슐화된 로직
속성 추가 코드, 라벨 등 정의 다국어/선택지 표현
역방향 접근 이름/값으로 조회 직렬화 역변환

✨ 마무리

Python의 Enum은 단순히 고정된 값을 관리하는 것 이상의 기능을 제공한다.
특히 웹 개발, API 설계, 데이터 직렬화, 권한 제어, UI 표시 등에 있어 매우 강력하고 유용하다.
처음에는 생소할 수 있지만, 익숙해지면 더 안전하고 깔끔한 코드를 작성하실 수 있다.


🎁 보너스 팁

  • Enum은 불변(immutable)이다. 값을 변경하려 하면 에러가 난다.
  • Enum 멤버는 싱글턴(singleton)이므로 is 비교도 가능하다:
    Color.RED is Color.REDTrue
반응형

'Python > 문법' 카테고리의 다른 글

[Python] 비동기(async) 프로그래밍 2  (0) 2025.05.22
[Python] 비동기(async) 프로그래밍 1  (0) 2025.05.22
[Python] dataclass  (0) 2025.01.27
[Python] Module과 Package  (0) 2025.01.18
[Python] import 문 사용 팁  (0) 2025.01.13

+ Recent posts