(Keyword) 정적 타입과 동적 타입

정적 타입과 동적 타입

프로그래밍 언어를 구분하는 방법 중 하나로 정적 타입(statically typed)동적 타입(dynamically typed) 가 있다.

정적 타입은 컴파일 시점에 변수의 타입이 확정되고, 동적 타입은 런타임 시점에 확정된다는 차이가 있는데,

이번 포스팅에서는 정적 타입과 동적 타입의 특징에 대해 좀 더 상세하게 알아보자.

Statically Type (정적 타입)

정적 타입의 대표적인 언어로는 C가 있다.

아래 예제 코드를 보자.

1
2
3
int add(int x, int y) {
return x + y;
}

위의 코드에서 함수명, 파라미터로 주어진 값들의 타입은 물론 결과값의 타입까지 알 수 있다.

예를 들어 y가 문자열이나 별도의 객체였다면 별도의 오퍼레이팅 처리가 없다면 문법적인 오류로 인해 컴파일이 실패할 것이다.

이러한 컴파일 시점에서의 오류 검출로 인해 런타임시 오류의 범주를 줄일 수 있고, 최적화 및 메모리 관리가 수월한 것이 장점이지만

언어 특성상 문법 규칙을 제대로 다 준수해야하는 단점이 있다.

이러한 특성을 가진 언어들은 Java, C, C++, C#, Scala, Fortran, Haskell, Pascal 등이 있다.

Dynamically Type (동적 타입)

동적 타입의 대표적인 언어로는 Python이 있다.

아래 예제 코드를 보자.

1
2
def add(x, y):
return x + y

위의 코드에는 함수의 이름인 add만 알 수 있을 뿐 파라미터로 주어진 xy가 어떤 타입인지, 그리고 결과값이 어떤 타입인지 알수가 없다.

이는 Python이 동적 타입의 언어로, 각 타입들이 런타임에서 결정되기 때문이다.

런타임시 그때그때 결정되는 이 특징에서 인터프리터 언어들을 떠올렸다면 정답이다.

이 동적 타입 언어를 사용하면 상대적으로 자유로운 문법을 구사할 수 있으나, 사전에 타입 체크가 안되는 만큼 오류에 취약하고 최적화가 힘든 단점이 있다.

메모리 관리 측면에서의 비교

Memory

정적 타입과 동적 타입에 대해 상술하면서, 메모리 관리의 용이성에 대해 언급하였다.

이번엔 정적 타입과 동적 타입이 어떤 방식으로 메모리를 관리하는 지 살펴보자.

정적 타입의 변수는 두 가지 메모리 구조를 사용한다.

먼저 사전에 타입과 크기가 정해진 변수의 경우 Stack 메모리에 적재하고, 이후 동적 할당 등의 경우 Heap 메모리 적재한다.

반면 동적 타입의 경우 타입을 런타임시에 알 수 있기 때문에, 모두 Heap 메모리에 적재하게 된다.

개발자가 지정한 변수의 이름또한 정적 타입의 경우 메모리에 적재되지않지만, 런타임에 적재하는 동적 타입의 경우 변수의 이름까지 같이 적재한다.

이는 정적 타입 언어가 사전에 타입과 크기를 전부 알고 있고, 이를 관리할 테이블을 별도로 가지고 있기 때문에 해당 변수의 메모리 주소를 사용하기 때문이다.

이 관리 테이블이 한 번 생성되면 변동될 일이 없기때문에 Statically(정적) 인 것이며,

동적 타입은 런타임에서 언제 변수의 생성과 소멸일 일어날지 모르기 때문에 메모리 주소가 계속해서 변하고

변수의 이름을 통해 추적해야하기 때문에 Dynamically(동적) 인 것이다.

이러한 특성을 가진 언어들은 Groovy, Python, Javascript, Ruby, Lisp, Objective-C, PHP 등이 있다.