정적 타입시스템의 필요성

HS K·2023년 2월 9일
0
post-custom-banner

정적 타입시스템의 필요성

개발자는 사용자에게 안정적으로 알맞은 컨텐츠를 서빙하기 위해 여러가지 방법을 쓴다. 서버의 트래픽이 증가하더라도 서버가 다운되지 않게 네트워크 장비에 로드밸런서를 두거나 대역폭을 늘리거나 HA를 하거나 DB샤딩을 하는 등 여러가지 방법으로 서비스의 안정성을 추구한다. 그 중 하나의 방법이 바로 정적 타입시스템이다.

타입시스템

언어의 기본 타입 또는 개발자가 정의한 타입을 기반으로 해당 타입을 언어와 연관시키는 메커니즘을 뜻한다.
타입 동등, 타입 호환, 타입 추론에 대한 규칙을 지킨다면 타입시스템이라고 볼 수 있다.

  • 동등 : 두 타입이 동일할 때 적용되는 규칙(int=int)
  • 호환 : 두가지 타입이 정확히 일치하지 않더라도 어느정도 호환이 되는지를 나타내는 규칙 (any := int)
  • 추론 : 타입이 정의되어있지 않지만 주변문맥에 따라 타입이 결정되는규칙(a=3일때 a는 int)


모든 언어는 이러한 타입시스템을 가지고 있으며 동적 타입과 정적 타입으로 나눠진다.

동적 타입 : 런타임에 모든 변수의 유형을 결정하고 잘못된 경우 예외가 발생한다. (int, string 같은 타입을 정의하지 않고, 런타임에 타입에 대한 에러가 발생한다)

  • ex) PHP, JS, PYTHON

정적 타입 : 컴파일 타임에 모든 변수의 유형을 결정하고 잘못된 경우 예외가 발생한다.(타입을 명시하고, 타입에 대한 에러를 컴파일 타임에 잡을 수 있다)

  • ex) C, C++, JAVA


여기서 정적 타입을 정적 타입시스템이라고 할 수 있는데, 동적타입의 언어를 정적타입의 언어의 특징들을 부여해 시스템의 안정성을 높이자는게 요즘 추세이다.

예를 들어 자바스크립트의 경우 타입스크립트의 등장, 파이썬의 경우 3.5버전부터 등장한 타입어노테이션이 있다.
ex) typescript

정적 타입시스템의 필요성

정적 타입시스템은 프로그램의 가독성을 높이고 타입에 대한 에러를 미리 방지할 수 있다.

  1. 타입을 명시해서 나중에 다른 개발자가 보더라도 어떠한 매개변수를 넣고 이 함수가 어떠한 값을 반환하는지 명시적으로 파악할 수 있게 만든다.

  1. 어떠한 함수, 또는 API에 대한 여러가지의 타입으로 이루어진 값이 발생될 수 있는데, 해당값들에 대한 대처를 “미리”할 수 있다. (주로 외부API에 요청을 하고 그 이후에 로직을 만들 때)
  • 예측하기 어려운 return 값을 정적 타입 시스템을 통해 컴파일 타임에서 미리 막을 수 있다.
  1. 매개변수를 잘못 할당하거나 등 개발자의 잔실수를 막아줄 수도 있다.

파이썬 어노테이션을 통한 정적타입시스템

파이썬은 3.5부터 타입어노테이션과 typing을 기반으로 타입이 명시된 파이썬 코드를 작성할 수 있으며, mypy를 통해 정적 테스팅을 할 수 있다.

  • 마치 컴파일 시점에 타입을 검사하여 타입을 추출하는 언어처럼 효능을 낼 수 있다.

기존 파이썬에 명시된 int, float, str 등의 타입 + typing에 정의된 타입을 기반으로 쓴다.

상수를 나타내는 Final, 정수형을 나타내는 int, 몇가지 중 하나라는 의미로 Union도 쓰는 것을 볼 수 있다.

TIME_OUT: Final[int] = 10
def add(a: int, b: int) -> int: return a+b
def toString(num: Union[int, float]) -> str: return str(num)

mypy

파이썬 타입 정적 검사기 모듈 mypy모듈설치

pip install mypy

※ 이 때 만약 requests모듈을 쓴다면 types-requests도 설치해야한다.
mypy는 일부 모듈을 인식하지 않는 버그가 있기 때문에 옵션을 적용해서 실행해준다.

mypy main.py --namespace-packages

(여기서 main.py는 실행하고자하는 파일명)

mypy <파일명> <옵션>

으로 실행한다.


before

coin_dict_list = read_file("constant/COIN.txt") for co in coin_dict_list:

After

coin_dict_list = read_file("constant/COIN.txt") if not coin_dict_list:
print("파일에 관한 에러가 발생했습니다.")
return None
for co in coin_dict_list:

coin_dict_list에는 이터러블한 타입이 들어가지 않을 수 있다.
이러한 부분에 대한 에러를 분기점을 통해 미리 방지 되는 것을 볼 수 있다.

profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!
post-custom-banner

0개의 댓글