0 == false

2013년 4월 4일 at 8:24 pm

요새는 삼성SDS멀티캠퍼스에 가서 자바스크립트 교육을 받고 있다. 강사는 나름 깊이 있는 지식을 습득하고 있는 것으로 보였다.

교육내용 중 자바스크립트 객체나 값의 존재 여부를 확인하는 방법에 대하여 교재(일본인이 쓴 책의 번역서)에는 이렇게 나와있었다.

function test(arg1) {
  if (arg1 == undefined) {
    arg1 = {};
  }
}

하지만, 강사의 설명은, 이와 같이 넘어올 경우 null 을 포함한 모든 경우를 체크해주지 못한다며, 다음과 같이 써야 한다는 것이었다.

function test(arg1) {
  if (!arg1) {
    arg1 = {};
  }
}

하지만 이와 같이 코딩할 경우 arg1 이 0 으로 넘어올 경우에도 없는 것으로 if  에 걸려 초기값으로 셋팅해버린다는 문제점이 있다. 처음에는 강사가 객체 또는 객체의 인스턴스를 받을 경우에만 저렇게 설명하는 것이겠지 하였으나 숫자로 넘어온 값도 마찬가지로 if (!arg1) 의 방법으로 존재 여부를 확인하고 있었다.

“저렇게 체크하면.. 0 이 넘어와도 객체를 못 받은 것으로 판단해버리지 않습니까?”

“아닙니다. 값이 존재여부로 판단해서 값을 넘겨받지 못했을 경우에만 블럭을 수행합니다.”

“0 이 넘어오면 0 도 false 로 판단하여 블럭을 수행할텐데요.”

“그럼 어디 해볼까요..”

결과는.. 0 이 넘어와도 블럭은 수행됐고, 강사는 책의 설명이 맞다며, 잘못 알고 있었다고 얘기했다. 저런 걸 모를 실력의 강사가 아닌데…

그 의문은 다음날 풀어졌다. 현대자동차 연구소에 다니고 있는 신동진과 수요일 저녁 사당역에서 만나 한 잔 하면서였다. 내가 받는 교육에 대해서 얘기하면서 강사의 실수에 대해서도 얘기했다. 그러자 동진이가 하는 말,

“자바에서는 0 이 false 가 아니니까 그렇지..”

“응? 자바도 0 이 false 아님? 아, 아, 맞다. 자바는 boolean 타입이 따로 있었지..!”

“그치, 0 이 false 가 되는 것은 C 언어나 그렇지..”

그렇다. C가 mother tongue 이었던 나는 당연하게도 0 ==  false 라고 알고 있었지만, 자바나 C# 으로 경력을 시작한 프로그래머라면 당연히 if 문 안에 들어가는 것은 논리판단이며, 0 == false 따위의 #define 에 대해서는 알 필요가 없었던 것이다.

이건 그 강사의 잘못도 아니고, 신-구 패러다임의 사이에서 양쪽의 특징을 조금씩 갖고 있는 과도기성의 문제랄까?

사실, 자바스크립트가 저런 문법을 허용하지 않았더라면 모호성이 사라져 더욱 좋았을 것이다.