파이썬의 dataclasses 모듈은 파이썬 3.7 버전부터 도입되었고, 주로 간결하고 가독성 높은 클래스를 작성하기 위한 용도로 사용합니다.
원래(파이썬 3.7 이전) 파이썬 클래스는 객체를 생성하기 위해서는 __init__ 메서드에서 필요한 속성을 일일이 할당해야만 했습니다. 그러나 최근에는 클래스 정의 시 @dataclass 데코레이터만 붙이면 __init__부터 __repr__, __eq__ 같은 메서드를 자동으로 생성해 주어, 코드가 훨씬 간결해지게 되었죠.
파이썬 데이터 클래스와 타이핑
데이터 클래스란 뭘까요?
간단히 말해, 데이터를 담는 클래스를 쉽게 만들 수 있게 해주는 도구예요. 예를 들어, 학생 정보를 담는 클래스를 만든다고 생각해 봅시다.
from dataclasses import dataclass
@dataclass
class Student:
name: str
age: int
grade: float
위와 같이 클래스를 정의할 수 있을 거예요.
`@dataclass` 데코레이터만 붙이면 자동으로 `__init__`, `__repr__`, `__eq__` 등의 메서드를 만들어 줍니다. 덕분에 우리는 반복적인 코드 작성을 줄일 수 있죠.
데이터 클래스를 사용하면 다음과 같이 객체를 쉽게 만들고 사용할 수 있어요:
student = Student("김철수", 20, 4.5)
print(student) # Student(name='김철수', age=20, grade=4.5)
간단하죠? 이렇게 데이터 클래스를 사용하면 코드가 훨씬 깔끔해지고 가독성도 좋아집니다.
아마도, 최근 파이썬을 시작하신 분들은 '이게 뭔소린가' 싶을 거예요. 그냥 클래스 생성 시 @dataclass를 반드시 사용하자! 정도로 생각하셔도 됩니다.
데이터 클래스 심화
기본은 알았으니, 이제 조금 더 깊이 들어가 볼까요?
데이터 클래스는 다양한 옵션을 제공합니다. 예를 들어, `frozen=True` 옵션을 사용하면 불변 객체를 만들 수 있어요.
@dataclass(frozen=True)
class Point:
x: float
y: float
이렇게 하면 `Point` 객체의 속성을 변경하려고 할 때 오류가 발생합니다. 데이터의 무결성을 유지해야 할 때 유용하죠.
또 다른 유용한 기능으로 `field` 함수가 있어요. 이를 통해 기본값 설정, 제외할 필드 지정 등을 할 수 있습니다.
from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int
emails: list[str] = field(default_factory=list)
_id: int = field(init=False, default=0)
여기서 `emails`는 빈 리스트를 기본값으로 가지며, `_id`는 초기화 시 인자로 받지 않고 기본값 0을 갖게 됩니다.
이런 식으로 데이터 클래스를 활용하면, 복잡한 데이터 구조도 쉽게 관리할 수 있답니다.
타이핑 기초
이제 타이핑에 대해 알아볼까요? 파이썬은 동적 타입 언어지만, 타입 힌트를 통해 정적 타입 검사의 이점을 얻을 수 있어요.
기본적인 타입 힌트는 이렇게 사용합니다.
def greet(name: str) -> str:
return f"안녕하세요, {name}님!"
여기서 `name: str`은 `name` 인자가 문자열이어야 한다는 것을 나타내고, `-> str`은 함수가 문자열을 반환한다는 것을 의미해요.
타입 힌트는 코드의 가독성을 높이고, 개발 도구의 지원을 받아 버그를 미리 잡을 수 있게 해 줍니다.
하지만 주의할 점은, 파이썬 인터프리터는 이 타입 힌트를 강제하지 않는다는 거예요. 실제 타입 검사를 하려면 mypy 같은 외부 도구를 사용해야 합니다.
타이핑 심화
바로 예시로 들어가 봅시다.
def process_data(numbers: list[int], data: dict[str, float]) -> None:
pass
여기서 `list[int]`는 정수의 리스트를, `dict[str, float]`는 문자열 키와 실수 값을 가진 딕셔너리를 의미합니다.
Union 타입을 사용하면 여러 타입 중 하나를 가질 수 있음을 나타낼 수 있어요.
from typing import Union
def print_id(id: Union[int, str]) -> None:
print(f"ID: {id}")
이 함수는 정수나 문자열 형태의 ID를 받을 수 있습니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
파이썬 asyncio로 배우는 비동기 I/O 코루틴과 이벤트 루프 이해하기 - 고급 Python #8 (0) | 2025.01.20 |
---|---|
파이썬 멀티스레딩과 멀티프로세싱의 차이와 활용 방법 - 고급 Python #7 (0) | 2025.01.15 |
파이썬 Collections 모듈 가이드 Counter부터 deque까지 활용 방법 - 고급 Python #5 (0) | 2025.01.07 |
파이썬 리스트(List) 세트(Set) 딕셔너리(Dictionary) 고급 활용법 - 고급 Python #4 (0) | 2025.01.02 |
파이썬 제너레이터와 이터레이터 효율적인 대용량 데이터 처리와 메모리 최적화 - 고급 Python #3 (0) | 2024.12.27 |