SqueakByExample:12.5
모든 메타클래스는 Class 와 Behavior 를 상속한다.
모든 메타클래스는 클래스이므로, Class 로 부터 상속됩니다. Class 의 super클래스는, ClassDescription 이고 그 위의 super클래스는 Behavior 입니다. 스몰토크에서는 모든것이 객체이기 때문에 이 클래스들은 결국은 모두 Object 부터 상속된것이 됩니다. 그림 12.7 에서 완전한 내용을 확인할 수 있습니다.
new 메서드는 어디서 정의되나요? new 메서드는 어디서 정의되고 있으며, 필요한경우 요청에 대해 어떻게 탐색되는지 생각해보는건, 메타클래스가 Class 와 Behavior 를 상속하고 있다는점이 중요하다는걸 이해하는데 도움이 됩니다. new 메시지가 클래스에 전송되는 시점에서 그림 12.8 처럼, 메타클래스의 상속관계를 찾고, super클래스인 CLass, ClassDescription, 그리고 Behavior 의 순서로 메서드를 찾게 되죠.
"어디서 new 메서드가 정의되는가" 라는 질문은 매우 중요합니다. new 메서드는 일단 클래스 Behvior 에서 정의되며, 필요한 경우, 프로그래머가 정의한 클래스의 메타클래스를 포함한 서브클래스에서 재정의됩니다.
TranslucentColor new 가 실행된 결과는 TranslucentColor 의 인스턴스가 되며, 비록 메서드가 Behavior 에서 발견되었다고 해도 Behavior 의 인스턴스가 되는것은 아니라는것에 주의해 주시기 바랍니다. new 메서드는 항상 그 메시지를 받아들여 처리하는 클래스의 self 인스턴스를 반환하며, 다른 클래스에서 new 메서드를 처리한다고 해도 언제나 해당되는 수신자 클래스의 self 인스턴스를 반환하게 됩니다.
TranslucentColor new class ⇒ TranslucentColor "not Behavior"
가장 많이 하는 실수는, 수신자 클래스의 super클래스에서 new 를 찾는 경우입니다. 비슷한 경우로 지정된 크기의 객체를 생성하기 위한 표준 메시지인, new: 도 마찬가지입니다. 예를들면, Array new: 4 는, 4 개의 요소를 가지는 배열을 생성하게 됩니다. 하지만 Array 또는 Array 의 super클래스에서 이 메서드의 정의를 찾을 수는 없습니다. 찾고싶다면, Array class 와 Array class 의 super클래스에서 메서드를 찾아봐야 하며, 왜 이렇게 해야하는가 하면 그곳이 바로 메서드의 검색이 시작되는 곳이기 때문입니다.
Behavior, ClassDescription 과 class 의 책임. Behavior 는 인스턴스를 가지는 객체를 위한 최소한의 상태state를 제공합니다: 이 "최소한" 에는 super클래스에 대한 link, 메서드 Dictionary, 인스턴스의 주석(ex: representation and number) 등이 포함됩니다. Behavior 는 Object 를 상속하고 있기때문에, Behavior 자신과 모든 서브클래스는 일반적인 객체처럼 동작할 수 있습니다.
Behavior 는 컴파일러에 대한 기본적인 인터페이스도 제공합니다. 메서드 Dictionary 의 생성, 메서드의 컴파일링, 인스턴스의 생성(예를 들어, basicNew, new: 그리고 basicNew), 클래스 계층의 조작(예를 들어, superclass;, addSubclass), 메서드에 대한 접근(예를 들어, selectors, allSelectors,compliledMethodAt:), 인스턴스 및 변수들에 대한 접근(예를 들어, allInstances, instVarNames…), 클래스에대한 접근(예를 들어, superclass, subclasses) 그리고 조회를 하기 위한(예를 들어, hasMethods, includesSelector, canUnderstand:, inheritsFrom:, isVariable) 메서드들을 제공합니다.
ClassDescription 은 추상클래스이며, Class 와 Metaclass 등의 직접적인 서브클래스가 필요로하는 기능을 제공하고 있습니다. ClassDescription 은 Behavior 가 제공하는 기본에 덧붙여 다음과같은 기능을 제공합니다: 인스턴스 변수의 이름관리, 프로토콜에 의한 메서드 분류, Change set 의 유지 및 Change log 관리, 이름에 대한 개념(추상화abstract), 변경부분에 대한 파일출력에 필요한 대부분의 기능 등입니다.
Class 는 모든 클래스에서 공통적으로 필요한 동작예 해당됩니다. 클래스 이름, 메서드의 컴파일, 메서드의 보관, 인스턴스변수등을 제공하죠. 그 외에도 클래스의 변수명과 공유 pool 변수(addClasVarName:, addSharedPool:, initialize) 를 위한 실제 인터페이스도 제공합니다. 메타클래스는 클래스에 대한 유일한 인스턴스이며, 클래스는 인스턴스에 서비스를 제공하기 때문에, 모든 메타클래스는 결국 Class 를 상속받게 됩니다.