frozen, order, field는 dataclass를 사용할 때 매우 유용한 고급 옵션입니다. 각각을 실생활에서 자주 접할 수 있는 예시를 들어 좀 더 구체적이고 직관적으로 설명해드릴게요.
frozen=True: 객체를 불변(immutable) 하게 만들기
✅ 개념
- frozen=True를 설정하면 객체가 생성된 후 값을 수정할 수 없습니다.
- 마치 tuple처럼 읽기 전용 객체를 만들고 싶을 때 사용합니다.
예시: 주민등록 정보
from dataclasses import dataclass
@dataclass(frozen=True)
class Citizen:
name: str
ssn: str # 주민등록번호
person = Citizen(name="김지효", ssn="900101-1234567")
print(person.name) # 김지효
person.name = "박지민" # ❌ 오류: Cannot assign to field
실명/주민번호 같은 값은 수정되면 안 되므로, frozen=True로 안전하게 관리할 수 있습니다
order=True: 비교 연산자 자동 생성
✅ 개념
- order=True를 지정하면 >, <, >=, <= 비교 연산자를 자동으로 지원합니다.
- 클래스 필드의 선언 순서에 따라 비교가 이루어집니다.\
예시: 고객 우선 순위 정렬
from dataclasses import dataclass
@dataclass(order=True)
class Customer:
priority: int
name: str
c1 = Customer(priority=2, name="Alice")
c2 = Customer(priority=1, name="Bob")
print(c1 > c2) # True: Alice의 우선순위(2)가 Bob(1)보다 낮음 → 높은 숫자일수록 낮은 우선순위
우선순위 큐 같은 곳에서 객체 정렬이 자동으로 되는 점이 아주 편리합니다.
field(): 세부적인 필드 제어 기능
✅ 개념
- field()는 각 필드의 기본값, 출력 여부, 초기화 포함 여부 등을 설정할 수 있게 해줍니다.
- 자주 쓰는 매개변수는 default, default_factory, repr, init, compare 등입니다.
예시 1: repr=False – 출력 제외하기
from dataclasses import dataclass, field
@dataclass
class Account:
username: str
password: str = field(repr=False)
acc = Account(username="jhkim", password="1234")
print(acc) # Account(username='jhkim') — password는 숨김
💡 민감한 정보는 출력에서 **숨기기 위해 repr=False**를 사용합니다.
예시 2: default_factory – 리스트, 딕셔너리 등 가변 객체 기본값 설정
from dataclasses import dataclass, field
@dataclass
class ShoppingCart:
items: list = field(default_factory=list)
cart = ShoppingCart()
cart.items.append("apple")
print(cart.items) # ['apple']
💡 list, dict 같은 가변 타입은 default=[]로 쓰면 문제가 생길 수 있어서 반드시 default_factory를 사용해야 합니다.
예시 3: init=False – 생성자에서 제외
from dataclasses import dataclass, field
@dataclass
class Log:
event: str
timestamp: str = field(init=False)
log = Log(event="login")
log.timestamp = "2025-06-01 10:00" # 생성자에서는 제외하고 나중에 설정
💡 init=False는 외부에서 생성 시 전달받지 않고, 나중에 계산되거나 설정될 값을 위한 용도입니다.
요약 정리표
이 세 가지는 dataclass를 좀 더 강력한 도구로 만들어주는 핵심 기능입니다.
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
Python 생성자 함수: 가변 객체 사용 (0) | 2025.06.01 |
---|---|
Python 생성자 함수 __init__의 권장 사용법 (0) | 2025.06.01 |
Python의 dataclass 완벽 가이드: 깔끔하고 간결한 데이터 구조 만들기 (0) | 2025.06.01 |
[객체 지향 프로그래밍 4개의 기둥] 상속화 (0) | 2025.03.20 |
[객체 지향 프로그래밍 4개의 기둥] 추상화와 파이썬 타입 힌팅 예제 (0) | 2025.03.20 |