SqueakByExample:12.2

From 흡혈양파의 번역工房
Revision as of 12:04, 16 September 2013 by Onionmixer (talk | contribs) (번역수정)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

스몰토크 객체 모델에 대한 복습

모든 것이 객체가 되기 때문에, 스몰토크에서는 "파랑"색상 또한 객체 입니다.

Color blue -> Color blue


모든 객체 클래스의 인스턴스입니다. "파랑"색상 의 클래스는 Color 입니다.

Color blue class  Color


흥미로운 사실이 있습니다만, 사용자는 투명도alpha value를 지정하면, TranslucentColor 라는 클래스의 인스턴스를 얻을 수 있습니다.

(Color blue alpha: 0.4) class  TranslucentColor


Morph 를 만들고, Morph 에 대한 색상으로서 반투명 객체 자체를 지정할 수 있습니다:

EllipseMorph new color: (Color blue alpha: 0.4); openInWorld


이렇게하면 그림 12.1 같은 결과가 됩니다.


그림 12.1: 반투명 타원


Rule 3에 의해, 모든 클래스는 super클래스를 가지고 있습니다. TranslucentColor 의 super클래스는 Color 이며, Color 의 super클래스는 Object 입니다:

TranslucentColor superclass        Color
Color superclass        Object


Rule 4 "모든 동작은 메시지를 보낼 때 일어납니다" 라는 내용을 전제로, blue 는 Color 를 대상으로 하는 메시지, class 와 alpha: 는 "청색"객체 에 대한 메시지, openWorld 는 타원형-Morph 에 대한 메시지, 그리고 superclass 는 TranslucentColor 및 Color 에 대한 메시지가 됩니다. 스몰토크에서 모든것은 객체이기 때문에, 어떤 경우에서도 메시지의 수신자는 객체가 됩니다. 다만 몇몇 경우는 수신자가 클래스인 경우도 있기는 합니다.

Rule 5 "메서드 탐색은 상속 관계를 따릅니다" 라는 전제하에, Color blue alpha: 0.4 의 결과로 얻을 수 있는 객체에 class 메시지를 보내면, 그림 12.2 에서처럼, class 메시지는 작동을 위해 결과 자체를 객체로 취급합니다[1].


아래의 그림은 is-a 의 상속관계를 보여주고 있습니다. 아래 그림의 내용처럼 "Color blue alpha: 0.4" 의 결과로 통해 얻을 수 있는 translucentColor 객체는, 사실 TranslucentColor 클래스의 인스턴스입니다만, 동시에 Color 객체, 또는 Object 의 객체라고 부를수도 있는데, 왜냐하면 translucentColor 객체는 Color 또는 Object 에서 선언된 모든 메시지에도 응답이 가능하기 때문입니다. 사실, isKindOf: 메시지를 객체에 보내면 수신자가 인자로 주어진 클래스와 is-a 의 관계에 있는지를 알 수도 있습니다[2].


그림 12.2: 메시지를 translucent color 에 전송했을때의 상태


Notes

  1. Color blue alpha: 0.4 의 PrintIt 결과는 (TranslucentColor r: 0.0 g: 0.0 b: 1.0 alpha: 0.4) 가 됩니다. 또 이 결과 자체에 class 메시지를 보내서 PrintIt 하면 결국은 TranslucentColor 라는 결과를 얻을 수 있습니다
  2. isKindOf: 메서드는 Object 클래스에 선언되어있으며 "Answer whether the class, aClass, is a superclass or class of the receiver." 라는 주석을 가지고 있습니다. 이 메서드를 이용하면 수신자의 클래스가 인자로 주어진 클래스에 대해 상위클래스인지 아닌지를 알아낼 수 있습니다. "2 isKindOf: String" 이런정도의 구문을 쓸 수 있다는 의미가 되겠습니다.