SqueakByExample:8.5: Difference between revisions
Onionmixer (talk | contribs) (용어수정) |
Onionmixer (talk | contribs) (번역수정) |
||
Line 1: | Line 1: | ||
==Boolean== | ==Boolean== | ||
Boolean 클래스는 스몰토크 언어가 클래스 라이브러리에 | Boolean 클래스는 스몰토크 언어가 얼마나 클래스 라이브러리에 강한 영향을 받는지에 대한 매우 흥미로운 예제입니다. Boolean 은 singleton 으로 구현한 클래스인 True 와 False 의 추상적 상위클래스입니다. | ||
Boolean 의 대부분의 동작에 대해서는 ifTrue:ifFalse: 메서드를 자세히 살펴보면 이해할 수 있으며, 이 메서드는 인수로서 두 개의 블록을 요구합니다. | |||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
(4 factorial > 20) ifTrue: [ 'bigger' ] ifFalse: [ 'smaller' ] ⇒ 'bigger' | (4 factorial > 20) ifTrue: [ 'bigger' ] ifFalse: [ 'smaller' ] ⇒ 'bigger' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[image:BooleanHierarchy.png|none|747px|thumb|그림 8.3: Boolean 클래스 계층도 ]] | |||
<strike>이것의 '''concrete subclasses'''에서의 실행은 모두 사소한 것들입니다.</strike> | |||
이 메서드는 Boolean 안의 추상메서드 입니다. 서브클래스에서 구현되어있는 내용은 대단히 간단합니다: | |||
메서드 8.13: ifTrue:ifFalse:의 실행 | |||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
True>>ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock | |||
↑trueAlternativeBlock value | ↑trueAlternativeBlock value | ||
False>>ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock | |||
↑falseAlternativeBlock value | ↑falseAlternativeBlock value | ||
</syntaxhighlight> | </syntaxhighlight> | ||
사실 | 사실 이런것들이 OOP 의 진수입니다: 메시지를 객체에 전송할때, 객체 스스로 수신받은 메세지에 따라 어떤 메서드를 사용할지를 결정하게 됩니다. 이경우, False 의 인스턴스가 false 의 선택사항을 결정하며, True 의 인스턴스는 true 의 선택사항을 결정합니다. Boolean 의 모든 추상메서드는 True 와 False 가 이러한 방법으로 구현되고 있습니다. 예를 들어보면 아래와 같습니다: | ||
메서드 8.14: negation 실행하기 | |||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
True>>not | |||
"Negation----answer false since the receiver is true." | "Negation----answer false since the receiver is true." | ||
↑false | ↑false | ||
Line 36: | Line 38: | ||
Boolean은 ifTrue:, ifFalse:, ifFalse: | Boolean은 ifTrue:, ifFalse:, ifFalse:ifTrue 와 같은 유용하고 편리한 메서드들을 제공합니다. 그리고 eager 와 lazy conjunction 과, disjunctions 사이에서 선택도 가능합니다. | ||
{| style="border: 1px solid black;" | {| style="border: 1px solid black;" | ||
Line 48: | Line 50: | ||
첫 번째 | 첫 번째 예제에서, & 양 옆의 Boolean 부분식 처리됩니다. 두 번째와 세 번째 예제에서는 and: 메서드가 인수로서 블록을 요구하기 때문에 결과적으로 좌측(수신자-receiver)만 처리됩니다. 우측(블록)은 첫 번째 인수가 true 인 경우에만 평가됩니다. | ||
{{CommentSqueak|and:와 or:가 어떻게 처리되는지를 예상해 보시기 바랍니다. {{Template:HighlightBold|Boolean}}에서 구현된 {{Template:HighlightBold|True}}와 {{Template:HighlightBold|False}}에서 실행(implementations)을 점검해 보시기 바랍니다..}} | |||
==Notes== | ==Notes== |
Latest revision as of 13:59, 11 August 2013
Boolean
Boolean 클래스는 스몰토크 언어가 얼마나 클래스 라이브러리에 강한 영향을 받는지에 대한 매우 흥미로운 예제입니다. Boolean 은 singleton 으로 구현한 클래스인 True 와 False 의 추상적 상위클래스입니다.
Boolean 의 대부분의 동작에 대해서는 ifTrue:ifFalse: 메서드를 자세히 살펴보면 이해할 수 있으며, 이 메서드는 인수로서 두 개의 블록을 요구합니다.
(4 factorial > 20) ifTrue: [ 'bigger' ] ifFalse: [ 'smaller' ] ⇒ 'bigger'
이것의 concrete subclasses에서의 실행은 모두 사소한 것들입니다.
이 메서드는 Boolean 안의 추상메서드 입니다. 서브클래스에서 구현되어있는 내용은 대단히 간단합니다:
메서드 8.13: ifTrue:ifFalse:의 실행
True>>ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
↑trueAlternativeBlock value
False>>ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
↑falseAlternativeBlock value
사실 이런것들이 OOP 의 진수입니다: 메시지를 객체에 전송할때, 객체 스스로 수신받은 메세지에 따라 어떤 메서드를 사용할지를 결정하게 됩니다. 이경우, False 의 인스턴스가 false 의 선택사항을 결정하며, True 의 인스턴스는 true 의 선택사항을 결정합니다. Boolean 의 모든 추상메서드는 True 와 False 가 이러한 방법으로 구현되고 있습니다. 예를 들어보면 아래와 같습니다:
메서드 8.14: negation 실행하기
True>>not
"Negation----answer false since the receiver is true."
↑false
Boolean은 ifTrue:, ifFalse:, ifFalse:ifTrue 와 같은 유용하고 편리한 메서드들을 제공합니다. 그리고 eager 와 lazy conjunction 과, disjunctions 사이에서 선택도 가능합니다.
(1>2) & (3<4) | ⇒ false | "must evaluate both sides" |
(1>2) and: [ 3<4 ] | ⇒ false | "only evaluate receiver" |
(1>2) and: [ (1/0) > 0 ] | ⇒ false | "argument block is never evaluated, so no exception" |
첫 번째 예제에서, & 양 옆의 Boolean 부분식 처리됩니다. 두 번째와 세 번째 예제에서는 and: 메서드가 인수로서 블록을 요구하기 때문에 결과적으로 좌측(수신자-receiver)만 처리됩니다. 우측(블록)은 첫 번째 인수가 true 인 경우에만 평가됩니다.
and:와 or:가 어떻게 처리되는지를 예상해 보시기 바랍니다. Boolean에서 구현된 True와 False에서 실행(implementations)을 점검해 보시기 바랍니다..