동적 타이핑과 정적 타이핑의 차이점은 변수의 타입이 결정하는 방식에 따라 둘로 나뉜다.
정적 타이핑은 내가 먼저 넣을 값의 데이터 타입을 작성해줘야 한다.
char a; //a 변수에는 1바이트 정수 타입의 값(-128~127)만 할당 가능
int b; //b 변수에는 4바이트 정수 타입의 값(-2,124,483,684~2,124,483,647)만 할당 가능
이처럼 정적 타입은 내가 먼저 넣을 값의 데이터 타입을 작성하고, 값 또한 이에 맞게 넣어줘야 한다.
처음 설정한 타입은 후에 변경할 수 없다.
데이터 타입과 맞지 않게 쓴다면, 에러가 뜨기 때문에 타입의 일관성을 유지할 수 있게 해줌으로써 안정성을 늘린다.
이러한 정적 타입(static/strong type)언어는 C나 자바, 고, 러스트 등이 있다.
반면 동적 타이핑은 내가 넣는 값에 따라서 알아서 데이터 타입을 설정해 준다.
내가 해야할 것은 var, let, const 키워드를 통해 변하는 값인지 고정된 값인지만 구별해서 넣어주면 된다.
var minsu;
console.log(typeof minsu); //undefined
minsu = 3;
console.log(typeof minsu); //number(따로 정수 실수 진수 구분도 안함)
minsu = 'name';
console.log(typeof minsu); //string
minsu = true;
console.log(typeof minsu); //boolean
minsu = null;
console.log(typeof minsu); //object
minsu = symbol();
console.log(typeof minsu); //symbol
minsu = {};
console.log(typeof minsu); //object
minsu = [];
console.log(typeof minsu); //object
minsu = function();
console.log(typeof minsu); //function
이처럼 typeof를 통해 데이터 타입을 살펴보면 알아서 다 구별해서 알려주는 것을 볼 수 있다.
자바스크립트는 할당되는 순간 해당 값에 따라 타입을 결정한다(따라서 변수 자체에 타입은 없다). 때문에 값을 바꾼다 하더라도 새로 할당된 값의 타입을 다시 구별해서 알려준다.
이러한 특징을 동적 타이핑(dynamic typing)이라 하고 동적 타이핑을 사용하는 언어를 동적 타입(dynamic/weak type) 언어라고 한다.
동적 타입 언어는 자바스크립트를 포함해서 파이썬, PHP, 루피 등이 있다.
동적 타입 언어는 내가 따로 타입을 작성하지 않아 편하다는 장점이 있지만, 덜 안정적이라는 단점이 있다.
정적 타입의 경우 내가 타입을 입력하면 그대로 쭉 가지만, 동적 타입은 내가 계속해서 데이터 타입을 바꾸면 계속해서 자기도 알아서 바꾸기 때문에 언어 엔진이 다르게 예측하게 되는 경우가 생길 수도 있는데, 이는 오류와 직결된다.
따라서 동적 타입 언어에서 변수를 사용하게 된다면 주의사항을 기억하자.
1. 변수는 최대한 적게 사용. 변수와 오류 발생 활률은 비례한다. 2. 변수의 유효 범위(스코프)를 최대한 좁게 만들어 오류 발생 확률 낮추기 3. 전역 변수 최대한 사용 자제. 변수가 이리저리 다니다 보면 의도치 않게 값이 변경될 수 있고 복잡해짐. 4. 변수보다 상수를 사용하여 값의 변경 억제 5. 변수의 이름은 변수의 목적이나 의미를 파악할 수 있게 네이밍하여 이해하기 편하게 작성. |
'Web development > Modern JavaScript Deep Dive' 카테고리의 다른 글
모던 자바스크립트 Deep Dive(변수, 식별자) (0) | 2023.03.14 |
---|---|
모던 자바스크립트 Deep Dive(제어문 - 블록문, 조건문, 반복문) (0) | 2023.03.13 |
모던 자바스크립트 Deep Dive(그 외 연산자들, 연산자 우선 순위, 연산자 결합 순서) (1) | 2023.03.11 |
모던 자바스크립트 Deep Dive(연산자, 산술 연산자) (0) | 2023.03.10 |
모던 자바스크립트 Deep Dive (데이터 타입) (0) | 2023.03.09 |