소개
본 랩에서는 Python 3.7 부터 사용할 수 있는 강력한 기능인 Python Dataclasses(데이터 클래스) 를 소개합니다. 데이터 클래스는 주로 데이터를 저장하는 데 사용되는 일반적인 Python 클래스입니다. @dataclass 데코레이터를 사용하여 __init__() 및 __repr__()와 같은 특수 메서드를 자동으로 생성함으로써 상용구 (boilerplate) 코드를 크게 줄여줍니다.
본 랩을 통해 다음 사항들을 학습하게 됩니다:
- 간단한 데이터 클래스 정의하기.
- 표준 클래스 구현과 비교하기.
- 필드에 대한 기본값 설정하기.
typing.Any사용을 포함한 타입 힌트 처리하기.
랩이 끝날 때쯤에는 Python 에서 더 깔끔하고 간결한 데이터 중심 클래스를 작성할 수 있게 될 것입니다.
데이터 클래스 기능 (Dataclass Features)
이 단계에서는 데이터 클래스 (dataclass) 의 기본 기능을 학습합니다. 먼저 데이터를 저장하기 위한 표준 Python 클래스를 살펴본 다음, 데이터 클래스가 이를 어떻게 단순화하는지 확인해 보겠습니다.
표준 클래스는 속성을 초기화하기 위해 __init__ 메서드를 수동으로 작성해야 합니다.
예를 들어, 숫자를 나타내는 클래스는 다음과 같습니다.
class Number:
def __init__(self, val):
self.val = val
obj = Number(2)
print(obj.val)
@dataclass 데코레이터를 사용하면 Python 은 __init__ 메서드뿐만 아니라 깔끔한 문자열 표현을 위한 __repr__과 같은 다른 유용한 메서드도 자동으로 생성합니다. 주요 요구 사항은 필드에 타입 힌트 (type hints) 를 제공해야 한다는 것입니다.
참고: WebIDE(VS Code 와 유사) 사용에 익숙하지 않다면, 이 랩에서 먼저 학습하십시오.
@dataclass 데코레이터를 사용하여 동일한 Number 클래스를 만들어 보겠습니다.
왼쪽 파일 탐색기에서 features.py 파일을 엽니다. 다음 코드를 파일에 추가합니다.
from dataclasses import dataclass
@dataclass ## 이 데코레이터가 클래스를 데이터 클래스로 변환합니다
class Number:
val: int ## 타입 힌트가 필요합니다
## __init__ 메서드가 자동으로 생성됩니다
obj = Number(2)
## 'val' 속성의 값을 출력합니다
print(obj.val)
## __repr__ 메서드도 자동으로 생성되어 깔끔한 표현을 제공합니다
print(obj)
이제 터미널에서 스크립트를 실행하여 출력을 확인합니다.
python3 features.py
다음과 같은 출력을 보게 될 것입니다. 첫 번째 줄은 속성 값이고, 두 번째 줄은 자동 생성된 __repr__ 메서드가 제공하는 깔끔한 객체 표현입니다.
2
Number(val=2)
보시다시피, 데이터 클래스 버전은 더 간결하며 필요한 상용구 (boilerplate) 코드가 적습니다.
기본값 사용하기 (Using Default Values)
이 단계에서는 데이터 클래스의 필드에 기본값을 추가하는 방법을 탐구합니다. 이는 일부 속성이 선택 사항일 때 흔히 요구되는 사항입니다.
기억해야 할 중요한 규칙은 기본값이 있는 필드는 기본값이 없는 모든 필드 뒤에 선언되어야 한다는 것입니다.
name은 필수 필드이지만, count와 price는 선택 사항이며 기본값을 갖는 Product 데이터 클래스를 만들어 보겠습니다.
파일 탐색기에서 defaults.py 파일을 엽니다. 다음 코드를 추가합니다:
from dataclasses import dataclass
@dataclass
class Product:
name: str ## 필수 필드
count: int = 0 ## 기본값이 있는 선택적 필드
price: float = 0.0 ## 기본값이 있는 선택적 필드
## 필수 'name' 필드만 제공하여 인스턴스 생성
obj = Product("Python")
## 기본값이 적용되는지 확인하기 위해 속성 출력
print(f"Name: {obj.name}")
print(f"Count: {obj.count}")
print(f"Price: {obj.price}")
이제 터미널에서 스크립트를 실행합니다.
python3 defaults.py
출력 결과를 보면 count와 price에 기본값이 자동으로 할당된 것을 확인할 수 있습니다.
Name: Python
Count: 0
Price: 0.0
이 기능은 선택적 속성을 가진 객체를 매우 편리하게 생성할 수 있게 해줍니다.
타입 힌트 처리 (Handling Type Hints)
이 단계에서는 데이터 클래스에서 타입 힌트 (type hints) 를 사용해야 하는 요구 사항을 이해하게 됩니다. 이미 보셨듯이, 데이터 클래스를 정의할 때 각 필드에 대해 타입을 지정하는 것이 필수적입니다.
하지만 필드에 대해 구체적인 데이터 타입을 지정하고 싶지 않거나 지정할 수 없는 상황이 있을 수 있습니다. 이러한 경우, Python 의 typing 모듈은 Any라는 특별한 타입을 제공합니다. Any를 사용하면 타입 검사기 (type checker) 에게 해당 값이 어떤 타입이든 될 수 있음을 알려줍니다.
필드에 Any를 사용하는 데이터 클래스를 만들어 보겠습니다.
파일 탐색기에서 type_hints.py 파일을 열고 다음 코드를 추가합니다:
from dataclasses import dataclass
from typing import Any
@dataclass
class WithoutExplicitTypes:
name: Any
value: Any = 42
## 'name'이 문자열인 인스턴스를 생성합니다. 'value'는 기본값을 사용합니다.
obj1 = WithoutExplicitTypes(name="Test")
print(f"Object 1: name={obj1.name}, value={obj1.value}")
## 'name'이 정수이고 'value'가 문자열인 다른 인스턴스를 생성합니다.
obj2 = WithoutExplicitTypes(name=123, value="hello")
print(f"Object 2: name={obj2.name}, value={obj2.value}")
이제 터미널에서 스크립트를 실행합니다.
python3 type_hints.py
다음과 같은 출력을 보게 될 것이며, 이는 필드들이 서로 다른 타입의 값을 가질 수 있음을 보여줍니다.
Object 1: name=Test, value=42
Object 2: name=123, value=hello
Any는 유연성을 제공하지만, 코드를 더 강력하고 자체 문서화되도록 만들기 위해 가능한 한 구체적인 타입을 사용하는 것이 일반적으로 좋은 습관입니다.
요약
본 랩 (lab) 에서는 Python 의 데이터 클래스 (dataclasses) 를 사용하여 간결하고 읽기 쉬운 데이터 중심 클래스를 만드는 방법을 배웠습니다.
다음과 같은 주요 개념들을 다루었습니다:
@dataclass데코레이터는__init__()및__repr__()와 같은 특수 메서드를 자동으로 생성하여 반복적인 상용구 코드 (boilerplate code) 를 줄여줍니다.- 기본값이 있는 필드를 정의하는 방법과, 기본값이 없는 필드 다음에 와야 한다는 규칙을 배웠습니다.
- 데이터 클래스에서 타입 힌트 (type hints) 가 필수적이라는 점과 특정 타입을 원하지 않는 필드에
typing.Any를 사용하는 방법을 배웠습니다.
데이터 클래스는 특히 상태 (state) 를 주로 저장하는 클래스를 다룰 때, 깔끔하고 유지보수하기 쉬우며 효율적인 코드를 작성하기 위한 현대 Python 의 강력한 도구입니다.



