SqueakByExample:3.6: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(스타일 수정)
(용어수정)
 
(17 intermediate revisions by the same user not shown)
Line 1: Line 1:
==간단하게 살펴보는 조건과 루프 (Conditionals and loops in a nutshell)==
==간단하게 살펴보는 조건과 루프 (Conditionals and loops in a nutshell)==


스몰토크는 컨트롤 구성(control constructs)을 위한 특별한 구문을 제공하지 않습니다. 대신에, 컨트롤 구성은 인수로서의 블록과 함께, 메시지를 불리언(booleans), 숫자(numbers) 그리고 컬렉션(collections)에 보냄으로서 표현됩니다.
스몰토크는 제어문을 만들기 위한 특별한 문법을 제공하지 않습니다. 그대신, 제어문은 인수로서의 블록과 함께, Boolean, 숫자 그리고 컬렉션에 메시지를 보내는 표현을 이용해서 만들수 있습니다.


조건들은(conditionals) 메시지 '''ifTrue:''', '''ifFalse:''' 또는 '''ifTrue:ifFalse:''' 들중 하나를 불리언 표현식의 결과에 보냄으로서 표현됩니다. 불리언에 대해 좀더 많은 내용을 원하시면 8장을 보십시오.  
조건들은 메시지 '''ifTrue:''', '''ifFalse:''' 또는 '''ifTrue:ifFalse:''' 들 중 하나를 Boolean 표현식의 결과쪽으로 보내서 표현합니다. Boolean에 대해 좀 더 많은 내용을 원하시면 8장을 보십시오.


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 11: Line 11:
</syntaxhighlight>
</syntaxhighlight>


루프는 메시지를 블록, 정수 또는 컬렉션을 블록에 보냄으로써 전형적으로 표현되었습니다. 루프를 위한 나가기 조건(the exit condtion)이 반복적으로 평가되었으므로, 루프는 불리언 값 보다는 블록이 되어야만 합니다. 여기에 절차상의 루프에 대한 예가 있습니다:  
 
반복문은 일반적으로 블록, 정수 또는 컬렉션에 메세지를 보내는것으로 표현됩니다. 루프의 종료 조건을 반복적으로 판단하기 때문에, 루프는 Boolean 값보다는 블락이 되어야 합니다. Boolean은 종료조건이 한번에 끝나버릴 수 있기 때문이죠. 여기에 절차적 반복문에 대한 예가 있습니다:  


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 18: Line 19:
n    ⇒    1024
n    ⇒    1024
</syntaxhighlight>
</syntaxhighlight>


'''whileFalse:''' 나가기 조건을 뒤바꿉니다.
'''whileFalse:''' 나가기 조건을 뒤바꿉니다.
Line 27: Line 29:
</syntaxhighlight>
</syntaxhighlight>


'''timesRepeat:''' 고정된 반복(iteration)을 실행하기 위한 단순한 방법을 제공합니다:
 
'''timesRepeat:''' 고정회수 반복을 실행하기 위한 간단한 방법도 제공됩니다:


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 35: Line 38:
</syntaxhighlight>
</syntaxhighlight>


우리는 메시지 '''to:do'''를 루프 카운터(a loop counter)의 초기 값(initial value)로서 기능하는 숫자에 보낼 수 있습니다. 두 개의 인수는 상한(上限)과(the upper bound)와 자신의 인수로서 루프카운터의 현재 값을 취하는 블록입니다:
 
메시지 '''to:do'''를 반복 카운터의 초기 값 역할을 하는 숫자에 보낼 수 있습니다. 아래의 예제에서 볼 수 있듯이 to:do에서 두 개의 인수는 상한선이 되는 값과 반복 카운터의 현재 값을 취하는 블록을 자신의 인수로 받습니다:


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 43: Line 47:
</syntaxhighlight>
</syntaxhighlight>


===높은-자릿수 반복자(High-order lterators)===


컬렉션들은 많은 숫자의 다양한 클래스로 이루어져 있으며, 그것들 중 많은 클래스는 동일한 프로토콜을 지원합니다. 이러한 컬렉션들을 위해 반복처리하는(iterating) 가장 중요한 메시지는 do:, collect:, select:, reject:, detect: 그리고 inject:into:.을 포함합니다. 이러한 메시지들은, 고도로 압축된 코드를 쓰기 위한 고급 반복처리자(high-level iterators)를 정의할 수 있도록 해줍니다.


인터벌(interval)시작에서 끝까지 숫자의 시퀀스를 반복처리 해주는 컬렉션입니다. 1 to:10은 1에서 10까지의 인터벌을 나타내며, 우리는 메시지 do:를 이것에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 평가되는 블록입니다.  
===오름차순 반복 처리자(High-order lterators)===
 
컬렉션들<ref name="역자주1">squeak의 class browser등에서 찾아보면 collections라고 되어있는 많은 패키지들을 볼 수 있습니다. iterator를 이용한 데이터의 탐색을 지원하는 패키지들.</ref>은 수 많은 다양한 클래스로 이루어져 있으며, 그들 중 대부분의 클래스는 동일한 프로토콜을 지원합니다. 이러한 컬렉션들은 반복 처리를 지원하기 위한 몇가지 중요한 셀렉터를 공통으로 가지고 있는데 가장 중요한 메시지로 do:, collect:, select:, reject:, detect: 그리고 inject:into:.등이 포함됩니다. 이러한 메시지들은, 고수준의 압축된 코드를 정의할 수 있도록 고수준의  반복처리자<sup>high-level iterators</sup>를 사용할 수 있게 합니다.<ref name="역자주2">Collection에 대한 조금 더 자세한 내용은 http://ta.onionmixer.net/wordpress/?p=163 내용을 참고</ref>
 
인터벌<sup>interval</sup>시작부터 끝까지 숫자의 시퀀스를 반복처리 해주는 컬렉션입니다. 1 to:10은 1에서 10까지의 인터벌을 나타내며, 메시지 do:를 인터벌에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 계산되는 블록입니다.


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 54: Line 60:
result    ⇒    '1 2 3 4 5 6 7 8 9 10 '
result    ⇒    '1 2 3 4 5 6 7 8 9 10 '
</syntaxhighlight>
</syntaxhighlight>


collect: 각 구성요소를 변화시켜, 동일한 크기의 새로운 컬렉션을 만듭니다.
collect: 각 구성요소를 변화시켜, 동일한 크기의 새로운 컬렉션을 만듭니다.
Line 61: Line 68:
</syntaxhighlight>
</syntaxhighlight>


새로운 컬렉션을 만들고, 각각의 컬렉션은 불리언 블록 조건(the Boolean block condition)을 만족시키는 구성요소의 서브세트(subset)포함합니다. detect:는 조건을 만족시키는 첫 번째 구성요소를 리턴 합니다. 문자열(strings) 또한 컬렉션이므로 모든 문자들을 반복처리 할수 있다는 것을 잊지 말아주십시오.
 
새로운 컬렉션을 만들고, 각각의 컬렉션에 Boolean 블록 조건을 만족하는 구성요소의 서브세트<sup>subset</sup>셀렉터에 메세지로 보냅니다. detect:는 조건을 만족시키는 첫 번째 구성요소를 반환합니다. String 또한 컬렉션이므로 모든 Character 들은 반복 처리 할 수 있다는 것을 잊지 말아주십시오.<ref name="역자주3">이 경우 'hello there' 라고 선언된 문자열 자체가 Collection 입니다. 왜나하면 String클래스 자체가 Collection을 상속받아 만들어졌기 때문입니다. char라는것에는 의미는 딱히 없습니다. 그냥 Iterator의 변수명이니까요.</ref><ref name="역자주4">isVowel 은 Kernel-BasicObjects 패키지의 Chracter라는 class의 셀렉터이며 이 예제에서는 String을 배열로 char라는 Iterator를 이용해서 배열의 앞에서 맨 뒤까지 순차적으로 처리해서 현재 가리키고있는 배열의 element가 모음인경우 해당되는 문자를 반환하는데 사용된다</ref>


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 69: Line 77:
</syntaxhighlight>
</syntaxhighlight>


마지막으로, 여러분은 컬렉션이 inject:into: 메소드에서 ''functionalstyle fold operator''를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)시작하고, 컬렉션의 각 구성요소를 주입하는 표현식을 사용하여 누적 결과를 발생시킵니다. 합계와(sum) 생산물은(products) 전형적인 예입니다.
 
마지막으로, 컬렉션이 inject:into: 메소드에서 ''functionalstyle fold operator''<ref name="역자주5">함수처럼 연산이 가능한 블록으로 쌓인 연산자</ref>를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)으로 시작하고, 컬렉션의 각 구성요소를 넣어주는 표현식을 사용하여 누적된 결과를 발생시킵니다. 합계와 곱셈의 결과는 이런 경우에 대한 전형적인 예입니다.


<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Line 75: Line 84:
</syntaxhighlight>
</syntaxhighlight>


이것은 0+1+2+3+4+5+6+7+8+9+10와 동등합니다.


컬렉션에 대한 좀더 많은 내용은 9장에서 보실 수 있습니다.
이 코드는 0+1+2+3+4+5+6+7+8+9+10와 같습니다..
 
컬렉션에 대한 좀 더 많은 내용은 9장에서 보실 수 있습니다.
 
 


==Notes==
==Notes==

Latest revision as of 02:20, 17 September 2013

간단하게 살펴보는 조건과 루프 (Conditionals and loops in a nutshell)

스몰토크는 제어문을 만들기 위한 특별한 문법을 제공하지 않습니다. 그대신, 제어문은 인수로서의 블록과 함께, Boolean, 숫자 그리고 컬렉션에 메시지를 보내는 표현을 이용해서 만들수 있습니다.

조건들은 메시지 ifTrue:, ifFalse: 또는 ifTrue:ifFalse: 들 중 하나를 Boolean 표현식의 결과쪽으로 보내서 표현합니다. Boolean에 대해 좀 더 많은 내용을 원하시면 8장을 보십시오.

(17 * 13 > 220)
  ifTrue: [ 'bigger' ]
  ifFalse: [ 'smaller' ]        'bigger'


반복문은 일반적으로 블록, 정수 또는 컬렉션에 메세지를 보내는것으로 표현됩니다. 루프의 종료 조건을 반복적으로 판단하기 때문에, 루프는 Boolean 값보다는 블락이 되어야 합니다. Boolean은 종료조건이 한번에 끝나버릴 수 있기 때문이죠. 여기에 절차적 반복문에 대한 예가 있습니다:

n := 1.
[ n < 1000 ] whileTrue: [ n := n*2 ].
n        1024


whileFalse: 나가기 조건을 뒤바꿉니다.

n := 1.
[ n > 1000 ] whileFalse: [ n := n*2 ].
n        1024


timesRepeat: 고정회수 반복을 실행하기 위한 간단한 방법도 제공됩니다:

n := 1.
10 timesRepeat: [ n := n*2 ].
n        1024


메시지 to:do를 반복 카운터의 초기 값 역할을 하는 숫자에 보낼 수 있습니다. 아래의 예제에서 볼 수 있듯이 to:do에서 두 개의 인수는 상한선이 되는 값과 반복 카운터의 현재 값을 취하는 블록을 자신의 인수로 받습니다:

result := String new.
1 to: 10 do: [:n | result := result, n printString, ' '].
result        '1 2 3 4 5 6 7 8 9 10 '


오름차순 반복 처리자(High-order lterators)

컬렉션들[1]은 수 많은 다양한 클래스로 이루어져 있으며, 그들 중 대부분의 클래스는 동일한 프로토콜을 지원합니다. 이러한 컬렉션들은 반복 처리를 지원하기 위한 몇가지 중요한 셀렉터를 공통으로 가지고 있는데 가장 중요한 메시지로 do:, collect:, select:, reject:, detect: 그리고 inject:into:.등이 포함됩니다. 이러한 메시지들은, 고수준의 압축된 코드를 정의할 수 있도록 고수준의 반복처리자high-level iterators를 사용할 수 있게 합니다.[2]

인터벌interval은 시작부터 끝까지 숫자의 시퀀스를 반복처리 해주는 컬렉션입니다. 1 to:10은 1에서 10까지의 인터벌을 나타내며, 메시지 do:를 인터벌에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 계산되는 블록입니다.

result := String new.
(1 to: 10) do: [:n | result := result, n printString, ' '].
result        '1 2 3 4 5 6 7 8 9 10 '


collect: 각 구성요소를 변화시켜, 동일한 크기의 새로운 컬렉션을 만듭니다.

(1 to: 10) collect: [ :each | each * each ]        #(1 4 9 16 25 36 49 64 81 100)


새로운 컬렉션을 만들고, 각각의 컬렉션에 Boolean 블록 조건을 만족하는 구성요소의 서브세트subset를 셀렉터에 메세지로 보냅니다. detect:는 조건을 만족시키는 첫 번째 구성요소를 반환합니다. String 또한 컬렉션이므로 모든 Character 들은 반복 처리 할 수 있다는 것을 잊지 말아주십시오.[3][4]

'hello there' select: [ :char | char isVowel ]        'eoee'
'hello there' reject: [ :char | char isVowel ]        'hll thr'
'hello there' detect: [ :char | char isVowel ]        $e


마지막으로, 컬렉션이 inject:into: 메소드에서 functionalstyle fold operator[5]를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)으로 시작하고, 컬렉션의 각 구성요소를 넣어주는 표현식을 사용하여 누적된 결과를 발생시킵니다. 합계와 곱셈의 결과는 이런 경우에 대한 전형적인 예입니다.

(1 to: 10) inject: 0 into: [ :sum :each | sum + each ]        55


이 코드는 0+1+2+3+4+5+6+7+8+9+10와 같습니다..

컬렉션에 대한 좀 더 많은 내용은 9장에서 보실 수 있습니다.


Notes

  1. squeak의 class browser등에서 찾아보면 collections라고 되어있는 많은 패키지들을 볼 수 있습니다. iterator를 이용한 데이터의 탐색을 지원하는 패키지들.
  2. Collection에 대한 조금 더 자세한 내용은 http://ta.onionmixer.net/wordpress/?p=163 내용을 참고
  3. 이 경우 'hello there' 라고 선언된 문자열 자체가 Collection 입니다. 왜나하면 String클래스 자체가 Collection을 상속받아 만들어졌기 때문입니다. char라는것에는 의미는 딱히 없습니다. 그냥 Iterator의 변수명이니까요.
  4. isVowel 은 Kernel-BasicObjects 패키지의 Chracter라는 class의 셀렉터이며 이 예제에서는 String을 배열로 char라는 Iterator를 이용해서 배열의 앞에서 맨 뒤까지 순차적으로 처리해서 현재 가리키고있는 배열의 element가 모음인경우 해당되는 문자를 반환하는데 사용된다
  5. 함수처럼 연산이 가능한 블록으로 쌓인 연산자