
파이썬 dataclass는 class 코드를 짧게 쓰기 위한 장식처럼 보이지만, 실제로는 데이터 중심 객체의 의도를 드러내는 도구입니다. 필드를 선언하면 반복해서 쓰던 초기화와 비교 코드를 자동으로 만들 수 있습니다.
핵심은 dataclass가 단순 축약 문법이 아니라 값 묶음의 의미를 코드에 남기는 방식이라는 점입니다. 이 글은 Python 공식 dataclasses 문서와 PEP 557을 기준으로 사용 기준과 주의점을 정리합니다.

파이썬 dataclass를 먼저 한 줄로 정리하면
dataclass는 데이터를 담는 class에서 반복되는 메서드를 자동으로 만들어 주는 표준 라이브러리 도구입니다. 필드를 선언하면 초기화, 출력, 비교에 필요한 기본 동작을 더 적은 코드로 얻을 수 있습니다.
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
user = User("bscode", 20)
print(user)위 코드는 `__init__`을 직접 쓰지 않았지만 `User(“bscode”, 20)`처럼 객체를 만들 수 있습니다. 출력할 때도 필드 값이 보이는 `__repr__`이 자동으로 준비됩니다.
일반 class와 무엇이 다를까
일반 class로 같은 코드를 쓰면 필드가 늘어날 때마다 `__init__`, `__repr__`, `__eq__`를 계속 손봐야 합니다. dataclass는 이 반복을 줄여 데이터 구조 자체에 집중하게 해 줍니다.
class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def __repr__(self):
return f"User(name={self.name!r}, age={self.age!r})"중요한 점은 코드가 짧아지는 것보다 의도가 선명해진다는 점입니다. 이 객체가 복잡한 행동보다 값을 묶어 전달하는 역할이라는 사실이 선언에서 드러납니다.
__eq__가 자동으로 생기는 의미
dataclass는 기본적으로 필드 값을 기준으로 객체를 비교하는 `__eq__`를 만들어 줍니다. 그래서 같은 필드 값을 가진 객체를 값처럼 비교할 수 있습니다.
@dataclass
class Point:
x: int
y: int
print(Point(1, 2) == Point(1, 2)) # True이런 특성은 설정값, 좌표, 요청/응답 DTO처럼 값 자체가 중요한 객체에서 유용합니다.
frozen은 값을 바꾸지 못하게 만들 때 쓴다
객체를 만든 뒤 필드를 바꾸면 안 되는 값이라면 `frozen=True`를 고려할 수 있습니다. 완전한 보안 장치라기보다 실수로 상태를 바꾸는 코드를 줄이는 의도 표현에 가깝습니다.
@dataclass(frozen=True)
class Money:
amount: int
currency: strmutable default는 default_factory를 써야 한다
리스트나 딕셔너리처럼 바뀔 수 있는 값을 기본값으로 둘 때는 주의가 필요합니다. dataclass에서는 이런 상황을 위해 `field(default_factory=…)`를 사용합니다.
from dataclasses import dataclass, field
@dataclass
class Cart:
items: list[str] = field(default_factory=list)각 객체가 자기만의 새 리스트를 가져야 하므로, 기본값 자체를 공유하지 않고 factory로 새 값을 만드는 방식이 안전합니다.
언제 dataclass가 잘 맞을까
- 필드가 중심이고 복잡한 행동이 많지 않은 객체
- 함수 사이에서 데이터를 명확한 이름으로 전달하고 싶을 때
- 테스트에서 입력과 결과 객체를 비교하기 쉽게 만들고 싶을 때
- 설정값, 좌표, 이벤트, DTO처럼 값 묶음의 의미가 강할 때
언제 일반 class가 더 나을까
- 상태 변경 규칙과 메서드가 객체의 핵심일 때
- 생성 과정에서 복잡한 검증과 불변 조건이 필요할 때
- 상속 구조나 캡슐화 정책을 섬세하게 다뤄야 할 때
- 필드 자동 생성보다 명시적인 제어가 더 중요한 라이브러리 코드
정리
파이썬 dataclass는 class를 짧게 쓰는 문법을 넘어, 데이터 중심 객체라는 의도를 코드에 남기는 방법입니다. 필드 중심의 값 묶음이라면 dataclass가 읽기 쉽고, 복잡한 행동과 규칙이 중심이면 일반 class가 더 자연스럽습니다.
Python 기본 문법 흐름은 파이썬 with 문과 context manager 이해하기, 파이썬 yield return 차이, pyproject.toml은 왜 중요할까와 함께 보면 좋습니다. 외부 기준은 Python Docs – dataclasses, PEP 557 – Data Classes, Python Docs – dataclasses.field를 확인했습니다.