C나 자바같은 정적타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 언어(explicit type declaration)라고 한다.
정적 타입 언어는 변수의 타입을 변경할 수 없으며 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.
만약 타입 체크를 통과하지 못했다면 에러를 발생시키고, 프로그램의 실행 자체를 막는다. 이를 통해 타입의 일관성을 강제함으로써 더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.
1. 느슨한 타입(loosely typed)의 동적(dynamic) 언어
Javascript의 변수는 Java나 C언어의 변수를 선언할 때처럼 어떤 특정한 타입을 선언하지 않는다. 다만 var, let, const 키워드 변수를 사용해서 변수를 선언한다. 모든 타입의 값들을 할당하거나 재할당하는 것이 가능하다
// msg 변수에 문자열을 할당하고, 정수를 재할당 함.
// 변수에 모든 타입을 할당 및 재할당하는 것이 가능하다.
let msg = "react 과제 화이팅"
msg = 222
Javascript 변수는 어떤 데이터 값이라도 자유롭게 할당할 수 있으므로 정적 타입 언어에서 말하는 데이터 타입과는 개념이 다르다. 정적 타입 언어는 변수 선언 시점에 변수의 타입이 결정되고, 변수의 타입을 변경할 수 없다.
Javascript 변수는 타입을 가질까? 기본적으로 변수는 타입을 갖지 않는다. 하지만 값은 타입을 갖는다.
Javascript에서는 값을 할당하는 시점에 변수의 타입이 동적으로 결정이되고 변수의 타입을 언제든지 자유롭게 변경할 수 있다.
Javascript 변수는 **선언이 아닌 “할당”에 의해 타입이 결정(타입 추론)**된다. 그리고 재할당에 의해 변수의 타입은 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑이라하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입 언어라고 한다.
느슨한 타입(loosely typed)의 동적(dynamic) 언어의 문제점은 무엇이고 보완할 수 있는 방법에는 무엇이 있을까?
(1) 문제점
Javascript는 느슨한 타입의 동적 언어이므로 변수 생성시에 Java나 C언어처럼 변수의 타입을 선언하지 않고, 변수에 어떤 값이라도 자유롭게 할당할 수 있다는 장점이 있다.
하지만 동적 타입 언어이기 때문에 이러한 문제점들이 존재한다.
- 변수의 값은 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다.
- 그리고 규모가 큰 프로젝트를 협업할 때 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되기도 한다. 즉, 숫자 타입의 변수일 것이라 예측했지만 사실은 문자열 타입의 변수일 수도 있다.
- 자바스크립트를 실행하는 도중에 변수에 예상치 못한 타입이 들어와 타입 에러가 발생할 수 있다.
- 동적 타입 언어는 런타임시 값을 할당하여 값을 통해 타입을 확인할 수 있기 때문에, 코드가 길고 복잡해질 경우 타입 에러를 찾기 어렵다는 문제점을 갖고 있다.
👉🏻 결국 동적 타입 언어는 유연성은 높지만 신뢰성이 떨어진다.
(2) 해결 방법
1) 변수를 사용할 때 조심하자!
변수를 사용할 때 지켜야 할 주의사항이 있다.
- 변수는 꼭 필요한 경우에 한해 제한적으로 사용한다.
- 변수 값은 재할당에 의해 언제든지 변경될 수 있다. 이로 인해 동적 타입 언어인 자바스크립트는 타입을 잘못 예측해 오류가 발생할 가능성이 크다. 변수의 개수가 많아질수록 오류가 발생할 확률이 높아지므로 꼭 필요한 경우에 한해 제한적으로 사용한다.
- 변수의 유효범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다. 변수의 유효범위가 넓으면 넓을수록 변수로 인해 오류가 발생할 확률이 높아진다.
- 전역 변수는 최대한 사용하지 않는다. 어디서든지 참조/변경 가능한 전역 변수는 의도치 않게 값이 변경될 가능성이 높고 다른 코드에 영향을 줄 가능성이 높다. 따라서 전역변수는 프로그램의 복잡성을 증가시키고, 처리 흐름을 추적하기 어렵게 만들고, 오류가 발생할 경우 오류의 원인을 특정하기 어렵게 만든다.
- 변수보다는 상수를 사용해 값의 변경을 억제한다. const를 사용하는 것을 권장한다.
- 변수의 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다. 변수 이름 뿐 아니라 모든 식별자(함수, 변수, 클래스 이름 등)는 존재 이유를 파아할 수 있는 적절한 이름으로 지어야 한다. 특히 식별자의 유효 범위가 넓을 수록 명확한 이름을 명명해야 한다.
2) Typescript를 사용해보자!
나는 위의 것들이 너무 귀찮다고 생각이 들면 Javascript의 단점을 보완하여 정적 타입 체크와 강력한 문법을 추가한 TypeScript를 사용하여 보완이 가능하다.
- TypeScript란?
언어는 크게 정적 타입과 동적 타입 언어로 구분할 수 있다.
타입 스크립트는 자바스크립트에 타입을 부여한 정적 타입 언어이다. 타입 스크립트를 브라우저에서 실행하려면 파일을 변환하는 컴파일 과정을 거쳐서 사용한다. 예를 들어 JAVA를 컴파일하면 bytecode 가 출력되고, C++를 컴파일하면 C가 출력되고, Typescript를 컴파일하면 Javascript가 출력이 된다.
정적 타입 언어는 런타임 이전에 타입이 올바른지 검사를 시행하며, 동적 타입 언어는 런타임에 프로그램의 타입이 올바른지에 대한 검사를 실행한다. 만약 레퍼런스 오류를 유발하는 코드가 존재한다면 정적 언어는 컴파일 하는 과정에서 오류를 출력하는 반면, 동적 언어는 해당 구문이 실행되는 시점에서 오류를 출력한다.
Typescript를 도입하는 프로젝트의 수가 증가하여 지난 2월 15일에 발표된 2021년 JS현황 보고서에 따르면 어떤 자바스크립트 기반의 언어를 사용하는지 묻는 징문에 69%가 타입스크립트를 쓴다고 답했다. 7년 전에 나온 것 치고 비중이 엄청 높아짐을 알 수 있었다…. wow 😮 타입스크립트는 꼭 공부해보기로..!!
'Frontend > Javascript' 카테고리의 다른 글
[TIL] JavaScript 형변환 (0) | 2022.07.21 |
---|---|
[TIL] 전역변수와 지역변수 (0) | 2022.05.27 |
[TIL] 객체 리터럴 (0) | 2022.05.27 |
[TIL] 함수 기본 (0) | 2022.05.25 |
[TIL] 배열 (0) | 2022.05.24 |