Smalltalk - Sizuha/devdog GitHub Wiki

ํŠน์ง•

  • ๋ฌธ๋ฒ•์ ์ธ ์š”์†Œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด๊ณ , ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์€ ๊ฐ์ฒด์™€ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฉ”์„ธ์ง€ ๊ตํ™˜์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„๋œ๋‹ค.
  • ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด: Class, ํด๋กœ์ ธ ํ•จ์ˆ˜(ํด๋กœ์ ธ ๋ธ”๋ก) ๋“ฑ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
  • ๊ฐ์ฒด์˜ ํƒ€์ž…(Class)์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๋‹จ์ง€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค์ผ ๋ฟ์ด๊ณ , ๋‹จ์ง€ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ด ๋ฉ”์„ธ์ง€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๋กœ๋งŒ ํŒ๋‹จํ•œ๋‹ค.
    • ์„œ๋กœ ๋‹ค๋ฅธ Class์˜ ๊ฐ์ฒด๋ผ ํ•  ์ง€๋ผ๋„ A๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด, ์ด ๊ฒฝ์šฐ์— ํ•œํ•ด์„œ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ผ๊ณ  ๊ฐ„์ฃผํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
    • ์ž์—ฐ์Šค๋ ˆ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘์‹ฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์œ ๋„๋œ๋‹ค.
  • VMํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ง€์›ํ•œ๋‹ค.

๋ฌธ๋ฒ•

์ง€์ •์–ด(Reserved Words)

Smalltalk์—์„œ๋Š” ํŠน๋ณ„ ์ƒ์ˆ˜ ์„ธ ๊ฐœ์™€ ํŠน๋ณ„ ๋ณ€์ˆ˜ ์„ธ ๊ฐœ, ๋ชจ๋‘ ์—ฌ์„ฏ ๊ฐœ์˜ '๊ฐ’'(value)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์— ์ง€์ •์–ด๊ฐ€ ์“ฐ์ธ๋‹ค.

  • true

True ํด๋ž˜์Šค์˜ ์œ ์ผํ•œ ์‹ค์ฒด(instance). ๋…ผ๋ฆฌ๊ฐ’์ด๋‹ค.

result := true
  • false

False ํด๋ž˜์Šค์˜ ์œ ์ผํ•œ ์‹ค์ฒด. ๋…ผ๋ฆฌ๊ฐ’์ด๋‹ค.

result := false
  • nil

UndefinedObject ํด๋ž˜์Šค์˜ ์œ ์ผํ•œ ์‹ค์ฒด. ์ƒํƒœ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ์ฒด. Null๊ฐ’. ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด nil์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

garbage := nil
  • self

ํ˜„์žฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

self blahBlah
  • super

self์™€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, ๋ฉ”์„œ๋“œ(method)๋ฅผ ์ฐพ์„ ๋•Œ ์ž๊ธฐ๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ๋†’์€ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค.

super new initialize

์—ฐ์‚ฐ์ž(Operators)

Smalltalk์—๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • :=

๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค. ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฒฐํ•ฉํ•œ๋‹ค. Smalltalk์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” '์ฐธ์กฐ ์˜๋ฏธ'(reference sementic)๋ฅผ ๊ฐ–๋Š”๋‹ค.

count := sum := 0.
  • ^

๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์‹ ์ž(sender)๋กœ ๊ฐ์ฒด๋ฅผ ๋Œ๋ ค์ฃผ๊ณ , ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์„ ๋๋‚ธ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ๋Š”, self๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ^results

๋ฌธ๋ฒ• ๊ตฌ์„ฑ ์š”์†Œ (Syntactical components)

Smalltakl์—์„œ๋Š” ํŠน์ˆ˜ํ•œ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์ดˆ์ ์ธ ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

  • [ ]

์ฝ”๋“œ์˜ ๋ธ”๋Ÿญ. ์ด ์•ˆ์— Smalltalk์˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ๋“ค์–ด๊ฐ„ ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฏธ๋ค„์ง„๋‹ค(deferred). BlockClosure ํด๋ž˜์Šค์˜ ์‹ค์ฒด๊ฐ€ ๋œ๋‹ค.

[ :a b | | sum | sum := a + b ]
  • #

Symbol ํด๋ž˜์Šค์˜ ์‹ค์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ symbol์„ ๋งŒ๋“ค๋ ค๋ฉด #' ' ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

#between:and:
  • #( )

๋ฐฐ์—ด, ์ฆ‰ Array ํด๋ž˜์Šค์˜ ์‹ค์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

#(1 2 'apple')
  • #[ ]

์›์†Œ๊ฐ€ ๋ฐ”์ดํŠธ์ธ ๋ฐฐ์—ด, ์ฆ‰ ByteArray ํด๋ž˜์Šค์˜ ์‹ค์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

#[16r0D 16r0A]
  • | |

์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.

| count sum |
  • $

๋ฌธ์ž(Character)์˜ ์‹ค์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

$a
  • ' '

๋ฌธ์ž์—ด(String)์˜ ์‹ค์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

'Hello world!'
  • " "

๋ฌด์‹œํ•œ๋‹ค. ์„ค๋ช…๋ฌธ(comment)์„ ์“ธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

"This is a comment."
  • .

์—ฌ๋Ÿฌ ๊ฐœ์˜ Smalltalk ๋ฌธ์žฅ์„ ๋ถ„๋ฆฌํ•œ๋‹ค.(๋ฌธ์žฅ ๋งˆ์นจํ‘œ๊ฐ€ ์•„๋‹ˆ๋‹ค)

self foo. self bar. self blahBlah
  • ;

ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ์—ฐ์†ํ•ด์„œ(cascading) ๋ณด๋‚ธ๋‹ค.

self foo; bar; blahBlah
  • :

ํ‚ค์›Œ๋“œ(keyword)๋ฅผ ๋งŒ๋“ ๋‹ค.

5 between: 1 and: 10

Block ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)๋ฅผ ๋งŒ๋“ ๋‹ค.

[ :each | each size ]

๋ฉ”์‹œ์ง€์˜ ์ข…๋ฅ˜(type of messages)

Smalltalk์—๋Š” ๋ชจ๋‘ ์„ธ ์ข…๋ฅ˜์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๋‹จํ•ญ ๋ฉ”์‹œ์ง€(unary message)

์ธ์ž๊ฐ€ ์—†๋Š” ๋ฉ”์‹œ์ง€

200 factorial
  • ์ดํ•ญ ๋ฉ”์‹œ์ง€(binary message)

ํŠน์ˆ˜๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์‹œ์ง€. ํ•œ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง„๋‹ค.

3 + 4
  • ํ‚ค์›Œ๋“œ ๋ฉ”์‹œ์ง€(keyword message)

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ž๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ „๋‹ฌํ•œ๋‹ค.

5 between: 1 and: 10

๋ฉ”์‹œ์ง€์˜ ์šฐ์„ ์ˆœ์œ„

  1. ๋‹จํ•ญ ๋ฉ”์‹œ์ง€
  2. ์ดํ•ญ ๋ฉ”์‹œ์ง€
  3. ํ‚ค์›Œ๋“œ ๋ฉ”์‹œ์ง€

๊ฐ™์€ ์ˆœ์œ„์˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฌด์กฐ๊ฑด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

3 factorial + 1 max: 10

"-> 3 factorial + 1 max: 10"
"-> 6 + 1 max: 10"
"-> 7 max: 10"
"-> 10"

์ฃผ์˜! ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์šฐ์„  ์ˆœ์œ„์— ์˜ˆ์™ธ๋Š” ์—†๋‹ค!
์‚ฐ์ˆ  ์—ฐ์‚ฐ(+ - * /)์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ์ดํ•ญ์—ฐ์‚ฐ์ž๋กœ ์ทจ๊ธ‰๋˜๋ฏ€๋กœ, ์ˆ˜์‹ ์•ˆ์—์„œ ๊ณฑ์…ˆ์ด๋‚˜ ๋‚˜๋ˆ—์…ˆ์ด ๋จผ์ € ์ ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ( )๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌํ„ฐ๋Ÿด(literal)

๋ฌธ์ž์—ด์ด๋‚˜ ๋ฐฐ์—ด ๋“ฑ, ๋ฌธ๋ฒ• ํ•ญ๋ชฉ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๋“ค์€ ์ƒ๋žต.

  • ์ •์ˆ˜
123 "123"
16rFFFF "65535"
2r1010 "10"

10์ง„ ํ‘œํ˜„์€ ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ํ•˜๋ฉด ๋˜๊ณ , 2์ง„๋ฒ•์ด๋‚˜ 16์ง„๋ฒ• ๋“ฑ์˜ ํ‘œํ˜„์€ r ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ์‹ค์ˆ˜
123.456 "123.456"
16rFFFF.AB "65535.66796875"
2r1010.11 "10.75"

์‹ค์ˆ˜ ํ‘œํ˜„๋„ ์†Œ์ˆ˜์  ์ฐ๋Š” ๊ฒƒ๋งŒ ์ œ์™ธํ•˜๋ฉด ์ •์ˆ˜๋ž‘ ๋ณ„๋ฐ˜ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

์ง€์ˆ˜ ํ‘œํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

10e5 "1000000"
1.5e10

์ œ์–ด ๋ฉ”์„ธ์ง€

if๋‚˜ for ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ๋„ Smalltalk์—์„œ๋Š” ๋ฌธ๋ฒ•์ด ์•„๋‹Œ ๊ฐ์ฒด๊ฐ„์˜ ๋ฉ”์„ธ์ง€ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

if

Booleanํ˜• ๊ฐ์ฒด์— ifTrue: ํ˜น์€ ifFalse: ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Transcript clear.
1 < 2 ifTrue: [ Transcript show: 'true.' ] ifFalse: [ Transcript show: 'false' ]

ํด๋กœ์ ธ ๋ธ”๋ก

Smalltalk์—์„œ ๋ธ”๋ก ๊ฐ์ฒด[ ]๋Š” ์ผ์ข…์˜ ํด๋กœ์ ธ ์—ญํ• ์„ ํ•œ๋‹ค. ์ฐธ์กฐ ๋ฒ”์œ„๊ฐ€, ๋ธ”๋ก ๋‚ด์˜ ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ธ”๋ก ๋ฐ–์˜ ๋ณ€์ˆ˜๋“ค๊นŒ์ง€๋„ ํฌํ•จํ•œ๋‹ค.

๋ธ”๋ก ๋‚ด์šฉ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ

์–ด๋–ค ๊ฐ์ฒด๋“  value๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๊ทธ ๊ฐ์ฒด์˜ ๊ณ ์œ ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ธ”๋ก์˜ ๊ฒฝ์šฐ, value ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๋ธ”๋ก์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

 [ 1 + 2 ] value "return: 3"

ํŒŒ๋ผ๋งคํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ธ”๋ก์˜ ๊ฒฝ์šฐ:

[ :msg | Transcript show: msg ] value: 'Hello World'

"ํŒŒ๋ผ๋งคํ„ฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด value:value: ... ์‹์œผ๋กœ ๋ฉ”์„ธ์ง€ ์ „๋‹ฌ"

๋ฐ˜๋ณต

nํšŒ ๋ฐ˜๋ณต

์ •์ˆ˜ํ˜• ๊ฐ์ฒด์— timesRepeat: ๋ฉ”์„ธ์ง€๋ฅผ ๋˜์ง€๋ฉด, ์ธ์ž๋กœ ๋„˜๊ธด ๋ธ”๋ก์„ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

sum := 0.
10 timesRepeat: [ sum := sum + 1 ].

์ปฌ๋ ‰์…˜ ์ˆœํšŒ

๋ฐฐ์—ด ๋“ฑ์˜ ์ปฌ๋ ‰์…˜ ๋‚ด์šฉ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊บผ๋‚ด์˜ค๋ฉด์„œ ๋ฐ˜๋ณตํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ.

์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์— do: ๋ฉ”์„ธ์ง€๋ฅผ ๋˜์ง„๋‹ค. ๋ฐ˜๋ณต ๋‚ด์šฉ์„ ์ˆ˜ํ–‰ํ•  ๋ธ”๋ก์—์„œ๋Š” ์ธ์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ์ปฌ๋ ‰์…˜์˜ ๋‚ด์šฉ์„ ๋ฐ›์•„ ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

(1 to: 10) do: [ :each | Transcript showln: each ].

while

[์กฐ๊ฑด ๋ธ”๋ก] whileTrue: [ ๋‚ด์šฉ ]. "์กฐ๊ฑด์ด ์ฐธ์ธ ๋™์•ˆ ๋ฐ˜๋ณต."
[์กฐ๊ฑด ๋ธ”๋ก] whileFalse: [ ๋‚ด์šฉ ]. "์กฐ๊ฑด์ด ๊ฑฐ์ง“์ธ ๋™์•ˆ ๋ฐ˜๋ณต."

sum := 0.
[ sum < 100 ] whileTrue: [ sum := sum + 1 ].

Transcript clear; show: sum.

๋…ผ๋ฆฌ ์—ฐ์‚ฐ

and / or

if ๋“ฑ์—์„œ ๋ณตํ•ฉ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๊ณ ์ž ํ•  ๋•Œ and: ํ˜น์€ or: ๋ฉ”์„ธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

condA and: condB ifTrue: [ Transcript show: 'true.' ]
condA or: condB ifTrue: [ Transcript show: 'true.' ]

and: ํ˜น์€ or: ๋Œ€์‹ ์— ์—ฐ์‚ฐ์ž ๋ฉ”์„ธ์ง€๋กœ & ํ˜น์€ | ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, and: ๋‚˜ or: ์—์„œ๋Š” ๋ธ”๋ก[ ] ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์— ๋ฐ˜ํ•ด, ์—ฐ์‚ฐ์ž๋กœ ํ•  ๊ฒฝ์šฐ์—๋Š” ๋ธ”๋ก ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค.

condA & condB ifTrue: [ Transcript show: 'true.' ]
condA | condB ifTrue: [ Transcript show: 'true.' ]

"์•„๋ž˜์˜ ๊ฒฝ์šฐ๋Š” ์—๋Ÿฌ"
condA & [ ... ] ifTrue: [ Transcript show: 'true.' ]
condA | [ ... ] ifTrue: [ Transcript show: 'true.' ]

"๋ธ”๋ก์„ ๊ตณ์ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค"
condA & [ ... ] value ifTrue: [ Transcript show: 'true.' ]
condA | [ ... ] value ifTrue: [ Transcript show: 'true.' ]

not

Booleanํ˜• ๊ฐ์ฒด์— not ๋ฉ”์„ธ์ง€๋ฅผ ๋˜์ง€๋ฉด ๋…ผ๋ฆฌ๋ถ€์ • ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰.

true not. "false"
false not. "true"

xor

Booleanํ˜• ๊ฐ์ฒด 2๊ฐœ๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ, ์–‘์ชฝ ๋ชจ๋‘๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ๋งŒ true๊ฐ€ ๋จ.

true xor: true. "false"
false xor: true. "true"
false xor: false. "false"
false xor: true. "true"
โš ๏ธ **GitHub.com Fallback** โš ๏ธ