C
Python/객체지향/Lesson 19

@dataclass — 보일러플레이트 자동 (PEP 557)

15분·theory
이 챕터
3/3

@dataclass — 보일러플레이트 자동 (PEP 557)

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ @dataclass + frozen=True + slots=True 옵션
  • ✅ vs Pydantic BaseModel · NamedTuple 비교
  • ✅ field(default_factory=list) 의 mutable default 해결

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

@dataclass — 코드 + 실행 결과

@dataclass = __init__·__repr__·__eq__ 자동 생성. 데이터 담는 클래스 보일러플레이트 0.


1. 일반 class vs @dataclass

python
# ❌ 옛날 방식 — 보일러플레이트
class 사람:
    def __init__(self, 이름, 나이):
        self.이름 = 이름
        self.나이 = 나이

    def __repr__(self):
        return f"사람(이름={self.이름!r}, 나이={self.나이!r})"

    def __eq__(self, other):
        return (self.이름, self.나이) == (other.이름, other.나이)
python
# ✅ @dataclass — 위 4개 메서드 자동 생성
from dataclasses import dataclass

@dataclass
class 사람:
    이름: str
    나이: int

a = 사람("홍길동", 28)
print(a)                 # 사람(이름='홍길동', 나이=28)  ← __repr__ 자동
print(a == 사람("홍길동", 28))    # True ← __eq__ 자동

2. 기본값

python
@dataclass
class 사람:
    이름: str
    나이: int = 0          # 기본값
    취미: list = None       # ⚠️ list 기본값은 함정

a = 사람("홍길동")
print(a)                 # 사람(이름='홍길동', 나이=0, 취미=None)

3. 변경 불가능 (frozen)

python
@dataclass(frozen=True)         # 변경 X
class 좌표:
    x: float
    y: float

p = 좌표(1.0, 2.0)
# p.x = 5.0    # FrozenInstanceError
print(hash(p))                  # 해시 가능 → set·dict key 사용 OK

4. 비교 가능

python
@dataclass(order=True)          # < <= > >= 자동
class 점수:
    값: int

a = 점수(85)
b = 점수(92)
print(a < b)                    # True
print(sorted([b, a]))           # [점수(값=85), 점수(값=92)]

5. mutable 기본값은 field 사용

python
from dataclasses import dataclass, field

@dataclass
class 학생:
    이름: str
    점수들: list = field(default_factory=list)    # 안전한 빈 list

a = 학생("홍길동")
a.점수들.append(85)
print(a)                # 학생(이름='홍길동', 점수들=[85])

한 줄 요약

데이터만 담는 class = 무조건 @dataclass. PEP 557 (3.7+).

🐍 실행해보기 — dataclass — 직접 실행

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 dict 기반 자료구조를 dataclass 로 바꿔줘"
  • "이 클래스에 __repr__ · __eq__ 적절히 추가해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 상속
다음 추천: 타입 힌팅
@dataclass — 보일러플레이트 자동 (PEP 557) - Python