"Hi, there." 라고 썼으면 -100점이다.
"i" 뒤에 "+"가 두개 있는 것이 오타라고 생각하거나, "+"가 한 개라고 착각하면 이미 탈락이다.
이 문제는 두 가지 문제를 이해하는지를 확인하는 문제이다.
문자열 텍스트는 다양하게 바뀐다.
혼동을 주기 위해 특수문자를 넣기도 하고, "+ +" 뒤에 오는 문자열에 숫자를 넣기도 한다.
기본 원리는 모두 동일하다.
1."+ +"의 이해
"++"로 붙여쓰면 구문 오류가 나므로 당연히 띄어서 "+ +"이다.
문제의 핵심은 "+ +"를 알고 있고 "+"가 문자열 앞에 있으면 어떻게 되는지, 그러니까 타입 캐스팅이 어떻게 이루어지는지 정확하게 알고 있는지를 묻는 문제이다.
타입 캐스팅 적용 순서와 "+ +"로 인해 뒤쪽의 ", there." 최종 값이 무엇이 되는지를 알아야 한다.
먼저 "+ +" 는 파싱이 되면서 "H" + "i" + (+", there.")로 나누어진다. "+"가 2개 오고 오른쪽에 피 연산자가 있으면 이렇게 분리된다.
(+", there.")는 왼쪽에 숫자 연산자가 있으므로 ", there."는 숫자(Number)로 캐스팅 시도를 하게 된다.
그런데 문자열 안에 적절하게 숫자로 파싱 할 수 있는 요소가 없기 때문에 NaN(Not a Number)이 리턴된다.
NaN은 자바스크립트의 내장 프리미티브 타입이다. 특수한 타입이지만 문자열이 아닌 NaN 타입이 반환된다.
그래서 다음과 같이 된다.
"H" + "i" + NaN
타입 캐스팅은 기본적으로 왼쪽의 타입을 따라간다.
따라 "H" + "i"는 "Hi"로 합쳐지고, 다음과 같은 최종 연산식이 만들어지게 됩니다.
"Hi" + NaN
2.NaN의 타입 캐스팅
이 문제의 두 번째 함정이다.
실전에서 코딩을 해도 NaN을 타입 캐스팅을 하지는 않는다. NaN이 발생하면 예외처리를 하거나 제외를 해서 결과에서 배제를 한다. 아니면 NaN이 나온 것 자체가 오류 상황이기 때문에 앞의 로직을 다시 확인해서 문제를 해결하게 된다.
문자열과 NaN을 합치면 NaN은 타입 캐스팅이 돼서 문자열 "NaN"으로 바뀐다.
그래서 정답은 다음과 같이 된다.
"HiNaN"
NaN 프리미티브 타입이 문자열로 바뀌면 어떤 값이 될까? 가 핵심 문제이다.
조금 다르게 생각해서 왼쪽이 숫자여서 숫자 + NaN이 되면 어떻게 될까?
NaN이 나온다.
NaN 타입의 NaN입니다. 문자열 "NaN"이 아니다.
결과 조합을 할 때 NaN이 발생하면 타입캐스팅이 되면서 문제가 될 수 있다는 걸 인식하고 있는지를 묻는 기초 코딩테스트 문제이다.