SqueakByExample:12.5

From 흡혈양파의 번역工房
Jump to navigation Jump to search

모든 메타클래스는 Class 와 Behavior 를 상속한다.

모든 메타클래스는 클래스이므로, Class 로 부터 상속됩니다. Class 의 super클래스는, ClassDescription 이고 그 위의 super클래스는 Behavior 입니다. 스몰토크에서는 모든것이 객체이기 때문에 이 클래스들은 결국은 모두 Object 부터 상속된것이 됩니다. 그림 12.7 에서 완전한 내용을 확인할 수 있습니다.

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


new 메서드는 어디서 정의되나요? new 메서드는 어디서 정의되고 있으며, 필요한경우 요청에 대해 어떻게 탐색되는지 생각해보는건, 메타클래스가 Class 와 Behavior 를 상속하고 있다는점이 중요하다는걸 이해하는데 도움이 됩니다. new 메시지가 클래스에 전송되는 시점에서 그림 12.8 처럼, 메타클래스의 상속관계를 찾고, super클래스인 CLass, ClassDescription, 그리고 Behavior 의 순서로 메서드를 찾게 되죠.

"어디서 new 메서드가 정의되는가" 라는 질문은 매우 중요합니다. new 메서드는 일단 클래스 Behvior 에서 정의되며, 필요한 경우, 프로그래머가 정의한 클래스의 메타클래스를 포함한 서브클래스에서 재정의됩니다.

그림 12.8: new 메서드는 일반적인 메세지로 보내졌을때, 메타클래스 관계에서 탐색된다.


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 를 상속받게 됩니다.


Notes