[JavaScript] 강제 변환에 앞서서

  • 이 책은 You Don’t Know JS, 카일 심슨 저, 한빛미디어 를 공부하며 작성한 글입니다.
  • 단순히 블로그만 읽는 것은 추천하지 않습니다.

들어가기 전

이번 포스팅부터는 강제 변환에 대해 포스팅을 한다.

먼저 명시적/암시적 강제변환에 앞서서 각 변환에 대한 설명을 간단히 하고, 추상 연산에 대해 먼저 알아보려 한다.

바로 시작해보자!

강제 변환이란

ES5에 자동 타입 변환(Automatic Type Conversion) 이라는 말이 등장하는데 강제 변환과 동일한 개념이다.

표준 용어가 정해져 있지는 않지만, 자바스크립트 엔진에 의해 타입이 자동 변환 된다는 의미만 명확하게 이해하면 된다.

어떤 값을 다른 타입의 값으로 바꾸는 과정이 명시적일 경우 타입 캐스팅, 암시적이면 강제 변환 이라고 한다.

어떤 사람들은 타입 캐스팅은 정적 타입언어에서 컴파일 시점에, 강제 변환은 동적 타입 언어에서 런타임 시점에 발생한다고 한다.

하지만, 자바스크립트는 대부분 모든 유형의 타입변환을 강제변환으로 일컫는 경향이 있어, 암시적 강제 변환명시적 강제 변환 두 가지로 구별하여 글을 작성하려 한다.

명시적 강제변환 : 코드만 봐도 의도적으로 타입 변환을 일으킨다는 사실이 명백.

암시적 강제변환 : 다른 작업 도중 불분명한 부수 효과로부터 발생하는 타입 변환.

let a = 42;
let b = a +"" // 암시적 강제변환
let c = String(a); // 명시적 강제변환

용어상으로 이러한 대응 관계가 성립한다. => 명시적 : 암시적 = 명백한 : 숨겨진 부수 효과

추상 연산 - ToString

이번 포스팅에선 명시적/암시적 강제변환을 다루진 않고, 어떻게 값이 문자열, 숫자, 불리언 등의 타입이 되는지 기본 규칙부터 천천히 알아볼 예정이다.

먼저 추상 연산 중 ToString 에 대해 알아 보겠다.

문자열이 아닌 값 -> 문자열 변환 작업은 ToString 추상 연산 로직이 담당한다.

내장 원시 값 은 본연의 문자열화 방법이 정해져 있다.

null -> “null” , true -> “true” , 숫자는 그냥 문자열로 바뀌며 너무 작거나 큰 값은 지수 형태로 바뀐다.

반면, 일반 객체는 toString() 메서드를 사용할 일이 많지 않다.

특별히 지정하지 않으면, 기본적으로 toString() 메서드가 내부 [[Class]]를 반환하여 [object Object] 와 같은 쓸모없는 문자열이 반환된다.

이런 경우, 객체의 toString() 메서드를 수정해서 더 유용한 문자열 표현을 반환하게 해야하는데, 이 내용은 뒤에서 다루겠다.

반면, 배열은 toString() 메서드가 꽤 쓸만하다.

배열에서의 toString() 메서드는 각 요소를 문자열로 바꾼 후, 쉼표로 연결한 문자열을 반환한다.

let a = [1,2,3];
console.log(a.toString()); // "1,2,3"

추상 연산 - JSON 문자열화

ToString은 JSON.stringify() 유틸리티를 사용하여 어떤 값을 JSON 문자열로 직렬화하는 문제와도 연관된다.

console.log(JSON.stringify(42)); //"42"
console.log(JSON.stringify("42")); //""42""
console.log(JSON.stringify(null)); //"null"
console.log(JSON.stringify(true)); //"true"

JSON 안전 값(JSON 표현형으로 확실히 나타낼 수 있는 값)은 모두 JSON.stringify() 로 문자열화 할 수 있다.

반면, 안전값이 아닌 undefined, 함수, 심벌, 환형 참조 객체는 모두 JSON 값으로는 쓸 수 없는, 표준 규격을 벗어난 값이다.

환형 참조 객체 : 프로퍼티 참조가 무한 순회되는 구조의 객체, 
마지막 객체가 첫번째 객체를 참조하는 등 순환 참조가 발생하여 
결국 메모리 누수를 유발하는 객체를 말한다.

부적절한 JSON 값이나, 직렬화하기 어려운 객체 값을 문자열화 하려면 toJSON() 메서드를 통해 직렬화한 값을 먼저 반환해야 한다.

착각하면 안되는 것이, toJSON()의 역할은 문자열화하기 적당한 JSON 안전 값으로 바꾸는 것 이지, JSON 문자열로 바꾸는 것이 아니다!!

즉, toJSON()은 적절히 평범한 실제 값을 반환하고, 문자열화 처리는 JSON.stringify()로 하는 것.

출처

You Don’t Know JS, 카일 심슨 저, 한빛미디어

댓글남기기