Python을 사용하다 보면 반복되는 값이나 의미 있는 고정 값들을 다루게 된다. 이때 Enum
을 사용하면 코드의 가독성, 안정성, 그리고 유지보수성을 크게 향상시킬 수 있다. 이 글에서는 Python 공식 문서를 바탕으로 Enum
의 기본 개념부터 고급 기능, 그리고 실무에서 어떻게 활용할 수 있는지까지 정리해 보았다.
목차
Enum이란?
Enum
은 Enumeration(열거형)의 줄임말로, 이름이 붙은 상수들의 집합이다. 예를 들어 요일이나 상태값처럼 제한된 선택지를 다룰 때 사용하면 좋다.
from enum import Enum
class Weekday(Enum):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
왜 Enum을 사용할까?
- ✅ 의미 있는 이름으로 값을 표현할 수 있음 (
1
→Weekday.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
, int
와 Enum
을 함께 상속해 혼합형 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.RED
→True
'Python > 문법' 카테고리의 다른 글
[Python] dataclass (0) | 2025.01.27 |
---|---|
[Python] Module과 Package (0) | 2025.01.18 |
[Python] import 문 사용 팁 (0) | 2025.01.13 |
[Python] Module import로 이해하는 Namespace와 Scope (1) | 2025.01.09 |
[Python] Unpacking의 다양한 예시 (2) | 2024.12.27 |