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 메서드를 사용할 것이다.
나머지는 사실상 코드를 복사 붙여넣기 하는 정도인데, 어느 부분이 달라지는지를 눈여겨보자.