프로그래밍 언어/Python

파이썬 데이터 클래스와 타이핑. 효율적인 코드 작성을 위한 고급 프로그래밍 - 고급 Python #6

eco7T 2025. 1. 10. 09:04
반응형

파이썬의 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를 받을 수 있습니다.

반응형