Python의 타입힌트는 Generic과 TypeVar를 활용하여 제네릭(Generic) 클래스를 정의할 수 있습니다.
제네릭을 사용하면 클래스나 함수가 다양한 타입을 지원하면서도 타입 안정성을 확보할 수 있습니다.
이번 글에서는 Robot 클래스를 예제로 들어, 제네릭 클래스 작성법과 사용 방법을 살펴보겠습니다.
제네릭 클래스 기본 구조
먼저, 제네릭 클래스에서 사용할 타입 변수(TypeVar)를 정의합니다.
from typing import Optional, TypeVar, Generic
# 제네릭 타입 변수 정의
ARM = TypeVar('ARM')
여기서 ARM은 팔(arm)의 타입을 나타내며, int, str, float 등 다양한 타입으로 지정할 수 있습니다.
제네릭 클래스 정의
Generic[ARM]을 상속받아 제네릭 클래스를 정의합니다.
class Robot(Generic[ARM]):
def __init__(self, arm: ARM, head: int) -> None:
self.arm: ARM = arm # 제네릭 타입 변수 사용
self.head: int = head
def decode(self) -> Optional[ARM]:
code: Optional[ARM] = None
# 실제 decode 로직을 구현할 수 있음
return code
여기서 중요한 포인트는 다음과 같습니다:
- arm 속성은 ARM 타입으로 지정됨 → int, str, float 등으로 자유롭게 정의 가능
- head는 항상 int 타입
- decode 메서드는 Optional[ARM]을 반환 → ARM 타입이거나 None이 될 수 있음
제네릭 클래스 사용 예시
제네릭 클래스는 인스턴스를 생성할 때 타입을 지정할 수 있습니다.
# int 타입의 arm을 가진 Robot
robot1 = Robot[int](12231413, 23908409)
# str 타입의 arm을 가진 Robot
robot2 = Robot[str]("12231413", 23908409)
# float 타입의 arm을 가진 Robot
robot3 = Robot[float](1223.1413, 23908409)
각 인스턴스는 arm의 타입이 다르지만, 타입 체커는 올바른 타입으로 인식합니다.
IDE에서도 자동완성을 통해 arm의 타입이 무엇인지 정확히 알 수 있습니다.
제네릭 타입 두 개 사용하기
from typing import Optional, TypeVar, Generic
ARM = TypeVar('ARM')
HEAD = TypeVar('HEAD')
class Robot(Generic[ARM, HEAD]):
def __init__(self, arm: ARM, head: HEAD) -> None:
self.arm: ARM = arm
self.head: HEAD = head
def decode(self) -> Optional[ARM]:
code: Optional[ARM] = None
return code
# 사용 예시
robot1 = Robot[int, int](12231413, 23908409) # arm=int, head=int
robot2 = Robot[str, int]("12231413", 23908409) # arm=str, head=int
robot3 = Robot[float, str](1223.1413, "23908409") # arm=float, head=str
이렇게 하면 arm과 head에 서로 다른 타입을 지정할 수 있습니다.
예를 들어, 어떤 로봇은 숫자형 팔과 숫자형 머리를 가질 수도 있고, 또 다른 로봇은 문자열 팔과 정수 머리를 가질 수도 있습니다.
즉, 제네릭 타입을 두 개 이상 정의하면 클래스 속성을 더 유연하고 정밀하게 타입 지정할 수 있습니다.
정리
- TypeVar 로 제네릭 타입 변수를 정의
- Generic[T] 을 상속하여 제네릭 클래스 작성
- 인스턴스 생성 시 Robot[int], Robot[str]처럼 타입을 지정할 수 있음
- 타입 체커와 IDE 자동완성을 통해 안정성과 가독성을 동시에 확보
제네릭은 “하나의 클래스/함수가 다양한 타입을 안전하게 지원”해야 할 때 유용합니다. 특히 데이터 구조나 유틸리티 클래스 작성 시 큰 장점을 발휘합니다.
'파이썬 > 타입 힌트' 카테고리의 다른 글
| Python 타입힌트: Type Alias와 TypedDict 활용하기 (0) | 2025.09.10 |
|---|---|
| Python 타입힌트: Final로 상수 정의하기 (0) | 2025.09.10 |
| Python 타입힌트: 클래스 내부에서 자기 자신 참조하기 (0) | 2025.09.10 |
| Python 타입힌트: Optional 타입 활용법 (0) | 2025.09.10 |
| Python 타입힌트: Union 타입 활용법 (0) | 2025.09.10 |