Smalltalk - Sizuha/devdog GitHub Wiki
- ๋ฌธ๋ฒ์ ์ธ ์์๋ฅผ ์ต์ํ์ผ๋ก ์ค์ด๊ณ , ๊ฐ๋ฅํ ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ๊ฐ์ฒด์ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฉ์ธ์ง ๊ตํ์ ํตํด์ ๊ตฌํ๋๋ค.
- ์กด์ฌํ๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด: Class, ํด๋ก์ ธ ํจ์(ํด๋ก์ ธ ๋ธ๋ก) ๋ฑ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ก ๊ตฌํ๋์ด ์๋ค.
- ๊ฐ์ฒด์ ํ์
(Class)์ ํ์ธํ์ง ์๋๋ค. ๋ชจ๋ ๋ณ์๋ ๋จ์ง ๊ฐ์ฒด์ ๋ํ ๋ ํผ๋ฐ์ค์ผ ๋ฟ์ด๊ณ , ๋จ์ง ํด๋น ๊ฐ์ฒด๊ฐ ์ด ๋ฉ์ธ์ง๋ฅผ ์ดํดํ ์ ์๋๊ฐ? ๋ก๋ง ํ๋จํ๋ค.
- ์๋ก ๋ค๋ฅธ Class์ ๊ฐ์ฒด๋ผ ํ ์ง๋ผ๋ A๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ ์๋ง ์๋ค๋ฉด, ์ด ๊ฒฝ์ฐ์ ํํด์๋ ๊ฐ์ ํ์ ์ ๊ฐ์ฒด๋ผ๊ณ ๊ฐ์ฃผํด๋ ๋ฌด๋ฐฉํ๋ค.
- ์์ฐ์ค๋ ์ธํฐํ์ด์ค ์ค์ฌ์ ํ๋ก๊ทธ๋๋ฐ์ด ์ ๋๋๋ค.
- VMํ๊ฒฝ์์ ๋์ํ๋ฉฐ, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ํ๋ค.
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
Smalltalk์๋ ๋ค์์ ๋ ๊ฐ์ง ์ฐ์ฐ์๊ฐ ์กด์ฌํ๋ค.
- :=
๋ณ์์ ๊ฐ์ ๋์ ํ๋ค. ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฒฐํฉํ๋ค. Smalltalk์ ๋ชจ๋ ๋ณ์๋ '์ฐธ์กฐ ์๋ฏธ'(reference sementic)๋ฅผ ๊ฐ๋๋ค.
count := sum := 0.
- ^
๋ฉ์๋์์ ๋ฐ์ ์(sender)๋ก ๊ฐ์ฒด๋ฅผ ๋๋ ค์ฃผ๊ณ , ๋ฉ์๋์ ์คํ์ ๋๋ธ๋ค. ์ด ์ฐ์ฐ์๊ฐ ์๋ ๋ฉ์๋๋, self๋ฅผ ๋๋ ค์ค๋ค. ^results
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 ]
Smalltalk์๋ ๋ชจ๋ ์ธ ์ข ๋ฅ์ ๋ฉ์์ง๊ฐ ์๋ค.
- ๋จํญ ๋ฉ์์ง(unary message)
์ธ์๊ฐ ์๋ ๋ฉ์์ง
200 factorial
- ์ดํญ ๋ฉ์์ง(binary message)
ํน์๊ธฐํธ๋ฅผ ์ฌ์ฉํ ๋ฉ์์ง. ํ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง๋ค.
3 + 4
- ํค์๋ ๋ฉ์์ง(keyword message)
์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ํค์๋๋ก ๋ถ๋ฆฌํ์ฌ ์ ๋ฌํ๋ค.
5 between: 1 and: 10
- ๋จํญ ๋ฉ์์ง
- ์ดํญ ๋ฉ์์ง
- ํค์๋ ๋ฉ์์ง
๊ฐ์ ์์์ ๋ฉ์์ง๋ ๋ฌด์กฐ๊ฑด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์คํ๋๋ค.
3 factorial + 1 max: 10
"-> 3 factorial + 1 max: 10"
"-> 6 + 1 max: 10"
"-> 7 max: 10"
"-> 10"
์ฃผ์! ๋ฉ์์ง ์ฒ๋ฆฌ ์ฐ์ ์์์ ์์ธ๋ ์๋ค!
์ฐ์ ์ฐ์ฐ(+ - * /)์ ์ฐ์ ์์๋ ์ ์ฉ๋์ง ์๋๋ค. ์ด๋ค์ ๋ชจ๋ ๊ฐ์ ์ดํญ์ฐ์ฐ์๋ก ์ทจ๊ธ๋๋ฏ๋ก, ์์ ์์์ ๊ณฑ์
์ด๋ ๋๋์
์ด ๋จผ์ ์ ์ฉ๋์ด์ผ ํ๋ค๋ฉด ๋ฐ๋์ ๊ดํธ( )๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ฌธ์์ด์ด๋ ๋ฐฐ์ด ๋ฑ, ๋ฌธ๋ฒ ํญ๋ชฉ์์ ์ค๋ช ํ ๊ฒ๋ค์ ์๋ต.
- ์ ์
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์์๋ ๋ฌธ๋ฒ์ด ์๋ ๊ฐ์ฒด๊ฐ์ ๋ฉ์ธ์ง ํํ๋ก ์ฒ๋ฆฌํ๋ค.
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: ... ์์ผ๋ก ๋ฉ์ธ์ง ์ ๋ฌ"
์ ์ํ ๊ฐ์ฒด์ timesRepeat: ๋ฉ์ธ์ง๋ฅผ ๋์ง๋ฉด, ์ธ์๋ก ๋๊ธด ๋ธ๋ก์ ๋ฐ๋ณตํด์ ์ํํ๋ค.
sum := 0.
10 timesRepeat: [ sum := sum + 1 ].
๋ฐฐ์ด ๋ฑ์ ์ปฌ๋ ์ ๋ด์ฉ์ ์์ฐจ์ ์ผ๋ก ๊บผ๋ด์ค๋ฉด์ ๋ฐ๋ณตํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ.
์ปฌ๋ ์ ๊ฐ์ฒด์ do: ๋ฉ์ธ์ง๋ฅผ ๋์ง๋ค. ๋ฐ๋ณต ๋ด์ฉ์ ์ํํ ๋ธ๋ก์์๋ ์ธ์ ๋ณ์๋ฅผ ์ ์ธํด์ ์ปฌ๋ ์ ์ ๋ด์ฉ์ ๋ฐ์ ์ฌ ์๋ ์๋ค.
(1 to: 10) do: [ :each | Transcript showln: each ].
[์กฐ๊ฑด ๋ธ๋ก] whileTrue: [ ๋ด์ฉ ]. "์กฐ๊ฑด์ด ์ฐธ์ธ ๋์ ๋ฐ๋ณต."
[์กฐ๊ฑด ๋ธ๋ก] whileFalse: [ ๋ด์ฉ ]. "์กฐ๊ฑด์ด ๊ฑฐ์ง์ธ ๋์ ๋ฐ๋ณต."
sum := 0.
[ sum < 100 ] whileTrue: [ sum := sum + 1 ].
Transcript clear; show: sum.
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.' ]
Booleanํ ๊ฐ์ฒด์ not ๋ฉ์ธ์ง๋ฅผ ๋์ง๋ฉด ๋ ผ๋ฆฌ๋ถ์ ์ฐ์ฐ์ ์ํ.
true not. "false"
false not. "true"
Booleanํ ๊ฐ์ฒด 2๊ฐ๋ฅผ ๋น๊ตํ๋๋ฐ ์์ด์, ์์ชฝ ๋ชจ๋๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ๋ง true๊ฐ ๋จ.
true xor: true. "false"
false xor: true. "true"
false xor: false. "false"
false xor: true. "true"