SqueakByExample:12.5

From 흡혈양파의 번역工房
Revision as of 07:50, 18 August 2012 by Onionmixer (talk | contribs) (SBE 모든메타클래스들은클래스와동작을상속합니다 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

모든 메타클래스들은 클래스와 동작(class and behavior)을 상속합니다.

모든 메타클래스는 클래스이므로, 클래스로 부터 상속됩니다. 클래스는 차례대로 superclass, ClassDescription 그리고 Behivior를 상속합니다. 스몰토크에서 모든 것이 오브젝트이기 때문에 이 클래스들은 결국 오브젝트로부터 모두 상속된 것입니다. 우리는 그림 12.7에서 완전한 그림을 볼 수 있습니다.


그림 12.7: 메타클래스는 Class와 Behivior로부터 상속됩니다.


new가 어디서 정의되나요? 메타클래스가 Class와 Behavior로부터 상속된다는 중요한 사실을 이해하기 위해, new는 어디서 그 new가 정의되며 어떻게 그것이 발견되는지 요청(ask)하는 것을 돕습니다. 메시지 new가, 그것의 메타클래스 사슬(metaclass chain)과 마침내 그것의 superclass Class인, Class Description과 Behavior에서, look up이 된 클래스에 발송이 되면, 그림 21.8에서 처럼 ClassDescription와 Behavior가 보이게 됩니다.

"어디서 new가 정의되는가" 라는 질문은 매우 중요합니다. New는 먼저 클래스 Behvior에서 정의되며, 필요한 경우, 우리가 정의하는 클래스의 메타클래스의 모든 것을 포함하여, 그 자체의 서브클래스에서 재정의될 수 있습니다.


그림 12.8: new는 메타클래스 사실(metaclass) 사실에서 검색(look up)이 된 보통 메시지(ordinary message) 입니다.


메시지 new는 이 클래스의 메타클래스에서 look up이 된 클래스에 발송이 되며, 만약, 그러던 중, 재 정의되지 않았을 경우, superclass 사슬에서 클래스 Behavior까지 계속 검색(look up)이 이어집니다.

TranslucentColor new 발송의 결과가, 메소드가 클래스 Behavior에서 검색(look up)이 되지 않을 지라도 TranslucentColor의 인스턴스이며 Behavior의 인스턴스가 아닌 것에 유의합니다. new는 항상 self의 인스턴스를 리턴하며, 심지어 다른 클래스에서 실행되었을 지라도, 메시지를 수신하는 클래스인 self의 인스턴스를 리턴합니다.

TranslucentColor new class -> TranslucentColor "not Behavior"


일반적인 실수(mistake)는 수신클래스(receiving class)의 수퍼클래스(superclass)에서 new를 찾는 것입니다. 동일한 것이 new:를 위해 보류(hold) 되어 있으며, 그 보류된 것은 주어진 크기의 오브젝트를 만들기 위한 표준메시지(standard message) 입니다. 예를 들면, new: 4는 4 구성요소들의 배열을 만듭니다 여러분은 배열(Array) 또는 그 배열의 superclass 속에서 정의된 이 메소드를 찾으 실 수 없을 것입니다. 그 대신에, 배열 클래스(Array class)와 그 배열의 superclass 속에서 메소드를 찾아보셔야 하며, 그 이유는 그 위치가, 바로 검색(lookup)이 시작하는 장소이기 때문입니다.


Behavior, ClassDescription과 class의 책임. Behavior는 인스턴스를 가진 오브젝트에 필요한 최소한의 상태를 제공합니다: 이러한 것들은 superclass link, 메소드 딕셔너리(a method dictionary), 인스턴스의 세부사항(예를 들면 reperentation, number)을 포함합니다. Behavior는 오브젝트로부터 상속되며, 그러므로 그것과 모든 behavior의 서브클래스는 오브젝트 처럼 동작할 수 있습니다.

Behavior는 또한 컴파일러(the compiler)에 대한 기본 인터페이스(the basic interface) 입니다. 이것은 메소드 딕셔너리(a method dictionary)를 만들고, 메소드를 컴파일링하고, 인스턴스를 만들고(예를 들어, basicNew, new: 그리고 basicNew), 클래스 계층도를 조작하고 (예를들어, superclass;, addSubclass), 메소드에 접근하고(예를 들어, selectors, allSelectors,compliledMethodAt:), 인스턴스들과 변수들에 접근하고 (예를 들어, allInstances, instVarNames…), 클래스에 접근하고(예를 들어, superclass, subclasses) 그리고 조회를 하기 위한(예를 들어, hasMethods, includesSelector, canUnderstand:, inheritsFrom:, isVariable) 메소드들을 제공합니다.


그림 12.9:모든메타클래스는 메타클래스입니다


ClassDescription은 그것의 두 개의 직접 서브클레스(direct subclases), class, 그리고 메타클래스에 의해 필요한 장치들(facilities)을 제공하는 추상 클래스(abstract class)입니다. ClassDescription은 여러 개의 장치들을 Behavior에 의해 제공된 기초(basis)에 추가합니다: 작명된 인스턴스 변수(named instance variables), 포로토콜 안으로 들어가는 메소드의 범주화(the categorization of methods into protocols), 이름(name)의 개념[notion,(추상)], 변경세트(change sets)의 유지(maintenance) 그리고 변경의 로그 그리고 변경사항들을 채워넣기 위해 필요한 대부분의 메커니즘들.

클래스는 모든 클래스의 공통된 동작(the common behavior)을 나타냅니다. 이것은 클래스 변수 이름(class variable names)과 공유된 pool 변수들(addClasVarName:, addSharedPool:, initialize을 위한 실질적 표현(concrete representation)을 제공합니다. 클래스는 인스턴스를 만드는 방법을 알고 있으므로, 모든 메타클래스들은 반드시 궁극적으로 클래스로부터 상속을 받아야 합니다.


Notes