본문 바로가기

Python

Python Dynamic Typing

앞서 파이썬의 특징을 살펴볼 때 봤던 Dynamic Typing에 대해서 이야기해보려고 한다.

프로그래밍 언어들은 각자 기본적인 자료형인 Primitive Data Type을 가진다. 이러한 자료형들을 어떻게 결정하는지를 Typing이라고 한다. 즉, 처음 특정 데이터의 data type을 결정하는 것을 Typing이라고 한다. Python은 기본적으로 Dynamic typing이 지원된다. 일반적으로 Typing은 Static Typing과 Dynamic Typing으로 구분된다. 

💡Static VS Dynamic
간단히 자주 등장하는 static과 dynamic에 대해서 구분의 느낌을 살리자면, Static은 실행 이전에 정의, 결정된다는 느낌이고, Dynamic의 경우 실행 시점에 결정된다는 느낌을 가져가면 될 것 같다. 

 

C++을 쓰다가, Python을 사용해보신 분들은 느끼겠지만, Python은 자동으로 메모리 공간을 할당하기에 상대적으로 코딩을 함에 있어서는 간편함이 존재한다. 물론 이로 인해 다양한 문제들이 수반되기도 한다.( 유지보수의 어려움 등등)  어쨌든 C++과 같은 static typing 언어와는 다르게 변수의 데이터 타입을 미리 선언하지 않아도, Dynamic 한 특성으로 인해 짜여있는 코드가 실행되는 시점에 typing이 일어나서 자동으로 데이터의 타입을 추론한다. 즉, 코드 작성 시 우리가 어떤 변수에 대해 자료형을 의도하고 있는 것을 인터프리터가 자동으로 추론해서 코드 실행 시점에서 동작시켜준다는 것이다. 하지만, 우리의 의도가 코드에 잘 안 담겨 있다면 잘못된 추론이 발생할 것이고 이는 문제를 발생시킬 것이다.

k = 10
int k = 10

 

이러한 동적 타이핑이 선호되지 않는 이유는 뭘까?


1. 유지보수적 관점
과연 자동으로 타입이 결정되는 것이 유용하기만할까? 물론, 처음 언어를 배우는 입장에서는 자료형이라는 개념을 덜 신경 쓰고 코드를 짜도 되니 손쉽게 느껴질 수 있다. 하지만, 시간이 지나 무거운 프로그램을 짜거나, 촘촘히 연결된 프로그램을 짜야될 경우 문제가 발생하기 쉽다. 만약 우리가 k라는 변수에 int자료형의 10을 넣고 싶다는 의도를 가졌다고 하자. 그런데, 이 코드가 실행되는 시점에서 우리의 의도가 코드에 정확히 담겨있지 않아서 k의 자료형을 float으로 추론한다면 어떻게 될까? 물론 대개의 경우 문제가 없을 수도 있고, 이 예시의 경우 문제가 될 가능성이 높지는 않은 예시다. 하지만, 어쨌든 우리가 만약 중요한 프로그램을 다루는 입장에서 우리가 의도한 대로가 아니게 타입이 추론되어서 문제가 발생할 수 있고, 이는 큰 문제를 불러일으킬 수도 있다는 것이다. 물론 디버깅을 하면 되겠지만, 프로그래밍적인 관점에서 이러한 위험을 감수하고 코딩을 하는 것보다는 명시적인 타이핑을 통해서 위험 가능성을 최대한 줄이고 싶다.

2. 디버깅
앞서 문제 발생시 디버깅하면 된다고 간단히 이야기했는데, 무거운 프로그램에서는 간단한 것이 아니다. 우리가 파이썬을 통해서 이러한 dynamic typing으로 인해서 발생하는 문제를 파악하기 위해서는 프로그램을 실행해야 한다. 이는 우리의 프로그램이 무거울수록 불편해진다. 반면, 이러한 간단한 문제는 Static Typing 언어의 경우 컴파일 전에, text editor를 통해서 체크가 된다. (굳이 실행하지 않더라도!)

3. 속도
Dyanmic Typing의 경우 결국 내부적으로 type을 추론해주는 과정이 추가적으로 들어가기에 명시적으로 tpying을 해주는 static typing에 비해서 추론과정을 사람이 아닌 컴퓨터에게 떠넘기게 되기 때문에 시간이 더 들어가게 된다. 물론 이 문제의 경우 최근에는 하드웨어의 빠른 발전으로 인해 신경쓸 필요가 거의 없다.

 

그렇다면 이러한 Dynamic Typing 언어인 Python같은 언어를 사용하면 안 되는 걸까? 그건 아니다. 개인적으로 파이썬의 장점이자 단점은 많은 것을 제공해준다는 점이라고 생각한다. 너무 많은 점을 제공하는 것이 문제를 발생시키기도 하고, 오히려 혼란을 가져올 수 있다는 점에서 단점이라고 생각하지만, 거꾸로 이만큼 많은 것들을 제공해주기에 내가 잘 알고만 있다면 명확히 다룰 수만 있다면 훨씬 유용하다고 생각한다.

실제로 Python에서는 별개로 Type Hint라는 Type 추론시에 명시된 type hint를 통해서 더 쉽게 type을 추론하고 프로그래머의 의도대로 코드가 작성하도록 하기 위해서 사용하고 있다. 물론 첫 번째처럼 일반적인 변수 선언에서보다는 각각의 기능들의 input, output의 타입을 명확히 함으로써 팀 협업에서의 소통을 원활히 하게 하고, 문제의 발생을 최대한 줄이기 위해서 class나 function들의 parameter에 type hint를 사용하는 것이 일반적이다.

# Python Type Hint
'''
Var : Type(Type Hint) = Value
'''

a : int = 3
b : str = 'String'
c : list = [1,2,3]


def func( param1 : int, param2 : str, param3 : list):
    '''
    code here..
    '''
    return output

 

References :

https://blog.naver.com/PostView.nhn?blogId=youndok&logNo=222213832961 

 

정적 타이핑(static typing) 및 동적 타이핑(dynamic typing) 의미 및 파이썬 비교

"타이핑(typing)"이란 프로그램 내에서 변수의 데이터 타입(자료형; data type)을 정의하는 하는...

blog.naver.com

https://pubul.tistory.com/153

 

2. 사람들은 왜 동적 타이핑을 싫어할까?

안녕하세요, 푸불입니다. 최근에는 입문 언어가 Python이 대세가 되었습니다. 그리고 비교적 접근성이 좋다는 이유로 Javascript를 선호하는 경우도 많이 보입니다. 일단 기본적으로 이런 언어들은 

pubul.tistory.com

 

'Python' 카테고리의 다른 글

Python - Variable Length Arguments  (0) 2022.02.02
Python - Iterable / Iterator / Generator  (0) 2022.02.01
Python Scoping Rule ( by LEGB rule )  (0) 2022.02.01
Python - Call by Object Reference  (0) 2022.02.01
Python이라는 언어  (0) 2022.01.24