ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 메타클래스를 이해한다는 것
    IT 2026. 1. 22. 17:47

    파이썬을 어느 정도 깊게 쓰다 보면, 언젠가는 이런 말을 듣게 됩니다.

    “메타클래스는 정말 필요할 때만 써야 한다”

    이 말은 반은 맞고, 반은 틀립니다. 메타클래스는 자주 쓸 도구는 아니지만, 파이썬이 어떻게 객체와 클래스를 바라보는지를 이해하는 데에는 결정적인 역할을 합니다. 이 글에서는 메타클래스를 실무 테크닉으로 소개하기보다는, 파이썬 객체 모델의 마지막 퍼즐로서 차분히 풀어보려 합니다.

     

    클래스도 객체다, 정말로

    우리는 이미 이런 코드를 너무 자연스럽게 사용합니다.

    class User:
        pass

    하지만 파이썬에게 이 코드는 단순한 선언문이 아닙니다. 파이썬은 이 순간 다음과 같은 일을 합니다.

    1. 클래스 본문을 실행하고
    2. 그 결과로 네임스페이스(dict)를 만들고
    3. 그 네임스페이스를 사용해 클래스 객체를 생성합니다

    즉, User는 문법이 아니라 런타임에 만들어진 객체입니다. 그리고 이 객체를 만들어내는 주체가 바로 메타클래스입니다.


    메타클래스란 무엇인가

    한 문장으로 정리하면 메타클래스는 이렇게 정의할 수 있습니다.

    “클래스를 만들어내는 클래스”

    조금 추상적으로 들리지만, 이미 우리는 메타클래스를 매일 사용하고 있습니다.

    type(User)

    대부분의 경우 이 결과는 type입니다. 즉, 파이썬에서 기본 메타클래스는 type이고, 우리가 만드는 대부분의 클래스는 type이라는 클래스의 인스턴스입니다.


    type은 함수이면서 메타클래스다

    type은 특이한 존재입니다.

    User = type("User", (), {})

    이 코드는 앞서 작성한 class User: pass와 완전히 동일합니다. 여기서 드러나는 중요한 사실은, 클래스 정의조차 함수 호출로 환원될 수 있다는 점입니다.

    이 순간부터 파이썬에서 클래스는 더 이상 특별한 문법이 아니라, 생성 규칙을 가진 객체로 보이기 시작합니다'


    메타클래스는 언제 개입하는가

    메타클래스는 클래스가 만들어지는 바로 그 시점에 개입합니다. 즉, 인스턴스가 생성될 때가 아니라, 클래스 정의가 끝난 직후입니다.

    이 타이밍 덕분에 메타클래스는 다음과 같은 일을 할 수 있습니다.

    • 클래스 속성 검증
    • 메서드 자동 추가
    • 인터페이스 강제
    • 클래스 레지스트리 구성

    이 모든 작업은 한 번만 수행되고, 이후의 인스턴스 생성에는 영향을 주지 않습니다.


    가장 단순한 메타클래스 예제

    class MyMeta(type):
        def __new__(mcls, name, bases, namespace):
            print(f"Creating class {name}")
            return super().__new__(mcls, name, bases, namespace)
    
    class User(metaclass=MyMeta):
        pass

    이 코드에서 중요한 점은, User의 인스턴스를 만들지 않아도 메시지가 출력된다는 것입니다. 메타클래스는 클래스 정의 시점에 이미 모든 일을 끝냅니다.

     

    메타클래스와 디스크립터의 관계

    여기까지 왔다면, 앞에서 다룬 디스크립터가 떠오를 수 있습니다. 이 둘의 관계는 위계로 이해하는 편이 좋습니다.

    • 디스크립터 → 속성 접근을 제어
    • 메타클래스 → 클래스 생성을 제어

    즉, 디스크립터가 “점(.) 이후”의 세계라면, 메타클래스는 “클래스가 생기기 이전”의 세계입니다.


    그렇다면 언제 메타클래스를 써야 할까?

    메타클래스는 강력한 만큼, 남용하면 코드의 이해도를 급격히 떨어뜨립니다. 대부분의 경우 다음과 같은 대안이 먼저 고려됩니다.

    • 클래스 데코레이터
    • 상속과 믹스인
    • 팩토리 함수

    그럼에도 불구하고 메타클래스를 써야 할 때는, 여러 클래스에 공통 규칙을 강제해야 할 때입니다. 예를 들어 ORM, 프레임워크, DSL 구현 같은 경우가 여기에 해당합니다.


    메타클래스는 파이썬의 끝이 아니다

    메타클래스는 파이썬의 가장 깊은 지점 중 하나이지만, 동시에 경계선이기도 합니다. 이 지점을 넘어서면 파이썬은 더 이상 단순한 스크립트 언어가 아니라, 언어를 설계하는 도구처럼 보이기 시작합니다.

    그래서 많은 개발자에게 메타클래스는 “쓰지 않아도 되는 기능”이지만, “알아두면 시야가 달라지는 기능”입니다.


    마무리하며

    메타클래스는 파이썬이 얼마나 일관된 철학 위에 설계된 언어인지를 보여주는 증거입니다.

    • 함수도 객체이고
    • 클래스도 객체이며
    • 그 객체를 만드는 규칙마저 객체로 표현한다

    이 구조를 이해하는 순간, 파이썬은 더 이상 블랙박스가 아닙니다. 메타클래스는 그 블랙박스를 열어 보여주는 마지막 열쇠에 가깝습니다.

Designed by Tistory.