ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] dataclass는 내부적으로 무엇을 하는가
    IT 2026. 1. 22. 17:43

    dataclass는 파이썬을 쓰는 사람이라면 한 번쯤은 "마법 같다"고 느끼는 기능입니다.

    from dataclasses import dataclass
    
    
    @dataclass
    class User:
        name: str
        age: int

    이 짧은 코드만으로도 __init__, __repr__, __eq__가 자동으로 생성됩니다. 하지만 이 마법은 공중에서 이루어지지 않습니다. 그 바닥에는 우리가 앞에서 살펴본 개념들, 특히 디스크립터와 클래스 생성 과정이 자리 잡고 있습니다.

     

    dataclass는 클래스 데코레이터다

    가장 먼저 짚고 넘어가야 할 점은 이것입니다.

    @dataclass는 클래스 데코레이터다

    즉, 클래스가 만들어진 직후, 그 클래스를 받아서 수정한 뒤 다시 돌려주는 함수입니다.

    이 시점에서 dataclass는 클래스의 모든 필드를 분석하고, 메서드를 생성하며, 필요한 속성들을 재구성합니다.

     

    필드는 단순한 변수가 아니다

    class User:
        name: str
        age: int

    이 코드를 dataclass는 그냥 지나치지 않습니다. 타입 힌트로 보이는 이 정보들은, 내부적으로는 필드 메타데이터로 수집됩니다.

    각 필드는 기본값, 타입, 비교 대상 여부 같은 정보를 함께 묶어 관리됩니다. 즉, 필드는 이미 작은 객체에 가깝습니다.

     

    dataclass와 디스크립터의 만남

    dataclass가 생성하는 필드 접근은 단순히 값을 넣고 빼는 수준이 아닙니다. 기본값 처리, 비교 로직, 초기화 순서 같은 것들이 모두 통제됩니다.

    이 과정에서 dataclass는 디스크립터를 활용해 속성 접근을 안전하게 관리합니다. 우리는 이를 직접 보지 못하지만, 속성 접근에 규칙을 부여한다는 점에서 디스크립터와 정확히 같은 역할을 합니다.

     

    __init__은 어떻게 만들어질까

    생성된 __init__ 메서드는 단순히 대입문을 나열한 것이 아닙니다. 필드 순서, 기본값, 타입 정보를 모두 고려해 함수 시그니처를 구성합니다.

    이 모든 작업은 클래스가 정의된 직후, 한 번만 수행됩니다. 이후 인스턴스 생성은 매우 가볍게 이루어집니다.

     

    dataclass는 왜 빠를까

    dataclass는 런타임에 매번 계산하지 않습니다. 필요한 구조를 클래스 생성 시점에 모두 확정해 둡니다.

    이 설계는 파이썬이 선호하는 방식입니다. 비용은 앞에서 지불하고, 실행은 단순하게 만드는 전략입니다.

     

    마무리하며

    dataclass는 편의 기능이지만, 결코 가벼운 기능은 아닙니다. 그 내부에는 디스크립터, 클래스 데코레이터, 메타데이터 설계라는 파이썬의 핵심 개념들이 응축되어 있습니다.

    이 사실을 알고 나면, dataclass는 더 이상 마법이 아니라 잘 설계된 결과물로 보이기 시작합니다.

Designed by Tistory.