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

자바스크립트이 모든 값은 데이터 타입을 갖는다. 그렇다면 변수 역시 데이터 타입을 가질 수 있는지 생각해보아야 한다.

 

먼저 요약하자면,

정적 타입 언어에서 변수는 데이터타입을 가지지만

자바스크립트같은 (동적타이핑을 수행하는)동적타입 언어에서 변수는 타입을 갖지 않는다.

 

 

C나 자바 같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언이라 한다. 가령 C에서 char c;라고 선언하면 c변수에는 1바이트 정수 타입의 값(-128~-127)만 할당할 수 있다.

int num; 이라고 선언하면 num 변수에는 4바이트 정수 타입의 값(-2,124,483,648~2,124,483,647) 만 할당할 수 있다.

 

정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다. 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막는다. 이를 통해 타입의 일관성을 강제함으로써 더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다. 

 

자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않는다. 다만 var, let, const 키워드를 사용해 변수를 선언할 뿐이다. 자바스크립트의 변수는 정적 타입 언어와 같이 미리 선언한 데이터 타입의 값만 할당할 수 있는 것이 아니다. 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.

 

변수 선언 후 다양한 데이터 값을 할당한 다음 typeof 연산자로 변수의 데이터 타입을 조사하면,

typeof 연산자는 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.

가 아니라

정확히 말하면 변수의 데이터 타입을 반환하는 것이 아니라

변수에 할당된 값의 데이터 타입을 반환하는 것이다.

 

자바스크립트의 변수에는 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있으므로 정적 타입 언어에서 말하는 데이터 타입과 개념이 다르다. 정적 타입 언어는 변수 선언 시점에 변수의 타입이 결정되고 변수의 타입을 변경할 수 없다. 자바스크립트에서는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수와 타입을 언제든지 자유롭게 변경할 수 있다.

 

다시 말해, 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다(당연히 상수인 const 제외). 이러한 특징을 동적 타이핑이라고 하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입 언어라 한다. 대표적인 동적 타입 언어로는 자바스크립트, 파이썬, 루비 등이 있다.

 

정리하자면 자바스크립트의 변수는 타입을 가지지 않는다.

하지만 값이 타입을 갖는다.

따라서 현재 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정된다고 표현하는 것이 바람직하다.

 

동적 타입 언어에서 변수 주의사항

- 변수는 꼭 필요한 경우에 제한적으로 사용한다. 변수 값은 재할당에 의해 언제든지 변경될 수 있다. 이로 인해 동적 타입 언어인 자바스크립트는 타입을 잘못 예측해 오류가 발생할 가능성이 크다. 변수의 개수가 ㅁ낳을수록 오류가 발생할 확률도 높아진다. 따라서 변수의 무분별한 남발은 금물이다. 필요한만큼 최소한으로 유지하도록 노력하자

- 변수 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제하자. 변수의 유효범위가 넓을수록 변수로 인해 오류가 발생할 확률이 높아진다.

- 전역 변수는 최대한 사용하지 않도록 한다. 어디서든지 참조/변경 가능한 전역변수는 의도치 않게 값이 변경될 가능성이 높고 다른 코드에 영향을 줄 가능성도 높다. 

- 변수보다는 상수를 사용해 값의 변경을 억제하자.

- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍하자.

+ Recent posts