오랜만에 다시 포스트 하는것 같습니다. 그동안 개인적으로 좀 바쁜것이 있어서 블로그에 글을 포스트하지
못했습니다 ㅠㅠ 오늘은 회사의 당직이라, 편안히 글을 써볼까 합니다. ㅎㅎ
제목에서와 같이 오늘은 Class 입니다. 이부분에 대해서는 크게 쓸것은 없지만 개념적인 부분은 집고
넘어가겠습니다. 우리는 자바스크립트로 클래스를 생성할때 어떻게 하고 있습니까? 보통 이렇게 하겠지요?
var Test = function(){
..........
}
var test = new Test();
여기서 Test는 객체이고 test는 객체의 인스턴스가 되겠죠. 물론 Test 객체를 정의하는 방법은 이것말고도 많습니다만 일반적으로 저렇게 많이들 하시죠. 구조적으로 하자면 Test객체를 구현하는 "구현부"와 new 를 통한
객체생성을 하는 "생성부"로 나눌 수 있겠습니다.
그러면 PJS에서는 어떻게 쓸까요? 다음 코드를 보시죠.
var Animal = Class.create();
Animal.prototype = {
.............
}
var snake = new Animal("b_snake","12");
이런식으로 사용하며 var Animal = Class.create() 부분을 "선언부", Animal.prototype = {...}을 "구현부", new Animal 부분이 "생성부"로 나눌 수 있습니다.
그럼 1번방식과 2번의 PJS방식의 차이점이 무엇일까요? 그렇습니다. 선언부입니다.
PJS에는 명시적으로 클래스의 생성에 대해서 "선언부"를 가지며, 개념적인 의미를 부여합니다. 즉, "나는
클래스로서 생성되었습니다, 그러니 저를 클래스로 인정해주시고 부디 다음부터는 new를 통해 생성해서
인스턴스를 만들어 사용해 주세요"라고 말이죠. 혹자는 이렇게 이야기를 합니다.
왜 불편하게 한줄을 더 추가하면서 까지 저렇게 쓸까요? 단순히 개념적인 것이 전부인가요?
아닙니다. 물론 내부적으로 개념적인 부분이 사용되는 것은 맞습니다. 하지만 그것이 다는 아닙니다.
PJS의 원 소스를 보시죠.
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
create가 실행되면 함수를 리턴합니다. 어떤 함수냐구요? 바로 아래의 함수입니다.
function() {
this.initialize.apply(this, arguments);
}
쉽게 표현하자면, var k = Class.create() 라고 하면,
var k = function(){this.initialize.apply(this, arguments);} 이런식으로 되겠죠. 쉽게 수학에서의 대입을
생각하시면 됩니다. 그리고 우리가 k 객체를 생성하기 위해 new k()를 하는 순간 코드는 다음과 같이 변합니다.
new function(){this.initialize.apply(this, arguments);}()
위에서 this는 바로 new function, 자기자신을 나타냅니다. this.initialize 또한 new function안의
멤버이기때문에 new function에서 가지고 있어야할 객체입니다. apply는 native 메소드로 뭔가를 실행시켜주는 역할을 합니다. 인수로는 자기자신과 실행할 메소드의 arguments를 받구요. 비슷한 메소드로는 call이
있습니다. call은 이렇게 사용합니다. call(obj, [param1, param2, param3....])
다시 본문으로 돌아가서, 위 구문을 말로써 해석하면 이렇게 됩니다.
"새로 정의된 함수(new function)의 initialize 메소드를 실행(apply)하세요,
인자는 arguments로 넘겨드립니다"
여기서 우리는 알게됩니다. Class.create()로 생성한 클래스는 반드시 멤버메소드로 initialize가 존재해야
한다는 것을, JS에는 존재하지 않는 "생성자"의 개념을 사용하고 있다는것을.
var Animal = Class.create();
Animal.prototype = {
initialize : function(name, age){
this.name = name;
this.age = age;
},
getName : function(){
return this.name;
}
}
var snake = new Animal('dog', '5');
위의 소스는 다시 분석하지 않아도 여러분들이 쉽게 이해하실 거라 생각합니다.
참고로 생성자는 클래스가 생성될때 초기화를 담당하게 됩니다.
이상 Class에 대해서 설명을 드렸는데 감이 오시는지 모르겠네요. 사실 PJS에는 여러가지 필수 개념들이 몇개
있습니다. 이것을 이해하지 않고서는 PJS의 소스를 이해하시는데 어려움이 있을것이라 생각합니다.
각 장을 설명드리면서 이번과 같이 개념정리를 하는것이 있을텐데, 잠시 먼저 말씀드리면
bind, extend, hash, abstract 입니다. 이 개념들은 천천히 알아보도록 하고, 토요일 오후인데
좋은주말 보내세요~ ^^
posted by blankus
이 글의 트랙백 주소 :: http://www.blankus.net/trackback/12
.
2007/12/29 17:27
.
오랜만에 다시 포스트 하는것 같습니다. 그동안 개인적으로
좀 바쁜것이 있어서 블로그에 글을 포스트하지 못했습니다 ㅠㅠ 오늘은 회사의 당직이라, 편안히 글을 써볼까 합니다.
ㅎㅎ제...
.
2007/12/29 17:29
.
오랜만에 다시 포스트 하는것 같습니다. 그동안 개인적으로 좀
바쁜것이 있어서 블로그에 글을 포스트하지 못했습니다 ㅠㅠ 오늘은 회사의 당직이라, 편안히 글을 써볼까 합니다.
ㅎㅎ제...