내가 몰랐던 재밌는 자바스크립트 이야기

몇달전 자바스크립트 가든이라는 문서의 한글 번역본을 읽다가 포기하고 다시 원문을 보면서 재번역을 했다. 처음엔 그냥 오역이 몇가지 보여서 오역만 바로 잡아볼까하고 원번역자에게 메일을 보냈는데.. 결국엔 전체를 모두 다시 번역했다. 현재는 원저자에게 Pull Request를 보낸상태고 머지는 언제 될찌 모르겠다. 현재 상황에서 기억 남는 몇가지를 남겨보면,

1. 호이스팅(Hoisting)

이게 말이지 참 재밌다.  JSLint에서 이렇게 해라~ 라고 추천했던 가이드들이 몇가지 있었는데.. 예를 들면,

“var문은 맨위로 올려라” 하는 가이드가 있다. 왜 위로 올리라는 거지? 성능 문젠가? 스코핑 때문에 그런가? 그래.. 올리라면 올리지모.. 라고 하면서 var로 선언한 코드를 전부 위로 올렸던 기억이 있는데.. 여기엔 이유가 있었다. 바로 호이스팅!!! 호이스팅은 자바스크립트가 실행되기 전에 선언문을 스코프 위로 올리는 걸 얘기한다. 따라서 다음과 같이 for 문안에 선언한 i 변수는

for(var i=0; i<1000; ++i){
    // 어쩌구 저쩌구
}

  다음과 같은 스코프 상단으로 옮겨진다는 사실!!

var i=0;
for(i=0; i<1000; ++i){
    // 어쩌구 저쩌구
}

이렇게 자동으로 옮겨지는 것을 호이스팅이라고 한다. 이런 특징을 모르면 전역변수를 의도하고 쓰더라도 실제 지역변수에 있는 값을  쓰게 될지도 모른다!! 자세한 내용은 자바스크립트 가든의

함수 스코프를 참고하자!

2. 왜 new Array()는 안되는가?

이것도 역시 JSLint에서 가이드하는 내용중에 하나다. new Array()로 쓰지말고 [] 각괄호를 이용해 배열을 선언하라고 하는데, 이유는 new Array(3) 으로 넣을때 우리가 생각했던대로 동작하지 않기 때문이다. 보통은 배열에 3이라는 값을 하나 추가한 결과를 반환해줄꺼라 기대하지만, 요건 배열의 크기가 3인 빈배열을 반환한다. 심지어 인덱스는 초기화도 안한다는 사실!! 역시 자세한 내용은 자바스크립트 가든의

배열 생성자를 참고하자.

3. 계륵 같은 new 키워드의 비밀

함수를 만들때 new 키워드를 붙여서 생성하지만, new 키워드가 없어도 생성할수있다.

function Foo(){
    this.value = 1;
}
new Foo();
Foo();

위와 같이 호출하면 new 키워드의 유무에 따라 반환 값이 달라진다. new 키워드를 붙이면 Foo 함수가 생성자로써 동작하게 되면서 특별한 반환값이 없으면 this가 가리키는 값을 반환해준다. 즉, Foo 객체의 인스턴스를 반환해주는데,. Foo()는 그냥 함수를 실행한다. 그래서 this 객체는 Foo를 가리키는게 아니라 전역을 가리키게 되고, 반환하는 값이 없으므로 결과값은

undefined 가 된다. 뭐 여기까지는 누구나 아는 사실인데.. Foo 객체가 생성자로 동작할때 즉, new 키워드가 붙을때 , 이 생성자에 명시적인 return 값이 있다면 또 얘기가 달라진다. 명시적인 객체를 리턴하면 그값이 결과값으로 반환되지만, return 값이 없거나 참조타입이 아닌 프리미티브 타입을 반환하면 this가 가리키는 값을 반환한다. 반면에 new 키워드가 없는 경우, Foo 객체는 생성자가 아닌 일반 함수로 동작하면서 return 문의 값을 반환한다. 그래서 결론은 명시적인 반환값을 객체로 주면, new 키워드가 있든 말든 동일하게 동작한다는 사실!! 그래서 팩토리 패턴으로 만들 경우 자연히 new 키워드가 필요없게 된다! 자세한 내용은 역시 자바스크립트 가든의 함수 생성자를 참고하자!

4. 타이머는 스택킹 된다!

자바스크립트에서 타이머는 setTimeout과 setInterval 두가지가 있다. 어찌 생각해보면 setIntveral을 한번만 실행하고 없애면 setTimeout 은 필요없는거 아닌가? 하는 생각을 종종했는데.. 역시나 setTimeout은 ECMA 표준 스펙이 아니었다! 헉! 그랬꾸나.. 그래서 setTimeout의 첫번째 인자에 대한 해석도 엔진마다 다르다는 사실!… 여튼 이건 뭐 그렇게 중요한 얘기는 아니고.. 진짜 재밌는 얘기는 바로 setInterval 함수가 스택킹된다는 사실이다! setInterval 함수는 일정 주기마다 함수가 호출되는데.. 엄밀히 말하면 일정주기마다 함수를 실행하는 것은 아니고 일정 주기마다 실행할 함수를 쌓는다. 그래서 자바스크립트 쓰레드가 그 함수를 실행할때가 되면 실행하게 될테고, 뒤이어 실행되어질 함수는 앞에 함수가 다 끝날때까지 기다리게 된다. 이거다 싱글 쓰레드라서 발생하는 문젠데.. 그럼 한번 생각해보자!. 주기가 엄청 짧은데.. 실행되는 함수는 그 주기보다 길경우 어떻게 될까? 그렇다! 무조건 쌓이게 된다!! 이렇게 쌓인 함수는 시간이란 변수가 더이상 필요없게 된다.  즉, 내가 원하는 주기가 깨질수도 있다는 사실!! 자세한 내용은

타이머를 참고하자!

 5. 삼중 등호의 비밀

이중 등호(==)와 삼중 등호(===) 지금까지는 삼중 등호는 인스턴스를 비교해서 보다 정확하고, 이중 등호는 대충 (?) 비교해서 부정확하다라고 생각하고 있었다.. 하지만 이 둘의 차이는 그런게 아니었다.!!  바로 자동 타입 변환을 하느냐 마느냐의 차이!! 이중 등호는 자동 타입 변환을 해서 끝까지 비교하지만, 삼중 등호는 타입 변환 없이 바로 비교한다. 그래서 훨씬더 빠르다! 자세한 내용은

타입 비교를 봐라! 이 외에도 재밌는 내용이 참 많은데.. 여튼 난 위 5가지가 가장 새로웠다!

취미로 개발하기

많은 개발자의 로망중에 하나가 아마도 취미로 개발하기가 아닐까 생각된다?
아닌가? 나만 그런가?..

그러고 보니 나도 꾀나 오래전부터 프로그래밍을 해온거 같다.
그때가 아마 초등학교 5학년 이었던가?
그 시절은 윈도우즈 3.0이 막 지나던 시절.. 로터스1,2,3을 컴터학원에서 가르치던 시절..
여튼 그 시절부터 GW-BASIC을 만지작 거렸고, 과학동아 였던가?
어떤 잡지를 사면 부록으로 딸려오는 프로그래밍 자습서 같은게 있었다.
그 부록 맨 뒷장에 항상 GW-BASIC 프로그래밍 예제가 있었고, 난 코드들을 따라 해보며 희열을 느꼈다.

그러다가 내가 한계에 부딪친적이 한번 있었는데, 아직도 기억난다.
소방차 그리기 예제였다. 당시 GW-BASIC 의 허접한 그리기 라이브러리가 있었는데..
어쩐일인지,.. 내 컴터에서는 그대로 코드를 따라쳤껀만 소방차는 나오지 않았다.
그 예제코드에 오타가 있지 않았나? 라는 의심은 한번도 해본적이 없다.
그냥 내컴터에서는 안되는건가? 지원 안해주는거야? 그런거야? 꾸진 망할 컴퓨터… 이랬다.

그리고 당시 유행하던 종이책 게임이 있었는데.. 일종의 머그게임이었다.
텍스트를 따라 읽어가면,.. 선택지가 주어지고, 그 선택에 따라 난 또 다른 미션의 선택을 하게 되는
그런 게임이다. 이 게임에 착안해서 베이직으로 머그게임도 만들었던 기억이난다.
사실 그건 프로그래밍이라기 보다는 순전히 소설.. 글짓기에 가까웠다.

여튼 나의 유년시절 프로그래밍은 그랬다.. 당시엔 지금의 나의 모습을 상상할수조차 없었다.
난 프로그래머가 장래희망이 아니었기 때문에… 난 과학자가 꿈이었지..아마..ㅋㅋㅋ

그리고 대학교 4학년때였던가? 그랬다. 학교 다니면서 수많은 프로그램을 만들고,..
공모전 출품도 하고 왕성하게 쓰레기 코드를 작성하던 시절..
문득 그런 생각이 들었다.. “이딴거 만들어서 뭐에 쓰지?”
이런 생각이 스치고 지나자마자 결심을 하나 했다.
“내가 쓰지 않는건 말들지 말자!”

그렇게 시작됐다.. 취미로 개발하기..
내가 필요한걸 만들기 시작했다. 남들이 안 만들어주니까..
그냥 내가 만들었다. 남들에게 보여주려고 한것도 아니고 순전히 나혼자만 쓰려고 만들기 시작했다.
나만 만족하면 그만이고.. 약간 버그는 내가 쓰는데 아무런 문제가 되지 않는다.

그렇게 해서 탄생한것들이
미투머니, 미투알람, JSTools(자바스크립트 지원도구), LiveXE RSS 리더 모듈
그리고 몇개의 홈페이지… 등등..

이중에서 몇개는 오픈소스화 시켰고,.. 나름 서너명의 유저도 확보했다.
혼자 쓸려고 만들었지만 나름 잘 써주는 유저가 생기다보니.. 이거저거 손이 많이 가는것도 사실이다.
그래도 나름 나와 비슷한 불편함을 겪는 사람들이 있다는 것이 많은 위로와 응원이 된다.

그러면서 중2 담임선생님이 늘 강조하시던 말씀이 떠올랐다.
“배워서 남줘라”
그리고 얼마전에 TEDxSeoul 을 다녀오면서 더욱 확고해졌다.
“내가 아는것을 공유하자”

그래서 이런 생각들을 정리하며 글을 쓰기로 맘을 먹었다.
글쓰기 주제는 “취미로 개발하기”

오늘의 그 첫 시작이다.  앞으로 계속해서 연재할꺼다.
기대하시라~!!
오늘은 이만 끝~!!