JSCC: JavaScript로 개발하는 C Compiler

생성자와 초기화 함수

토픽 JSCC: JavaScript로 개발하는 C Compiler > JSCC 준비

5.3.1) 생성자와 초기화 함수

한 눈에 보기 힘들기 때문에 부분을 나누어 설명하겠다먼저 StringBuffer 생성자 함수의 정의는 다음과 같다.

StringBuffer.js (생성자 정의)

/**

StringBuffer 생성자 함수를 정의합니다.

@param {string} s

*/

function StringBuffer(s) {

this.str = (s != undefined) ? s : '';

this.idx = 0;

}

위에서 보인 StringBuffer.cpp 예제와 비교하면 len 멤버가 삭제되었음을 알 수 있다. JS의 문자열 객체는 기본적으로 length 멤버를 가지고 있기 때문에 굳이 멤버로 넣어야 할 필요가 없어 삭제했다사실 C++ 예제에서도 이 멤버는 삭제하는 것이 바람직하다.

생성자 정의에서 str 속성을 삼항 연산자를 이용하여 s로 정의하는 구문이 나온다처음에는 당황할 수 있지만잘 보면 그냥 s가 undefined인지 확인한 후 s가 undefined가 아니면 s, undefined면 빈 문자열을 대입하는 문장임을 알 수 있다왜 그냥 this.str = s;와 같이 쓰지 않고 이런 식으로 썼을까?

이는 JavaScript에서 메서드를 호출하면 정의되지 않은 인자는 undefined가 된다는 특성에 의한 것이다다음 예제를 보자.

undefparam.htm

// 메서드의 인자를 출력합니다.

function func(param1, param2, param3) {

log(param1);

log(param2);

log(param3);

}

function main() {

func(1, 'test'); // func의 인자를 두 개만 넘긴다고 해도 적법한 문장입니다.

}

실행 결과

1

test

undefined

따라서 this.str = (s != undefined) ? s : '';를 수행하면 StringBuffer를 그냥 빈 문자열로 초기화하고 싶을 때 그냥 다음과 같이 하면 된다.

var buffer = new StringBuffer(); // StringBuffer('')처럼 쓸 필요가 없다

이제 생성자의 설명이 끝났으니 메서드를 보자다음은 버퍼를 초기화하는 init 메서드다.

StringBuffer.js (init)

/**

버퍼를 문자열로 초기화합니다.

@param {string} s

*/

StringBuffer.prototype.init = function(s) {

this.str = (s != undefined) ? s : '';

this.idx = 0;

};

생성자와 완전히 같은 코드다그런데 (s != undefined) ? s : '';와 같은 구문은 사실 꽤 자주 쓴다일단 undefined는 긴 키워드고, s에 들어갈 변수의 이름이 길면 우리는 다음과 같이 지루한 코드를 쓸 수밖에 없다.

var num = (value != undefined) ? value : 0;

var str = (valueString != undefined) ? valueString : '';

var isDragging = (isMouseButtonClicked != undefined) ? isMouseButtonClicked : false;

그러니 귀찮음을 덜기 위해 함수를 만들자다음 함수를 handy.js 파일에 추가한다.

handy.js (getValid)

/**

value가 undefined라면 기본 값을아니면 그대로 반환합니다.

*/

function getValid(value, defaultValue) {

return (value != undefined) ? value : defaultValue;

}

그러면 위의 문제는 다음과 같이 깔끔하게 해결이 된다.

var num = getValid(value, 0);

var str = getValid(valueString, '');

var isDragging = getValid(isMouseButtonClicked, false);

그리고 앞으로도 이러한 상황에서는 언제나 getValid 메서드를 사용할 것이다.

나머지는 사실상 코드를 복사 붙여넣기 하는 정도인데어느 부분이 달라지는지를 눈여겨보자.

댓글

댓글 본문