느슨한 타입(loosely typed)의 동적(dynamic) 언어
정적타입(Statically typed) vs 동적타입 (Dynamically typed)
- 정적타입의 언어
정적타입 언어(Statically typed language)는 컴파일 시 변수의 타입이 결정되는 언어를 말합니다.
따라서, 프로그래머가 변수에 들어갈 값의 형태에 따라 직접 변수의 타입을 명시해줘야 합니다.
String num = "123"
int num =123
정적언어라는 것은 위에서 언급한 '타입' 즉 자료형을 컴파일 시에 결정하는 것 입니다.
컴파일 시에 자료형에 맞지 않는 값이 들어있으면 컴파일 에러가 발생합니다.
정적타입의 언어로는 Java, C, C++, C#, Scala, Fortran, Haskell, ML, Pascal 등이 있습니다.
- 타입 에러로 인한 문제점을 초기에 발견할 수있어 타입의 안정성이 높음
- 컴파일할때 타입을 정해주기 때문에 실행 속도가 빠름
- 단점
1.매 코드 작성 시 마다 타입을 결정해줘야하는 번거로움
2.동적타입의 언어
동적타입 언어(Dynamically typed languages)는 컴파일 시 자료형을 정하는 것이 아니라 런타임 시 결정됩니다
let num =123
num ="123"
두 번째 줄에 num을 String으로 다시 선언하더라도 타입 에러 없이 컴파일 됩니다.
동적타입 언어로는 Groovy, Python, JavaScript, Ruby, Smalltalk, Lisp, Objective-C, PHP, Prolog 등이 있습니다
- 런타임까지 타입에 대한 결정을 미룰 수 있어 유연성이 높음
- 컴파일시 타입을 명시 할 필요가 없어 빠르게 코드를 작성 할 수 있음.
- 실행 도중 변수에 예상치 못한 타입이 들어와 타입에러가 발생 할 수 있음.
동적타입 언어는 런타임 시 확인할 수 밖에 없기 때문에, 코드가 길고 복잡해질 경우 타입 에러를 찾기가 어려워 집니다.
이러한 불편함을 해소하기 위해 TypeScipt나 Flow 등을 사용할 수 있습니다.
JavaScript의 자료형
JavaScript의 타입
- 원시값 ( 객체를 제외한 모든 타입은 불변값을 정의한다.)
- Boolean 타입 ( true, false )
- Null 타입
- Undefined 타입
- Number 타입
- Bigint 타입
- String 타입
- Symbol 타입
Undefined 와 null의 차이점
undefined은 변수를 선언하고 값을 할당하지 않은 상태, null은 변수를 선언하고 빈 값을 할당한 상태(의도적 빈 객체)이다.
즉, undefined는 자료형이 없는 상태이다.
따라서 typeof를 통해 자료형을 확인해보면 null은 object로, undefined는 undefined가 출력된다.
- typeof undefined는 출력하면 undefined이다.
- typeof null은 출력하면 object이다. 하지만 이는 여전히 원시 타입(primitive value)로, JavaScript에서는 구현 버그로 간주한다.
- undefined == null은 true이다.