어제도 무척이나 덥더니, 오늘도 매한가지군요;; 집에 에어컨이 없는관계로 너무나 더운 초여름을 맞이하고 있습니다. 어제 새벽엔 개인적인 사건사고가 끊이지 않아~ 피곤한 밤이기도 했습니다. ㅎㅎ

오늘은 저번 강좌에서도 밝혔듯이 bind 개념의 후속타인 extend에 대해서 알아볼까 합니다. PJS에서 extend의 개념은 두가지로 쓰이고 있습니다. 하나는 확장이며, 다른하나는 상속입니다. 어찌보면 두개의 개념이 같을 수도 있습니다. 같은 행동을 취하지만 개념은 다르다라고 말씀드리는게 더 정확하다고 말하고 싶군요.

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

먼저 extend의 소스부터 보시죠. 감이 오시나요? 그렇습니다. 마냥 읽어서 shallow copy를 하고 있습니다.
Shallow copy는 일명 '얕은 복사'입니다. 얕은 복사는 대상 오브젝트를 참조하는 참조변수로부터 복사되어지는 변수만을 가지는 복사를 말합니다. 이해가 잘 안가신다구요? 그렇다면 저~ 뒷쪽에 변수의 scope를 설명하는
부분을 참고하시면 이해가실겁니다. shallow copy의 반대는 뭘까요? 그렇습니다 deep copy(깊은 복사)입니다. 너무 쉽죠? 깊은복사는 말그대로 객체를 복사할때 참조변수가 주소값만을 가지는게 아니라 새로운 객체자체를 가지는것을 말합니다. 이쯤하면 shallow copy와 deep copy가 구분되어지리라 생각합니다.

음, 제가 말하고 싶은건 'extend는 shallow copy다' 라는 것입니다. ㅎㅎ

그럼 다시 extend의 목적인 두가지를 알아보겠습니다.

첫번째, '확장'입니다.
확장이란 말그대로 무언가를 넓히는 것입니다. 그게 개념이든  메소드이든 말이죠. 그럼 확장의 extend를 언제
사용할까요? 바로 객체의 메소드 및 프로퍼티를 추가할 때 입니다. 이해가시죠? 어느 객체에 필요한 프로퍼티와 메소드들을 추가하여 없던 기능들을 넣음으로써 확장하는 것입니다. 이것을 PJS에서는 아래와 같이 사용하고
있습니다.

Object.extend(Hash, {..toQueryString : function(){}..toJSON : function(){}...}) 

처음에 Hash를 생성할 당시에는 toQueryString이란 메소드가 없다가 확장을 통해 메소드를 추가하는
모습입니다.

두번째의 개념은 '상속'입니다.
상속이란 확장의 확장편이라고 해야할까요? ㅎㅎ 그냥 의미그대로 해석해보겠습니다. 상속이란 위에서 그냥
내려받아 내것처럼 사용하는 것을 말합니다. 쉽게 저는 빵을 못만들지만 아버지가 빵을 만드는 방법을
알고있다면, 자식인 제가 아버지의 재능을 상속받아 저또한 빵을 만들 수 있다는 이야기 입니다.
이해가 가시는지요. 그럼 PJS에서는 어떻게 상속의 개념을 설명하는지 코드를 보겠습니다.

Object.extend(Hash.prototype, Enumerable)

아주 심플하군요. 소스설명은 Hash 오브젝트가 Enumerable이 사용하는 메소드들을 상속받아서 Hash에서도
사용할 수 있다는 이야기 입니다. 상속이란 이런 개념인거죠. 내가 못하는거 상속받으면 상속해준 것의 행동을 할 수 있다. 이해가 되시죠? 그렇습니다. 그렇게 어려운 개념이 아닙니다.


오늘은 여기까지 작성토록하고 다음 강좌에서 다시 만나겠습니다.

posted by blankus

Ajax  |  2007/06/17 13:32
이 글의 트랙백 주소 :: http://www.blankus.net/trackback/15
2007/12/06 15:59 댓글에 댓글수정/삭제
안녕하세요 blankus님 상세한 팁들 덕분에 많은 도움을 받고 있습니다. 제 지식이 얕아 궁금한 점이 생겨서 질문을 드리고자 합니다. Object.extend(Hash, { })는 Hash 객체가 직접 사용하기 위한 메서드를 추가한 것이고, Object.extend(Hash.prototype, { })는 Hash 객체가 직접 사용하는 것이 아닌 Hash 객체의 인스턴스들이 사용하기 위한 메서드를 추가한 것이라고 이해하면 되는지요.

즉 blankus님이 말씀하신 '확장'과 '상속'의 개념 차이를, 객체 자체의 메서드 '확장'인지 객체의 인스턴스의 메서드 '상속'인지의 차이로 이해하면 되는지 궁금합니다. 감사합니다.
2007/12/06 23:52 수정/삭제
안녕하세요~
제가 이 포스트에서는 정확하게 표현하지 않았지만, FlyingMate님께서 이해하신 것은 정확합니다.
정확한 표현으로 하자면, class method와 instance method의 차이입니다. 직접 표현하셨듯이 instance method는 인스턴스만 사용할 수 있고 class method라는 것은 Math.floor와 같은 것이 이에 해당되겠습니다. 이를 이해하고 있다면 상당한 내공의 소유자 이신듯 합니다 ^^
.
2007/12/08 12:44 댓글에 댓글수정/삭제
이제 확실히 이해하게 되었습니다. 클래스 메서드와 인스턴스 메서드라고 명시해주시니 확실해졌습니다. 답변 갑사합니다^-^
2007/12/10 11:36 수정/삭제
도움이 되셨나니 다행이네요 ^^*
.
이름 ::   비밀번호 :: 홈페이지 :: 비밀글
등록