본문 바로가기
JAVASCRIPT

[JS][강제변환] 명시적 강제변환 : 문자열 <-> 숫자

by KBS 2022. 2. 9.
728x90

명시적 강제변환

명시적 강제변환은 분명하고 확실한 타입변환이다. 개발자들이 흔히 사용하는 타입변환은 대개 이 명시적 강제변환 범주에 속한다.

 

명시적 강제변환은 정적 타입 언어에서 지극히 당연하다고 여겨지는 타입변환의 관례를 충실히 따르고 있기에 별다른 논쟁거리는 없다. 따라서 명시적 강제변환이 나쁜 것도 아니고, 이슈가 많은 주제도 아니라고 당연하게 받아들이자.

명시적 강제변환:  문자열 <-> 숫자

우선, 가장 간단하면서도 가장 잦은 강제변환이라 할 수 잇는 것이 '문자열 <-> 숫자' 강제 변환이다.

 

'문자열 <-> 숫자' 강제변환은 String()Number() 함수를 이용하는데, 앞에 new 키워드가 붙지 않기 때문에 객체 래퍼를 생성하는 것이 아니란 점을 눈여겨보자.

 

다음은 두 타입 간 명시적 강제변환 예제다.

 

var a = 42;
var b = String(a);

var c = "3.14";
var d = Number(c);

b; // "42"
d; // 3.14

 

앞서 설명했던 ToString() 추상연산 로직에 따라 String()은 값을 받아 원시 문자열로 강제변환한다. Number() 역시 마찬가지로 ToNumber 추상 연산 로직에 의해 어떤 값이든 원시 숫자 값으로 강제변환한다.

 

누가 봐도 결과적으로타입변환이 일어난다는 사실은 의심할 여지가 없으므로 '명시적 강제변환'이 맞다.

 

사실 이러한 사용법은 다른 정적 타입 언어와 비슷하다.

 

C/C++ 언어에서 (int)xint(x)는 둘 다 x를 정수로 변환한다. 둘 다 문법상 맞지만 함수 호출 형태로는 후자를 선호하는 개발자들이 더 많다. 자바스크립트의 Number(x)도 상당히 닮았다. 하지만 자바스크립트에서는 실제로 함수 호출인데 문제가 될까? 그렇지 않다.

 

String()Number() 이외에도 '문자열 <-> 숫자'의 '명시적인' 타입변환 방법은 또 있다.

 

var a = 42;
var b = a.toString();

var c = "3.14";
var d = +c;

b; // "42"
d; // 3.14

 

a.toString() 호출은 겉보기엔 명시적이지만, 몇 가지 암시적인 요소가 감춰져 있다. 원시 값 42에는 toString() 메서드가 없으므로 엔진은 toString()를 사용할 수 있게 다종으로 42를 객체 래퍼로 '박싱'한다. 말하자면 '명시적으로, 암시적인 작동'이다.

 

+c의 +는 단항 연산자(피연산자가 하나뿐인 연산자)다. 단항 연산자 +는 수학책에 나오는 덧셈을 하는게 아니라 피연산자 c를 숫자로, 명시적 강제변환한다.

 

+c가 명시적 강제변환이라고? 개발자의 경홈과 시야에 다라 다르다. 단항 연산다 +가 숫자로 강제변환하는 기능이란 사실 분명히 알고 있다면 별 상관없다. 하지만 태어나서 단 한 번도 이 연산을 본적이 없는 사람에게는 그저 혼란스럽고 뭔가 부작용이 숨겨져 있을 것만 같은 불길한 느낌이 들 것이다.

 

오픈소스 자바스크립트 커뮤니티에서는 + 단한 연산자를 명시적 강제변환 형식으로 대부분 인정했다는 분위이라고 한다.

 

설사 +c처럼 쓰는걸 좋아하는 사람일지라도 헷갈리는 경우가 더러 있따. 다음 코드를 보자.

 

var c = "3.14";
var d = 5 + +c;
d; // 8.14

 

-단항 연산자 역시 +처럼 강제변환을 하지만 숫자의 부호를 뒤바꿀 수도 있다. 그렇다고 바뀐 부호를 바로잡고자 --로 하면 증감 연산자가 되어버리니 안될 노릇이다. 대신 - -"3.14"처럼 두 연산자 사이에 공란을 하나 넣어주면 무사히 3.14로 강제변환된다.

 

이런식으로 단항 연산자 뒤에 이진 연산자를 분이면 무수히 많은 오싹한 조합이 나올 수 있다. 다음은 그중 하나다.

 

1 + - + + + - + 1; // 2

 

가급적 +/- 단항 연산자를 다른 연산자와 인접하여 사용하지 않기 바란다. 코드가 잘 돌아간다 해도 별로 좋지 않은 생각이다. d = +c는 d에 c를 더하는 d += c와 완전히 다른 코드임에도 너무 헷갈리기 쉽다.

 


참고

  • You Don't Know JS ( 한빛 미디어 )
728x90

댓글