개발/Javascript

동적 타입 언어와 정적 타입 언어

lanace 2020. 9. 10. 16:34

면접관으로 들어갈때 종종 타입이 정적인 언어와 동적인 언어를 비교해보라는 질문을 하는데 내가 이 질문을 받으면 얼마나 멋지게 대답할지 문득 궁금해졌다. 그래서 내 생각을 정리해볼겸 글로 남기기로 하였다.

 

Stack overflow에서는?

일단 Stack overflow에서 꽤 추천수를 받은 답을 보자.

 

정적 타입 언어

compile time에 변수의 타입을 알고있다면 정적 타입 언어이다.

Java나 C, C++과 같은 언어에서는 개발자가 각각의 변수에 특정한 타입들을 지정해줘야한다.

Ocaml, Haskell, Scala, Kotlin 과 같은 언어에서는 타입의 인터페이스를 제공하고, 시스템이 변수의 타입을 결정할 수 있도록 한다.

여기서의 장점은 모든 종류의 체킹을 compiler에 의해서 확인할 수 있어서 빨리 버그들을 찾아낼 수 있다는 것이다. 예를들면 C, C++, Java, Rust, Go, Scala와 같은 언어들이 있다.

 

동적 타입 언어

타입이 run-time과 연관되어있고, 변수와 필드 등에 이름이 없다면 동적 타입 언어이다.

이것은 특정 타입을 매번 적지 않기때문에 개발자가 꽤 빠르게 코드를 쓸수있다는걸 의미한다. (unless using a statically-typed language with type inference).

예를들면 Perl, Ruby, Python, PHP, JavaScript 와 같은 언어들이 있다.

대부분의 스크립트 언어들은 정적 타입 체킹을 하는 컴파일러가 없는것을 기본으로 한다. 하지만 변수의 타입에서 발생하는 버그들을 인터프리터 misinterpreting을 통해서 찾을 수 있다.

운좋게도, 스크립트는 작게 짜여지는 경향이 있어서 버그가 숨겨져서 많이 발생하지 않는것처럼 보인다.

대부분의 동적 타입 언어들은 타입에 대한 정보를 제공하는걸 허락하지만 필수는 아니다.

Rascal이라는 언어는 함수에 동적 타입을 허락하면서도, 정적 타입도 허용하고 있다.

정리를 해보면 정적 타입의 언어와 동적 타입의 언어를 나누는 기준은 컴파일 타임에 타입을 알 수 있는지, 없는지 이다. 정적 타입은 컴파일 타입에 변수의 타입을 알 수 있고, 동적 타입은 런타임에 타입을 알 수 있다.

그렇다면 어떤 장단점이 있을까?

 

 

개발자한테 미치는 영향

타입에 대한 접근법의 차이로 인해서 개발에 엄청 큰 영향을 미치거나 하지는 않는다. 하지만 한두가지 정도의 장단점은 있다.

  • 정적 타입 언어에서 처음 변수를 할당할때 어떤 값이 들어갈지 정확히 예측해서 선언해줘야되는 추가적인 초기화 노력이 요구된다. 만약에 캐스팅을 한다면 어떻게 캐스팅 할지도 잘 처리해주어야 한다. 대신 컴파일타임에 정적분석을 통해 버그를 미리 잡아낼 수 있다.
  • 동적 타입 언어에서 변수 정의할때 좀더 빠르게 선언하고 개발할 수 있다. 하지만 타입에러를 찾아낼 때 조금 어려움이 있다. 코드 구조가 잘 짜여져있는지 확인하는것은 필수다.

 

 

결론적으로,

언어가 정적타입이든 동적타입이든 어떻게 개발자가 코드를 짜기 나름이다. 하지만 어떻게 변수의 타입을 결정할지는 고려되어야 한다.

동적: 타입은 변수의 값에 의해서 결정된다. 즉, 변수의 값이 변경되면 변수의 타입은 변할 수 있다. 정적: 타입은 변수 스스로가 결정한다. 타입은 변할 수 없고, 이미 할당된 타입에 맞는 값만 들어갈 수 있다.

타입을 체크하는것은 컴파일을 하거나 인터프리팅을 하는 언어와는 상관이 없다.

컨셉적으로 어떤게 다른지를 아는것이 더 중요하다.

 

참고