SqueakByExample:3.6: Difference between revisions
Onionmixer (talk | contribs) (번역 수정) |
Onionmixer (talk | contribs) (용어수정) |
||
(9 intermediate revisions by the same user not shown) | |||
Line 39: | Line 39: | ||
메시지 '''to:do'''를 반복 카운터의 초기 값 역할을 하는 숫자에 보낼 수 있습니다. 두 개의 인수는 | 메시지 '''to:do'''를 반복 카운터의 초기 값 역할을 하는 숫자에 보낼 수 있습니다. 아래의 예제에서 볼 수 있듯이 to:do에서 두 개의 인수는 상한선이 되는 값과 반복 카운터의 현재 값을 취하는 블록을 자신의 인수로 받습니다: | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
Line 51: | Line 51: | ||
===오름차순 반복 처리자(High-order lterators)=== | ===오름차순 반복 처리자(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:를 인터벌에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 계산되는 블록입니다. | 인터벌<sup>interval</sup>은 시작부터 끝까지 숫자의 시퀀스를 반복처리 해주는 컬렉션입니다. 1 to:10은 1에서 10까지의 인터벌을 나타내며, 메시지 do:를 인터벌에 보낼 수 있습니다. 인수는 컬렉션의 각 구성요소를 위해 계산되는 블록입니다. | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
Line 69: | Line 69: | ||
새로운 컬렉션을 만들고, 각각의 | 새로운 컬렉션을 만들고, 각각의 컬렉션에 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 78: | Line 78: | ||
마지막으로, 컬렉션이 inject:into: 메소드에서 ''functionalstyle fold operator''를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)으로 시작하고, 컬렉션의 각 구성요소를 | 마지막으로, 컬렉션이 inject:into: 메소드에서 ''functionalstyle fold operator''<ref name="역자주5">함수처럼 연산이 가능한 블록으로 쌓인 연산자</ref>를 지원한다는 것에 주의해야 합니다. 이것은 씨앗값(seed value)으로 시작하고, 컬렉션의 각 구성요소를 넣어주는 표현식을 사용하여 누적된 결과를 발생시킵니다. 합계와 곱셈의 결과는 이런 경우에 대한 전형적인 예입니다. | ||
<syntaxhighlight lang="smalltalk"> | <syntaxhighlight lang="smalltalk"> | ||
Line 88: | Line 88: | ||
컬렉션에 대한 좀 더 많은 내용은 9장에서 보실 수 있습니다. | 컬렉션에 대한 좀 더 많은 내용은 9장에서 보실 수 있습니다. | ||
Line 93: | Line 94: | ||
<references /> | <references /> | ||
[[Category:SqueakByExample]] | |||
[[Category:SqueakByExample] |
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
- ↑ squeak의 class browser등에서 찾아보면 collections라고 되어있는 많은 패키지들을 볼 수 있습니다. iterator를 이용한 데이터의 탐색을 지원하는 패키지들.
- ↑ Collection에 대한 조금 더 자세한 내용은 http://ta.onionmixer.net/wordpress/?p=163 내용을 참고
- ↑ 이 경우 'hello there' 라고 선언된 문자열 자체가 Collection 입니다. 왜나하면 String클래스 자체가 Collection을 상속받아 만들어졌기 때문입니다. char라는것에는 의미는 딱히 없습니다. 그냥 Iterator의 변수명이니까요.
- ↑ isVowel 은 Kernel-BasicObjects 패키지의 Chracter라는 class의 셀렉터이며 이 예제에서는 String을 배열로 char라는 Iterator를 이용해서 배열의 앞에서 맨 뒤까지 순차적으로 처리해서 현재 가리키고있는 배열의 element가 모음인경우 해당되는 문자를 반환하는데 사용된다
- ↑ 함수처럼 연산이 가능한 블록으로 쌓인 연산자