Python 타입 어노테이션

배추·2026년 1월 2일

🐍 Python

목록 보기
23/23

파이썬 3.5 버전부터 추가된 변수와 함수에 타입을 지정할 수 있는 타입 어노테이션 기능에 대해 알아봅니다.


▶︎동적 언어와 정적 언어

  • 프로그램 실행 중에 변수의 타입을 동적으로 바꿀 수 있으므로 파이썬을 동적 프로그래밍 언어(dynamic programming language)라고 한다.
a = 1
type(a) # <class 'int'>

a = "1"
type(a) # <class 'str'>
  • 한 번 변수에 타입을 지정하면 지정한 타입 외에 다른 타입은 사용할 수 없는 언어를 정적 프로그래밍 언어(static programming language)라고 한다.
    • 파이썬과 달리 자바는 정수형(int) 변수 a에 숫자 1을 대입하고 다시 문자열 "1"을 대입하려 할 때 컴파일 오류가 발생한다.
int a = 1;  // a 변수를 int형으로 지정
a = "1";  // a 변수에 문자열을 대입할 수 없으므로 컴파일 에러

동적 언어의 장단점

    • 파이썬과 같은 동적 언어는 타입에 자유로워 유연한 코딩이 가능하므로 쉽고 빠르게 프로그램을 만들 수 있다.
    • 타입 체크를 위한 코드가 없으므로 비교적 깔끔한 소스 코드를 작성할 수 있다.
    • 하지만 프로젝트의 규모가 커질수록 타입을 잘못 사용하여 버그가 생길 확률도 높아진다.
      - 안전성을 선호하는 금융권 프로젝트에서는 이런 이유로 동적 언어보다는 정적 언어를 주요 언어로 선택하는 경향이 많다.

▶︎파이썬 타입 어노테이션

  • 파이썬은 동적 언어의 단점을 극복하기 위해 3.5 버전부터 타입 어노테이션 기능을 지원.
  • 정적 언어에서와 같은 강제적인 타입 체크가 아니라 타입 어노테이션(type annotation), 즉 타입에 대한 힌트를 제공하는 정도의 기능만 지원.
  • 이는 동적 언어의 장점을 잃지 않으면서 기존에 작성된 코드와의 호환성을 유지하려는 당연한 선택이라고 할 수 있다.

타입 어노테이션 사용

  • 기본 어노테이션 타입
    • 정수 int
    • 문자열 str
    • 리스트 list
    • 튜플 tuple
    • 딕셔너리 dict
    • 집합 set
    • 불 bool

변수에 타입 지정

  • 변수 이름 바로 뒤에 : int와 같이 콜론과 타입을 작성하여 num 변수가 int형이라는 것을 명시.
  • 이는 코드를 읽는 사람에게 해당 변수가 어떤 타입의 값을 저장할 것인지 미리 알려주는 역할을 한다.
num: int = 1
name: str = "홍길동"
numbers: list = [1, 2, 3]

함수에 타입 지정

  • 함수의 매개변수에도 같은 규칙을 적용하여 매개변수의 타입을 명시.
  • -> int처럼 화살표 기호를 사용해 함수의 반환값 타입도 명시할 수 있다.
  • 함수를 사용하는 사람이 어떤 타입의 인수를 넘겨야 하고, 어떤 타입의 값을 반환받을지 쉽게 알 수 있다.
def add(a: int, b: int) -> int: 
    return a + b

def greet(name: str) -> str:
    return f"안녕하세요, {name}님!"

def get_user_info(user_id: int) -> dict:
    return {"id": user_id, "name": "홍길동"}

▶︎typing 모듈과 내장 타입의 발전

  • 기본 타입 어노테이션(int, str, list 등)만으로도 많은 경우를 처리할 수 있지만, 더 구체적인 타입 정보가 필요할 때 typing 모듈 사용.

  • 파이썬 3.9부터는 내장 타입(list, dict, tuple 등)을 직접 사용할 수 있게 되어 typing 모듈의 List, Dict, Tuple을 가져올 필요가 없어졌다.

    # 파이썬 3.5~3.8: typing 모듈 필수
    from typing import List, Dict, Tuple, Optional
    
    numbers: List[int] = [1, 2, 3]
    user_info: Dict[str, int] = {"age": 30}
    
    # 파이썬 3.9 이상: 내장 타입 사용 가능  
    numbers: list[int] = [1, 2, 3]
    user_info: dict[str, int] = {"age": 30}
  • 하지만 여전히 typing 모듈이 필요한 경우들이 있다.

    from typing import Optional, Union, Callable, Any
    
    # 1. Optional - None이 가능한 경우
    user_name: Optional[str] = None  # str 또는 None
    
    # 2. Union - 여러 타입이 가능한 경우  
    user_id: Union[int, str] = "jenny"  # 정수 또는 문자열 (user_id로 정수도 사용가능)
    
    # 3. Callable - 함수 타입 지정
    def process_data(callback: Callable[[int], str]) -> str:
        return callback(42)
    
    # 4. Any - 모든 타입 허용 (비상시에만 사용)
    unknown_data: Any = {"key": "value"}
    
    # 5. 복잡한 중첩 구조
    nested_data: dict[str, list[Optional[int]]] = {
        "scores": [95, None, 87, None]
    }

▶︎mypy

  • 파이썬은 타입 어노테이션으로 매개변수의 타입을 명시하더라도 다음과 같이 다른 타입의 인수를 입력할 수 있다.
    • 파이썬 타입 어노테이션이 강제적인 타입 체크가 아닌 단순한 힌트 역할만 하기 때문.
    • 타입 어노테이션을 무시하고도 프로그램이 정상적으로 동작한다.
def add(a: int, b: int) -> int: 
    return a+b

result = add(3, 3.4)
print(result)  # 6.4
  • 파이썬 자체로는 타입 어노테이션을 검사하지 않지만, 별도 도구를 사용하면 더 적극적으로 타입을 검사할 수 있다. 그 대표적인 도구가 바로 mypy이다.
  • mypy: 정적 타입 검사기. 코드를 실행하기 전에 타입 어노테이션이 올바른지 미리 확인해준다. mypy는 파이썬 표준 라이브러리가 아니므로 pip install mypy 설치해야 한다.
  • 대규모 프로젝트나 팀 개발에서는 코드의 가독성과 유지보수성을 높이기 위해 타입 어노테이션을 적극적으로 활용하고 있다. FastAPI, Django 등 인기 있는 프레임워크들도 타입 어노테이션을 적극 지원하므로, 현대적인 파이썬 개발에서는 필수적인 기능이라고 할 수 있다.
profile
난 🥬

0개의 댓글