파이썬 제네릭: 초보자 가이드
안녕하세요, 미래의 파이썬 마스터! 오늘 우리는 파이썬 제네릭의 세상으로 흥미로운 여정을 시작할 것입니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 저는 친절한 안내자로, 모든 것을 단계별로 설명해 드릴 것입니다. 당신의 좋아하는 음료를 한 잔 챙기고, 이제 시작해 보세요!
제네릭이란?
코딩을 시작하기 전에 제네릭이 무엇인지 이해해 보겠습니다. 마법의 상자를 가정해 보세요. 이 상자는 장난감, 책, 심지어 쿠키도 담을 수 있습니다. 프로그래밍에서 제네릭은 이와 같은 역할을 합니다. 다양한 데이터 타입으로 작동할 수 있는 유연한 코드를 작성할 수 있게 해줍니다.
제네릭 함수 정의하기
먼저 제네릭 함수를 만들어 보겠습니다. 파이썬에서는 typing
모듈의 TypeVar
를 사용하여 제네릭 타입을 정의합니다.
from typing import TypeVar
T = TypeVar('T')
def print_item(item: T) -> None:
print(f"아이템은: {item}")
이 예제에서 T
는 제네릭 타입입니다. print_item
함수는 이제 모든 타입의 데이터를 받아들일 수 있습니다. 이를 단계별로 설명해 보겠습니다:
-
TypeVar
를typing
모듈에서导入了습니다. - 타입 변수
T
를 생성합니다. -
print_item
함수는T
타입의item
인자를 받습니다. - 함수는 단순히 아이템을 인쇄합니다.
제네릭 함수를 다양한 데이터 타입으로 호출하기
이제 제네릭 함수를 실제로 사용해 보겠습니다!
print_item(42)
print_item("Hello, Generics!")
print_item([1, 2, 3])
출력:
아이템은: 42
아이템은: Hello, Generics!
아이템은: [1, 2, 3]
보시다시피, 우리의 함수는 정수, 문자열, 그리고 리스트와 같은 다양한 데이터 타입으로 작동합니다. 코드 도구kast의 스위스 아ー�미Knife와 같은 것입니다!
제네릭 클래스 정의하기
제네릭 함수를 숙달한 후, 한 단계 더 발전하여 제네릭 클래스를 만들어 보겠습니다. 가정해 보세요, 우리는 어떤 종류의 아이템을 담을 수 있는 간단한 저장 시스템을 만들고 있습니다.
from typing import Generic, TypeVar
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, item: T):
self.item = item
def get_item(self) -> T:
return self.item
def set_item(self, new_item: T) -> None:
self.item = new_item
이 마법의 Box를 단계별로 설명해 보겠습니다:
- 우리의 클래스
Box
를Generic[T]
로 정의합니다. -
__init__
메서드는T
타입의item
을 받습니다. -
get_item
은 저장된 아이템을 반환합니다. -
set_item
은 아이템을 변경할 수 있습니다.
이제 Box를 사용해 보겠습니다:
# 정수의 Box
int_box = Box(42)
print(int_box.get_item()) # 출력: 42
# 문자열의 Box
str_box = Box("Hello, Generic Class!")
print(str_box.get_item()) # 출력: Hello, Generic Class!
# Box의 아이템을 변경하기
int_box.set_item(100)
print(int_box.get_item()) # 출력: 100
좋아요? 우리는 다양한 종류의 아이템을 저장할 수 있는 Box를 만들 수 있으며, 파이썬은 타입 안전을 보장합니다.
제네릭의 힘
제네릭은처음에는 약간 추상적일 수 있지만, 매우 강력합니다. 그들은 유연하고 타입이 안전한 코드를 작성할 수 있게 해줍니다. 큰 애플리케이션을 개발할 때, 제네릭은 다양한 데이터 타입으로 작동할 수 있는 재사용 가능한 구성 요소를 만들어 줄 수 있어 시간을 절약하고 오류를 줄일 수 있습니다.
다음은 이 힘을 보여주는 더 복잡한 예제입니다:
from typing import Generic, TypeVar, List
T = TypeVar('T')
class Storage(Generic[T]):
def __init__(self):
self.items: List[T] = []
def add_item(self, item: T) -> None:
self.items.append(item)
def get_items(self) -> List[T]:
return self.items
def get_last_item(self) -> T:
if self.items:
return self.items[-1]
raise IndexError("Storage is empty")
# 제네릭 Storage 클래스 사용하기
int_storage = Storage[int]()
int_storage.add_item(1)
int_storage.add_item(2)
int_storage.add_item(3)
str_storage = Storage[str]()
str_storage.add_item("Apple")
str_storage.add_item("Banana")
str_storage.add_item("Cherry")
print(int_storage.get_items()) # 출력: [1, 2, 3]
print(str_storage.get_last_item()) # 출력: Cherry
이 예제에서 우리는 제네릭 Storage
클래스를 만들어 정수와 문자열의 리스트를 저장할 수 있음을 보여주었습니다.
결론
축하합니다! 지금까지 파이썬 제네릭의 세상으로 첫 걸음을 뗐습니다. 우리는 제네릭 함수, 제네릭 클래스, 그리고 유연한 저장 시스템을 만드는 법을 다루었습니다. 기억하시라, 제네릭은 연습을 통해 숙달됩니다. 즉시 이해가 되지 않더라도, 계속 실험하다 보면 곧 제네릭의 마법을 코드에서 보게 될 것입니다.
마무리로, 우리가 배운 주요 메서드를 요약한 표를 제공합니다:
메서드 | 설명 |
---|---|
TypeVar('T') |
제네릭 사용을 위한 타입 변수 생성 |
Generic[T] |
제네릭 클래스 정의 |
__init__(self, item: T) |
제네릭 클래스를 item 으로 초기화 |
get_item(self) -> T |
T 타입의 아이템 반환 |
set_item(self, new_item: T) -> None |
T 타입의 새로운 아이템 설정 |
add_item(self, item: T) -> None |
T 타입의 아이템을 컬렉션에 추가 |
get_items(self) -> List[T] |
T 타입의 아이템 목록 반환 |
get_last_item(self) -> T |
컬렉션의 마지막 T 타입 아이템 반환 |
계속 코딩하고, 계속 배우세요. 제네릭을 사용하면 파이썬의 힘을 극대화할 수 있습니다! 미래의 파이썬 마법사 여러분, 행복하게 코딩하세요!
Credits: Image by storyset