파이썬/클래스와 객체 지향

파이썬/클래스와 객체 지향Python의 dataclass 완벽 가이드: 주요기능 설명

Data Jun 2025. 6. 1. 16:30

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를 좀 더 강력한 도구로 만들어주는 핵심 기능입니다.