파이썬 강좌 – 어노테이션 – 수월하게 프로그래밍하기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

어노테이션은 사전적 의미로는 주석입니다. 하지만 우리가 #으로 작성하는 주석과 혼동될 수 있기 때문에 어노테이션이라고 계속 말하도록 하겠습니다. 그리고 구글에다가 검색해보다 알게 된 사실인데, 자바에서는 어노테이션이 파이썬의 데코레이터(추가 예정)와 대응되는 것 같습니다. 파이썬의 어노테이션은 다소 다른 용도입니다.


어노테이션이 적용된 모습

제가 쓰는 Visual Studio Code를 포함하여 요즘의 텍스트 에디터 및 IDE는 타입을 추정하는 능력이 탁월합니다. 대부분의 상황에서는 파이썬의 어노테이션으로 타입을 명시할 필요가 없지요. 하지만 그 강력한 타입 추정도 잡아내지 못하는 타입이 있기 마련입니다. 아래 예제를 참조해주세요.

어노테이션이 적용된 모습

에디터 입장에서는 기가 찰 겁니다. 함수의 인수로 뭐가 올지 모르는데 어떻게 그게 Watch 클래스인 걸 알겠습니까? 타입 추정이 제대로 되지 않는다는 게 당연해보입니다. 그럴 때는 함수의 인수에 직접 어노테이션을 적용하면 됩니다. 인수의 이름 뒤에 : 타입을 작성하면 됩니다.

다른 사람들이 정성스레 만들어놓은 모듈을 끌고 와서 간단한 프로그램을 만든다 하더라도, 이제 100줄 넘기기는 우스우실 것입니다. 직접 클래스를 설계해야 하는 상황에 온다면, 200~300줄도 가볍습니다. 이렇게 길어지는 코드에서, 매번 클래스의 어떤 속성을 무슨 이름으로 짜넣었는지 찾는다고 스크롤을 올리고 내리다 보면, 마우스 휠 밖에 왔다갔다 하지 못하는 스스로를 발견하게 됩니다. 이런 절망적인 상황에서 어노테이션은 한 줄기 빛이자 희망입니다.


기본적인 사용법

사용하는 위치는 크게 세 가지로 나뉩니다. 함수의 인수, 함수의 반환, 변수의 정의 입니다. 아래 코드는 그 모든 것을 표현하는 코드입니다. 변수나 인수의 경우 변수명과 = 사이에 : 타입을 적어서 표시하고, 함수의 반환값의 경우 함수 블록이 시작하기 직전에 -> 타입으로 적어서 표시합니다.

def something(num: int = 10) -> Time:
    w: Watch = notExistFunction()
    return w.time + num

코드에서 무엇이 어떻게 어노테이션되었는가는 아래 표를 참조해주세요.

구분 어노테이션 된 타입 비고
something의 인수 num int 기본값이 10이다.
something의 리턴 값 Time
지역 변수 w Watch notExistFunction()의 결과가 대입되었다.

컨테이너 사용법

리스트와 딕셔너리 같은 컨테이너의 경우 조금 난감합니다. 왜냐하면 해당 변수(인수)가 리스트인 것 까지는 어노테이션으로 쉽게 할 수 있으나, 그 안에 있는 요소가 무슨 타입인지는 지정할 수 없기 때문입니다. 아래 예제에서 가장 하단에 watchList.pop()까지는 타입 추정이 잘 작동하지만, 이 리스트 안에 어떤 요소가 있는지는 추정할 수 없으므로 getTime()은 직접 쳐서 넣어야 합니다.

class Watch:
    def __init__(self, time, color):
        self.time = time
        self.color = color

    def getTime(self):
        return self.time

def handleWatchList(watchList: list):
    watchList.pop().getTime()

하지만 이를 극적으로 바꿀 수 있습니다. 아래 예제대로 한다면 리스트 내부에 있는 요소까지 에디터에서 다룰 수 있게 됩니다.

from typing import List

class Watch:
    def __init__(self, time, color):
        self.time = time
        self.color = color

    def getTime(self):
        return self.time


def handleWatchList(watchList: List[Watch]):
    watchList.pop().getTime()

우선 typing 모듈에서 List를 임포트합니다. 이 List 클래스는 어노테이션만을 위한 클래스입니다. 이 List에 대괄호를 이용해 내부에 있는 요소의 타입까지 지정할 수 있습니다. 예를 들어 listWatch 객체가 들어간다면 List[Watch]로 지정하면 됩니다.


딕셔너리도 다소 비슷한데요, 딕셔너리는 Dict와 대괄호를 이용하며, 대괄호 안에 키의 타입과 값의 타입을 각각 설정할 수 있습니다.

from typing import Dict

class Watch:
    def __init__(self, time, color):
        self.time = time
        self.color = color

    def getTime(self):
        return self.time


def handleWatchList(watchDict: Dict[str, Watch]):
    watchDict.popitem()[1].getTime()

고급 – 클래스 속성과 일반 속성

클래스 속성과 일반 속성은 공식 문서를 참조하도록 하겠습니다.

from typing import ClassVar, Dict

class BasicStarship:
    captain: str = 'Picard'               # 기본값이 있는 일반 속성
    damage: int                           # 기본값이 없는 일반 속성
    stats: ClassVar[Dict[str, int]] = {}  # 클래스 속성

고급 – 함수

함수, 즉 호출할 수 있는 객체를 나타내고 싶을 때도 있을텐데요, 그럴 때는 Callable를 이용하면 됩니다. Callable의 사용법은 Callable[[인수1타입, 인수2타입, ...], 리턴타입]으로 하면 됩니다. 아래는 간단한 예제입니다.

def executeCallback(num:int, callback:Callable[[int, int], str]):
    p = callback(num, 10)
    p.lower()

인수나 리턴에 아무것도 넣고 싶지 않다면 None을 활용하면 됩니다.

def executeCallback(num:int, callback:Callable[[None], None]):
    callback()

유의사항

어노테이션을 적용했다고 해서 해당 타입을 강제로 사용해야 하는 것은 아닙니다. 오히려 실제 프로그램이 실행될 때에는 어노테이션은 정말로 아무런 역할을 하지 않습니다! 오로지 어노테이션은 에디터로 작업할 때 유용하기 위해 지정하는 것임을 유념해주세요. 아래처럼 해도 실행에는 아무런 지장이 없습니다.

def add(num: str) -> str:
    return 10 + num

print(add(20))
30

레퍼런스

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

One thought on “파이썬 강좌 – 어노테이션 – 수월하게 프로그래밍하기

  1. 잘 읽고 갑니다. 공식 문서에 있는 내용을 번역해서 쉽게 풀어 설명해주시니 접근성이 높아지네요. 자주 참고할 것 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to top