파이썬 dataclass 모듈은 3.7에서 도입되었다. (https://peps.python.org/pep-0557/)
dataclass는 표준 라이브러리이다.
데이터클래스를 처음 쓰게 된 이유는 __init__
함수를 작성하고 싶지 않아서였다. 그리고 초기화 변수 값들에 None
을 배정하고 싶었다.
데이터클래스에서는 이렇게 작성이 가능하다. 데코레이터 형식으로 사용하면 아래처럼 __init__
없이도 변수 초기화를 할 수 있고, 초기화 변수에 아무 값을 넣지 않는 것도 가능하다.
name:str
처럼 말이다. 변수가 없어도 type hint를 콜론을 이용해 사용하는 것이 자연스럽다.
from dataclasses import dataclass
@dataclass
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
# https://docs.python.org/3.7/library/dataclasses.html
dataclass의 유용성을 이런 정도로만 사용을 하다보니 다른 사람에게 왜 이걸 써야 하는지 설명하기 어려웠다. 실용적인 이유에서 말이다.
dataclass 모듈은 bolier plate라고 볼 수 있다. 미리 만들어진 템플릿이라는 거다. 어떤 템플릿이 있나?
__init__()
템플릿 외에도 프린트 문을 통제하는 __repr__()
,__eq__()
등이 있다.그런데 이름은 왜 dataclass인걸까. Java에는 VO라는 개념이 있다. Value Object라고 하여 값들을 들고다니기 위한 용도의 클래스라고 보면 될 것 같다.그런데 파이썬에서는 데이터만 들고다니는 클래스를 자주 쓰지 않는다. dictionary
도 있고, list
도 있다. 좀 더 정교한 프로그램으로 가면 namedtuple
도 있다. 개인적인 생각으로 dataclass는 이런 용도에서 데이터 들을 객체로 담고 다닐 수 있는 쉬운 방법중에 하나로 생각해도 될 것 같다. 그렇지 않고선 dataclass라는 이름이 붙은 이유가 자연스럽지 않을 것이다. 데이터를 들고 다닐 수 있으며, 이에 더해서 type check를 지원한다는 점. 이 정도면 충분하지 않을까.
공식 release 문서에는 이런 내용도 써있다.
Data Classes can be thought of as "mutable namedtuples with defaults"
, 이것은 default값이 있는 namedtuple이라는 거다. namedtuple
대해서는 또 설명이 필요하므로 우선 넘어가야할 것 같다.
참고
https://www.daleseo.com/python-dataclasses/
https://www.youtube.com/watch?v=vRVVyl9uaZc
https://velog.io/@livenow/Java-VOValue-Object%EB%9E%80
ChatGPT-4o