본문으로 건너뛰기
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와 타입 힌트 미완료 상태