본문 바로가기

개발/javascript

타입 변환과 단축 평가01 - 타입 변환이란?

"타입 변환과 단축 평가"

 

1. 타입 변환이란?

자바스크립트의 모든 값은 타입이 있다. 값의 타입은 개바자의 의도에 의해 다른 타입으로 변환할 수 있다. 개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환(Explicit coercion)또는 타입 캐스팅(Type casting)이라 한다.

var x = 10;

// 명시적 타입 변환
// 숫자를 문자열로 타입 캐스팅한다.
var str = x.toString();
console.log(typeof str, str); // string 10

// 변수 x의 값이 변경된 것은 아니다.
console.log(typeof x, x);

 

개발자의 의도와는 상관없이 표현식을 평가하는 도중에 자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되기도 한다. 이를 암묵적 타입 변환(Implicit coercion) 또는 타입 강제 변환(Type coercion)이라고 한다.

var x = 10;

// 암묵적 타입 변환
// 문자열 연결 연산자는 숫자 타입 x의 값을 바탕으로 새로운 문자열을 생성한다.
var str = x + '';
console.log(typeof str, str); // string 10

// 변수 x의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10

명시적 타입 변환이나 암묵적 타입 변환이 기존 원시값(위 예제의 경우, 변수 x의 값)을 직접 변경하는 것은 아니다. 원시값은 변경 불가능한 값(imuutable value)이므로 변경할 수 없다. 타입 변환이란 기존 원시값을 사용해 다른 타입의 새로운 원시값을 생성하는 것이다.

// 원시값 1 이 '1'로 직접 변경되는 것이 아니다.
// 1을 사용해 타입이 다른 '1'을 새롭게 생성하여 '1' + ''을 평가한다.
1 + '' // '1'

 

타입변환은 자바스크립트 엔진이 암묵적으로 실행하는 암묵적 타입 변환이 있고, 개발자가 의도를 가지고 직접적으로 의도를 가지고 직접적으로 코드에 기술을 해서 타입을 변환하는 명시적 타입 변환이 있다. 명시적 타입 변환은 가독성이 높다. 하지만 암묵적 타입 변환은 코드에 그 의미가 드러나지 않는다.

암묵적 타입 변환이 빈번하게 일어나기 때문에 어떤경우에 일어나는지, 어떤 타입에 어떤 값으로 변경이 되는지 예측할 수 있어야 한다.

만약, 타입 변환이 일어나는지 일어나지 않는지조차 알지 못하거나 또는, 예측을 오해해서 잘못하면 오류를 생산할 가능성이 높아진다.

 

그렇다면 명시적 타입 변환 만을 사용하고 암묵적 타입 변환은 발생하지 않도록 코드를 작성하면 어떨까? 좋은 생각이긴 하지만 이런한 논리는 옳지 않다. 때로는 명시적 타입 변환보다 암묵적 타입 변환이 가독성 측면에서 더 좋을 수도 있다. 예를 들어 자바스크립트 문법을 잘 이해하고 있는 개발자에게는

(10).toString( ) 보다 10 + ' ' 이 더욱 간결하고 이해하기 쉽다.