파이썬에서 클래스는 사실 **메타클래스 type**에 의해 생성됩니다.
보통은 class 키워드로 선언해서 쓰지만, type()을 직접 호출하면 런타임에 클래스를 동적으로 만들 수 있죠.
이번 글에서는 type()을 활용해 **커스텀 리스트(Custom List)**를 만드는 과정을 살펴보겠습니다.
1. type()을 이용한 클래스 생성 복습
type()은 두 가지 방식으로 쓰입니다.
type(obj) # 객체의 타입 확인
type(name, bases, dict) # 새로운 클래스 생성
- name: 클래스 이름 (문자열)
- bases: 상속할 부모 클래스 (튜플)
- dict: 클래스에 정의할 속성과 메서드 (딕셔너리)
즉, class 키워드로 선언하는 것과 type()을 이용한 선언은 결국 같은 일을 하게 됩니다.
2. 커스텀 메서드 만들기
먼저 리스트에 원하는 기능을 추가할 함수를 따로 정의합니다.
# 리스트의 모든 원소를 d배 해주는 함수
def cus_mul(self, d):
for i in range(len(self)):
self[i] = self[i] * d
# 리스트 안에서 특정 값을 다른 값으로 바꿔주는 함수
def cus_replace(self, old, new):
while old in self:
self[self.index(old)] = new
여기서 self는 나중에 CustomList1 객체가 될 리스트 자신입니다.
- cus_mul → 리스트 요소 전체에 곱셈 적용
- cus_replace → 리스트 안의 특정 값(old)을 새로운 값(new)으로 교체
3. 동적으로 클래스 정의하기
이제 type()을 사용해 list를 상속받는 커스텀 리스트 클래스를 만들어봅니다.
CustomList1 = type(
'CustomList1', # 클래스 이름
(list,), # 부모 클래스 (list 상속)
{
'desc': '커스텀 리스트1', # 클래스 속성
'cus_mul': cus_mul, # 커스텀 메서드 1
'cus_replace': cus_replace # 커스텀 메서드 2
}
)
실제 사용 예시
# CustomList1 객체 생성
c1 = CustomList1([1,2,3,4,5,6,7,8,9,10])
# 모든 원소에 1000 곱하기
c1.cus_mul(1000)
# 리스트 안의 1000을 8777로 교체
c1.cus_replace(1000, 8777)
print(c1)
실행 결과:
[8777, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]
4. 코드 흐름 정리
- 객체 생성: [1, 2, …, 10] 리스트를 가진 CustomList1 객체 c1 생성
- 곱하기 메서드 호출: cus_mul(1000) → 모든 원소가 1000배 커짐
[1000, 2000, 3000, …, 10000]
값 교체 메서드 호출: cus_replace(1000, 8777) → 1000 → 8777로 바뀜
[8777, 2000, 3000, …, 10000]
5. 왜 이런 방식을 쓰나?
- class 키워드를 써도 같은 기능을 구현할 수 있습니다.
- 하지만 type()을 이용하면 런타임에 조건에 맞게 클래스를 생성할 수 있어,
프레임워크(예: Django ORM, SQLAlchemy)나 메타프로그래밍 기법에서 자주 활용됩니다.
1️⃣ 예를 들어:
- 모델 정의 시점에 자동으로 필드를 주입
- 실행 상황에 따라 클래스를 동적으로 바꿔치기
이런 경우에 type() 방식이 큰 힘을 발휘합니다.
정리하면
- type()은 단순히 타입 확인 함수가 아니라 클래스를 만드는 메타클래스
- type(name, bases, dict)을 이용하면 동적으로 클래스 생성 가능
- 이번 예제에서는 list를 상속받아 cus_mul, cus_replace 같은 메서드를 추가
- 실행 결과, 우리가 정의한 커스텀 메서드를 활용해 리스트를 자유롭게 변형 가능
메타클래스(type)를 직접 활용하면 파이썬의 유연함과 런타임 동적 생성 능력을 실감할 수 있습니다.
일반 개발에서는 잘 쓰이지 않지만, 프레임워크나 라이브러리 구현에서는 아주 강력한 무기가 됩니다!
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 Descriptor를 활용한 속성 제어 예제 (0) | 2025.09.15 |
|---|---|
| 파이썬 Descriptor와 Property 비교 예제 (0) | 2025.09.15 |
| Python type()을 이용한 동적 클래스 생성 가이드 (0) | 2025.09.15 |
| 파이썬 메타클래스(Metaclass) 완전 정리 (0) | 2025.09.15 |
| 파이썬에서의 메소드 오버로딩 (multipledispatch 활용) (0) | 2025.09.14 |