본문 바로가기

'@dataclass' 데코레이터와 '->' 연산자에 대해 중점적으로 설명하겠습니다.

상세 설명

  1. '@dataclass' 데코레이터:
    '@dataclass'는 Python 3.7부터 도입된 기능으로, 데이터 클래스를 쉽게 만들 수 있게 해줍니다. 이 데코레이터를 사용하면 클래스의 'init', 'repr', 'eq' 등의 메서드를 자동으로 생성해줍니다. 주로 데이터를 저장하고 관리하는 용도로 사용됩니다.
  2. '->' 연산자:
    이는 함수 주석(function annotation)을 위한 구문입니다. 함수의 반환 타입을 명시하는 데 사용됩니다. 'load_config' 함수에서 '-> Config'는 이 함수가 'Config' 타입의 객체를 반환한다는 것을 나타냅니다.

예제 코드

코드의 각 부분을 자세히 살펴보겠습니다:

@dataclass
class Config:
    workbook_name: str
    sheet_name_list: List[str]
    base_row_pos: int
    base_col_pos: List[int]
    output_excel_filename: str
    output_word_filename: str

이 부분은 'Config'라는 데이터 클래스를 정의합니다. 각 필드의 타입이 명시되어 있습니다.

def load_config(json_file: str) -> Config:

이 줄은 'load_config' 함수를 정의합니다. 이 함수는 문자열 타입의 'json_file'을 매개변수로 받고, 'Config' 객체를 반환합니다.

이 코드는 설정 정보를 관리하고 JSON 파일에서 설정을 로드하는 기능을 구현하는 데 사용될 수 있습니다.

dataclass 상세

dataclass는 주로 데이터를 보관하는 클래스를 쉽게 만들기 위해 Python 3.7에서 도입되었습니다. 이 기능의 주요 특징과 장점은 다음과 같습니다:

  1. 간결한 클래스 정의:
    데이터 필드만 정의하면 되므로, 클래스 작성이 매우 간단해집니다.
  2. 자동 메서드 생성:
    __init__(), __repr__(), __eq__() 등의 특수 메서드를 자동으로 생성해줍니다.
  3. 타입 힌팅:
    각 필드의 타입을 명시할 수 있어, 코드의 가독성과 안정성이 향상됩니다.
  4. 불변성 지원:
    frozen=True 파라미터를 사용하여 불변 객체를 만들 수 있습니다.
  5. 기본값 설정:
    필드에 기본값을 쉽게 설정할 수 있습니다.
  6. 비교 연산 지원:
    객체 간 비교를 위한 메서드들이 자동으로 생성됩니다.

간단한 예시를 통해 dataclass의 사용법을 보여드리겠습니다:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    city: str = "Seoul"  # 기본값 설정

# 객체 생성
person1 = Person("Kim", 30)
person2 = Person("Lee", 25, "Busan")

print(person1)  # Person(name='Kim', age=30, city='Seoul')
print(person2)  # Person(name='Lee', age=25, city='Busan')

# 자동 생성된 __eq__() 메서드 사용
print(person1 == Person("Kim", 30))  # True

이처럼 dataclass를 사용하면 간단하고 명확한 방식으로 데이터 중심의 클래스를 정의할 수 있습니다. 특히 설정, DTO(Data Transfer Object), 모델 클래스 등을 작성할 때 매우 유용합니다.

__repr__() 메서드

__repr__() 메서드는 객체의 문자열 표현을 반환합니다. dataclass에서는 이 메서드가 자동으로 생성됩니다.

from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str
    year: int

# 객체 생성
book = Book("1984", "George Orwell", 1949)

# __repr__() 메서드 사용
print(repr(book))  # Book(title='1984', author='George Orwell', year=1949)
print(book)  # Book(title='1984', author='George Orwell', year=1949)

# 리스트에서의 __repr__() 사용
book_list = [
    Book("To Kill a Mockingbird", "Harper Lee", 1960),
    Book("Pride and Prejudice", "Jane Austen", 1813)
]
print(book_list)  
# [Book(title='To Kill a Mockingbird', author='Harper Lee', year=1960), 
#  Book(title='Pride and Prejudice', author='Jane Austen', year=1813)]

iteration에 대한 예제

dataclass 자체는 직접적으로 iteration을 지원하지 않지만, 리스트와 같은 iterable 속성을 가질 수 있습니다. 또한 __iter__() 메서드를 정의하여 iteration을 지원할 수 있습니다.

from dataclasses import dataclass
from typing import List

@dataclass
class Library:
    name: str
    books: List[Book]

    def __iter__(self):
        return iter(self.books)

# 객체 생성
library = Library("City Library", [
    Book("1984", "George Orwell", 1949),
    Book("To Kill a Mockingbird", "Harper Lee", 1960),
    Book("Pride and Prejudice", "Jane Austen", 1813)
])

# iteration 사용
for book in library:
    print(f"{book.title} by {book.author}")

# 출력:
# 1984 by George Orwell
# To Kill a Mockingbird by Harper Lee
# Pride and Prejudice by Jane Austen

# list comprehension 사용
titles = [book.title for book in library]
print(titles)  # ['1984', 'To Kill a Mockingbird', 'Pride and Prejudice']

이 예제에서 Library 클래스는 __iter__() 메서드를 정의하여 iteration을 지원합니다. 이를 통해 Library 객체를 직접 순회할 수 있으며, 각 Book 객체에 접근할 수 있습니다. 이러한 방식으로 dataclass를 사용하면 데이터 중심의 클래스를 쉽게 만들고, 그 객체들을 효과적으로 표현하고 다룰 수 있습니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.