Front-End

vsoghlv@naver.com

자바스크립트 타입변환

자바스크립트 또한 다른 언어와 마찬가지로 모든 값에 타입이 있는데 이는 개발자에 의해 의도적으로 변환하거나 자바스크립트 엔진에 의해 암묵적으로 변환이 가능하다.

개발자에 의해 의도적으로 값의 타입을 변환하는 것을 명시적 명시적 타입 변환(Explicit coercion) 또는 타입 캐스팅(Type casting) 이라 하고 자바스크립트 엔진에 의해 암묵적으로 자동 변환되는 것을 암묵적 타입 변환(Implicit coercion) 또는 타입 강제 변환(Type coercion) 이라 한다.

아래 예를 보자.

let num = 10;

//명시적 타입변환
let str = num.toString();
console.log(typeof str)//string
let num = 10;

//암묵적 타입변환, 빈 값의 스트링을 추가함으로써 타입을 string 로 변환
let str = num + '';
console.log(str, typeof str)//10 string

변수의 값이 원시타입인 경우, 변수값을 변경하기 위해 재할당 후 새로문 메모리공간을 확보하고 그 곳에 원시값을 저장한 후 변수가 재할당된 원시값이 저장된 메모리 주소를 기억하도록 해야한다.

암묵적 타입변환은 변수값을 재할당해서 변경하지 않고 기존 값을 바탕으로 새로운 타입의 값을 만들어 한번 사용 후 버린다.

위 예제를 보자.

자바스크립트 엔진에서 x+10 을 평가하기 위해 x 의 값을 바탕으로 문자열 10 으로 변환한다. 그 후 "10"+"" 라는 표현식을 평가함으로써 문자열값으로 암묵적으로 변환되는 것이다. 이때 생성된 문자열 10 은 표현식 평가가 끝난 후 가비지컬렉터에 의해 메모리에서 제거된다.

코드를 작성할 때는 암묵적 타입변환이 발생하는지, 발생한다면 어떤 값인지 등 여러가지를 예측해야 하고 이를 제대로 하지 못할 경우 버그가 나올 가능성이 많아진다.

암묵적 타입변환

자바스크립트에서 표현식을 평가할때 문맥을 고려해 암묵적 타입변환을 실행한다.

예를 들어 "10" + 2 의 경우 10 을 숫자열로 바꾸는게 아니라 2 를 문자열로 변경해 102 라는 값을 생성한다.

+ 연산자의 경우 피연산자중 하나 이상이 문자열이면 문자열 연결 연산자로 동작하기 때문에 문자열 값으로 변환 시킨다.

다른 사칙연산들, -, *, / 의 경우 산술 연산자이기 때문에 문자열과 숫자열이 있는 경우 숫자타입으로 변환된다. 이때 숫자타입으로 변환할 수 없는 경우, 예를 들어 1 / 'one' 의 경우 NaN 값을 반환하게 된다.