본문으로 건너뛰기
Python 기초집LESSON 18

dataclass와 타입 힌트

난이도입문
예상 시간30분
선수지식이전 강의

18강. dataclass와 타입 힌트

1. 이번 강의에서 해결할 문제​

데이터 중심 클래스에 반복적인 초기화와 표현 코드를 작성하면 핵심 검증이 묻힙니다. dataclass가 보일러플레이트를 만들게 하고 타입 계약을 명시합니다.

2. 학습 목표​

3. 핵심 개념​

dataclass는 주석으로 선언한 필드를 바탕으로 __init__, __repr__, 비교 메서드를 생성합니다. 타입 힌트는 문서·편집기·점검 도구를 돕지만 Python이 자동으로 타입을 강제하지는 않습니다.

4. 단계별 코드 예시​

파일 경로: C:\dev\game-log-analyzer\battle_analyzer\models.py

battle_analyzer/models.py
from dataclasses import dataclass
from typing import Literal

BattleResult = Literal["win", "loss"]


@dataclass(frozen=True, slots=True)
class BattleRecord:
player: str
monster: str
skill: str
damage: int
result: BattleResult

def __post_init__(self) -> None:
if self.damage < 0:
raise ValueError("피해량은 0 이상이어야 합니다.")


def total_damage(records: list[BattleRecord]) -> int:
return sum(record.damage for record in records)

파일 경로: C:\dev\game-log-analyzer\main.py

main.py
from battle_analyzer.models import BattleRecord, total_damage

records = [BattleRecord("Knight", "Slime", "Slash", 80, "win")]
print(records)
print(total_damage(records))
PowerShell · 실행
.\.venv\Scripts\python.exe .\main.py

5. 코드가 동작하는 이유​

frozen=True는 생성 후 필드 대입을 막아 기록을 값처럼 다루게 합니다. slots=True는 허용 필드를 고정하고 메모리 구조를 단순화합니다. Literal은 허용 문자열을 타입 계약으로 표현합니다. 실제 값 검증은 __post_init__ 같은 코드가 담당합니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

dataclass와 타입 힌트 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“dataclass와 타입 힌트”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2‘mutable 기본값을 직접 사용’ 실수를 판단할 때 “dataclass와 타입 힌트” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

18강. dataclass와 타입 힌트 미완료 상태