Programming Language들 중에서 static typing을 사용하는 언어들의 경우
compile time 에 type에 대한 검사가 이루어짐!
Compiler language와 static typing language는 독립적인 개념이나
과거엔 compiler lanaguage의 대다수가 static language였음.
다음의 특징을 가짐.
variable은 특정 type을 갖도록 정의되며, 이는 일반적으로 compile time에 type이 고정됨.
해당 variable의 type이 명시적(explicitly)으로 정해지는 경우가 대다수 (type inference에 의해 자동으로 결정되는 언어도 있음)
explicit casting(명시적 형변환)을 하는 경우를 제외하곤 해당 type이 변하지 않음.
C, C++, Java 등이 static language의 대표적 예들임.
Static Language에서 variable은 type이 지정되며, decalration의 시점에 해당 type에 따른 적절한 크기의 memory location(실제 data가 저장되는 공간을 의미)에 binding 됨.
variable인 myVar에 이미 String이라는 타입이 지정됨.
Dynamic (Typing) Language
Dynamic language에서는 변수(variable)가 고정된 타입을 갖지 않으며, 실제로는 변수가 참조하는 객체(object)가 타입을 가진다. 즉, 타입 정보는 런타임에 객체 수준에서 체크 및 관리된다
대표적인 예로, Python, JavaScript, PHP, Ruby 등임.
아래의 내용은 Strong Typing과 Dynamic Typing이 사용되는 Python의 관점에서 설명한 내용임:
Variable은 단순히 특정 object (=memory가 할당되어 있고 특정 type을 가짐)를 참조하는 name (or reference) 에 불과함 (즉, Type이 없음).
Variable assignment (변수에 값을 할당)할 때 해당 variable이 가르키는 object가 결정되는 것임.
assignment를 다시 할 경우, 해당 variable이 가르키고 있는 object가 바뀌는 것임.
만일 다른 type의 object를 assignment했다면 마치 variable의 type이 바뀐 것처럼 보임 (엄밀하게 애기하면 type이 바뀌는 것이 아닌 참조 대상 object 자체가 바뀐 것임.)
object는 strong typing으로 object는 type이 바뀌지 않음.
이 같은 dynamic language는 static language에 비해 수행속도가 느리다는 단점을 가지나 JIT컴파일어나 런타임 최적화 등을 통해 성능이 많이 개선되고 있음.
Python은 대표적인 dynamic language로서 Python Virtual Machine(PVM)을 통해 bytecode를 실행한다. 이로 인해 실행 성능 면에서는 native compiled language에 비해 불리하지만, dynamic language의 편리함과 높은 생산성을 유지할 수 있다.
Dynamic Language에서 Variable은 어떤 object에 가르키는(참조하는) name (=reference)에 불과하며 type 등의 속성을 가지고 있지 않음.