SqueakByExample:12.5: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(SBE 모든메타클래스들은클래스와동작을상속합니다 페이지 추가)
 
(문구수정)
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
==모든 메타클래스들은 클래스와 동작(class and behavior)을 상속합니다.==
==모든 메타클래스는 Class 와 Behavior 를 상속한다.==


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


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


[[image:TranslucentBehavior.png|none|1024px|thumb|그림 12.7: 메타클래스는 Class와 Behivior로부터 상속됩니다.]]
[[image:TranslucentBehavior.png|none|1024px|thumb|그림 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 메서드는 어디서 정의되고 있으며, 필요한경우 요청에 대해 어떻게 탐색되는지 생각해보는건, 메타클래스가 Class 와 Behavior 를 상속하고 있다는점이 중요하다는걸 이해하는데 도움이 됩니다. new 메시지가 클래스에 전송되는 시점에서 그림 12.8 처럼, 메타클래스의 상속관계를 찾고, super클래스인 CLass, ClassDescription, 그리고 Behavior 의 순서로 메서드를 찾게 되죠.


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


[[image:TranslucentSendingNew.png|none|1024px|thumb|그림 12.8: new 메서드는 일반적인 메세지로 보내졌을때, 메타클래스 관계에서 탐색된다.]]


[[image:TranslucentSendingNew.png|none|1024px|thumb|그림 12.8: new는 메타클래스 사실(metaclass) 사실에서 검색(look up)이 된 보통 메시지(ordinary message) 입니다.]]


TranslucentColor new 가 실행된 결과는 TranslucentColor 의 인스턴스가 되며, 비록 메서드가 Behavior 에서 발견되었다고 해도 Behavior 의 인스턴스가 되는것은 아니라는것에 주의해 주시기 바랍니다. new 메서드는 항상 그 메시지를 받아들여 처리하는 클래스의 self 인스턴스를 반환하며, 다른 클래스에서 new 메서드를 처리한다고 해도 언제나 해당되는 수신자 클래스의 self 인스턴스를 반환하게 됩니다.


<syntaxhighlight lang="smalltalk">
TranslucentColor new class  ⇒  TranslucentColor "not Behavior"
</syntaxhighlight>


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


TranslucentColor new 발송의 결과가, 메소드가 클래스 Behavior에서 검색(look up)되지 않을 지라도 TranslucentColor의 인스턴스이며 Behavior의 인스턴스가 아닌 것에 유의합니다. new는 항상 self의 인스턴스를 리턴하며, 심지어 다른 클래스에서 실행되었을 지라도, 메시지를 수신하는 클래스인 self의 인스턴스를 리턴합니다.
가장 많이 하는 실수는, 수신자 클래스의 super클래스에서 new 를 찾는 경우입니다. 비슷한 경우로 지정된 크기의 객체를 생성하기 위한 표준 메시지인, new: 도 마찬가지입니다. 예를들면, Array new: 4 는, 4 개의 요소를 가지는 배열을 생성하게 됩니다. 하지만 Array 또는 Array 의 super클래스에서 메서드의 정의를 찾을 수는 없습니다. 찾고싶다면, Array class 와 Array class 의 super클래스에서 메서드를 찾아봐야 하며, 왜 이렇게 해야하는가 하면 그곳이 바로 메서드의 검색이 시작되는 곳이기 때문입니다.
<syntaxhighlight lang="smalltalk">
 
TranslucentColor new class -> TranslucentColor "not Behavior"
</syntaxhighlight>




일반적인 실수(mistake)는 수신클래스(receiving class)수퍼클래스(superclass)에서 new를 찾는 것입니다. 동일한 것이 new:를 위해 보류(hold) 되어 있으며, 그 보류된 것은 주어진 크기의 오브젝트를 만들기 위한 표준메시지(standard message) 입니다. 예를 들면, new: 4는 4 구성요소들의 배열을 만듭니다 여러분은 배열(Array) 또는 그 배열의 superclass 속에서 정의된 이 메소드를 찾으 실 없을 것입니다. 그 대신에, 배열 클래스(Array class)와 그 배열의 superclass 속에서 메소드를 찾아보셔야 하며, 그 이유는 그 위치가, 바로 검색(lookup)이 시작하는 장소이기 때문입니다.
'''Behavior, ClassDescription 과 class 의 책임.''' Behavior 는 인스턴스를 가지는 객체를 위한 최소한의 상태<sup>state</sup>를 제공합니다: 이 "최소한" 에는 super클래스에 대한 link, 메서드 Dictionary, 인스턴스의 주석(ex: representation and number) 등이 포함됩니다. Behavior 는 Object 를 상속하고 있기때문에, Behavior 자신과 모든 서브클래스는 일반적인 객체처럼 동작할 있습니다.


'''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) 메소드들을 제공합니다.
Behavior 는 컴파일러에 대한 기본적인 인터페이스도 제공합니다. 메서드 Dictionary 의 생성, 메서드의 컴파일링, 인스턴스의 생성(예를 들어, basicNew, new: 그리고 basicNew), 클래스 계층의 조작(예를 들어, superclass;, addSubclass), 메서드에 대한 접근(예를 들어, selectors, allSelectors,compliledMethodAt:), 인스턴스 및 변수들에 대한 접근(예를 들어, allInstances, instVarNames…), 클래스에대한 접근(예를 들어, superclass, subclasses) 그리고 조회를 하기 위한(예를 들어, hasMethods, includesSelector, canUnderstand:, inheritsFrom:, isVariable) 메서드들을 제공합니다.




[[image:TranslucentMetaclassClass.png|none|1024px|thumb|그림 12.9:모든메타클래스는 메타클래스입니다]]
ClassDescription 은 추상클래스이며, Class 와 Metaclass 등의 직접적인 서브클래스가 필요로하는 기능을 제공하고 있습니다. ClassDescription 은 Behavior 가 제공하는 기본에 덧붙여 다음과같은 기능을 제공합니다: 인스턴스 변수의 이름관리, 프로토콜에 의한 메서드 분류, Change set 의 유지 및 Change log 관리, 이름에 대한 개념(추상화<sup>abstract</sup>), 변경부분에 대한 파일출력에 필요한 대부분의 기능 등입니다.




ClassDescription은 그것의 두 개의 직접 서브클레스(direct subclases), class, 그리고 메타클래스에 의해 필요한 장치들(facilities)을 제공하는 추상 클래스(abstract class)입니다. ClassDescription은 여러 개의 장치들을 Behavior에 의해 제공된 기초(basis)에 추가합니다: 작명된 인스턴스 변수(named instance variables), 포로토콜 안으로 들어가는 메소드의 범주화(the categorization of methods into protocols), 이름(name)의 개념[notion,(추상)], 변경세트(change sets)의 유지(maintenance) 그리고 변경의 로그  그리고 변경사항들을 채워넣기 위해 필요한 대부분의 메커니즘들.
Class 는 모든 클래스에서 공통적으로 필요한 동작예 해당됩니다. 클래스 이름, 메서드의 컴파일, 메서드의 보관, 인스턴스변수등을 제공하죠. 그 외에도 클래스의 변수명과 공유 pool 변수(addClasVarName:, addSharedPool:, initialize) 를 위한 실제 인터페이스도 제공합니다. 메타클래스는 클래스에 대한 유일한 인스턴스이며, 클래스는 인스턴스에 서비스를 제공하기 때문에, 모든 메타클래스는 결국 Class 를 상속받게 됩니다.


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





Latest revision as of 16:10, 16 September 2013

모든 메타클래스는 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