파이썬의 타입

파이썬의 타입

이 기사에서는 파이썬의 타입에 대해 설명합니다.

YouTube Video

파이썬의 타입

파이썬의 typing 모듈은 타입 힌트를 파이썬에 도입하기 위해 사용됩니다. 이 모듈은 원래 파이썬 3.5에서 도입되었으며 코드 가독성과 유지보수를 향상시키기 위해 사용됩니다. 타입 힌트는 코드 실행 시에는 영향을 미치지 않지만 IDE나 정적 분석 도구를 이용한 타입 검사를 가능하게 합니다.

타입 힌트의 기본

타입 힌트는 함수와 변수의 타입을 명시적으로 지정하여 코드의 의도를 명확히 합니다. 아래의 예제에서는 인수와 반환 값에 대해 타입이 지정되어 있습니다.

1def add_numbers(a: int, b: int) -> int:
2    return a + b
3
4result: int = add_numbers(5, 10)
5print(result)  # 15

위 코드에서 ab는 정수형 (int)이며, 함수의 반환 값도 정수형으로 명시적으로 기술되어 있습니다. 타입 힌트를 사용하더라도 타입이 엄격하게 적용되지는 않지만, 타입이 일치하지 않을 경우 개발 중 경고가 표시될 수 있습니다.

주요 타입 힌트

파이썬의 typing 모듈은 타입 힌트를 정의하기 위한 다양한 클래스와 함수를 제공합니다. 아래는 일반적인 타입 힌트 목록입니다.

  • int: 정수
  • str: 문자열
  • float: 부동소수점 숫자
  • bool: 불리언
  • List: 리스트
  • Dict: 사전
  • Tuple: 튜플
  • Set: 세트

List 타입

목록 유형은 List 클래스를 사용하여 지정됩니다. 목록 내의 요소 유형을 명시적으로 지정할 수도 있습니다.

1from typing import List
2
3def sum_list(numbers: List[int]) -> int:
4    return sum(numbers)
5
6print(sum_list([1, 2, 3]))  # 6

이 예제에서 목록의 모든 요소는 int 유형이어야 합니다.

Dict 유형

사전(dictionnary)은 Dict를 사용하여 정의됩니다. 키와 값의 유형을 지정할 수 있습니다.

1from typing import Dict
2
3def get_student_age(students: Dict[str, int], name: str) -> int:
4    return students.get(name, 0)
5
6students = {"Alice": 23, "Bob": 19}
7print(get_student_age(students, "Alice"))  # 23

이 예제에서는 사전에서 키 유형은 str, 값 유형은 int로 사용됩니다.

Tuple 유형

튜플은 Tuple 유형을 사용하여 지정됩니다. 튜플에서 각 요소의 유형을 개별적으로 지정할 수 있습니다.

1from typing import Tuple
2
3def get_person() -> Tuple[str, int]:
4    return "Alice", 30
5
6name, age = get_person()
7print(name, age)  # Alice 30

여기에서 get_person 함수는 문자열과 정수를 포함하는 튜플을 반환하는 모습을 보여줍니다.

Union 유형

Union 유형은 여러 유형이 허용됨을 명시적으로 나타내는 데 사용됩니다.

1from typing import Union
2
3def process_value(value: Union[int, float]) -> float:
4    return value * 2.0
5
6print(process_value(10))  # 20.0
7print(process_value(3.5))  # 7.0

이 예제에서 process_value 함수는 int 또는 float 유형의 인수를 받고 결과로 float 유형을 반환합니다.

Optional 유형

Optional 유형은 변수가 None일 가능성이 있는 경우에 사용됩니다. 이는 Union[Type, None]의 단축 표현으로 제공됩니다.

1from typing import Optional
2
3def greet(name: Optional[str] = None) -> str:
4    if name is None:
5        return "Hello, Guest!"
6    return f"Hello, {name}!"
7
8print(greet())  # Hello, Guest!
9print(greet("Alice"))  # Hello, Alice!

여기에서는 name이 지정되지 않을 경우, 이를 None으로 처리함을 보여줍니다.

제네릭 유형(Generic Types)

제네릭 유형은 데이터 구조에 포함된 요소의 유형을 추상적으로 표현하는 방법입니다. typing 모듈에서는 TypeVar를 사용하여 제네릭 유형을 정의할 수 있습니다.

1from typing import TypeVar, List
2
3T = TypeVar('T')
4
5def get_first_element(elements: List[T]) -> T:
6    return elements[0]
7
8print(get_first_element([1, 2, 3]))  # 1
9print(get_first_element(["a", "b", "c"]))  # a

이 예제에서 get_first_element는 목록의 첫 번째 요소를 반환하는 함수이며, 목록 유형에 관계없이 작동합니다.

유형 별칭(Type Aliases)

유형 별칭은 복잡한 유형 정의에 명확한 이름을 부여하여 이를 단순화하는 방법입니다.

1from typing import List, Tuple
2
3Coordinates = List[Tuple[int, int]]
4
5def get_coordinates() -> Coordinates:
6    return [(0, 0), (1, 1), (2, 2)]
7
8print(get_coordinates())  # [(0, 0), (1, 1), (2, 2)]

이 예제에서는 목록 내 튜플을 포함하는 유형을 간단히 표현하기 위해 Coordinates 유형 별칭이 정의됩니다.

요약

Python의 typing 모듈은 코드의 가독성과 유지보수성을 향상시키는 데 매우 유용합니다. 타입 힌트를 적절히 활용하면, 특히 대규모 프로젝트나 팀 개발에서 타입 불일치 및 버그를 방지하는 데 도움이 됩니다. 타입은 단순히 개발 지원 도구일 뿐 실행 시 동작에 영향을 미치지 않으며, 이를 통해 코드의 유연성을 유지할 수 있습니다.

위의 기사를 보면서 Visual Studio Code를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.

YouTube Video