출처 : 델마당에 2006년도에 쓴 글 ( http://www.delmadang.com/community/bbs_view.asp?bbsNo=19&indx=248389 )


SmallTalk의 문법은 다음과 같습니다. 이것만 외워 두면 됩니다.

오브젝트 메소드[: 메소드 인자] <---(A)

오로지 이거밖에 없습니다.
기존의 언어들은 Token을 예약어, 숫자, 문자, 기호 등으로 구분을 하지만
SmallTalk에서는 객체와 메소드만이 존재할 뿐입니다.
간단한 예제를 통해서 이해해 보도록 하겠습니다.

1 print
1이 출력됩니다.
1이라는 객체에 print라는 메소드가 호출되는 것입니다.

1 + 2 print
3이 출력됩니다.

1 + 2 * 3 print <---- (B)
9가 출력됩니다. 7이 아닙니다.
SmallTalk에서는 연산자의 개념이 없습니다.
당연히 연산자 우선순위 개념도 없습니다.
오로지 객체에 메소드가 호출될 뿐입니다.
+(더하기) 와 *(곱하기) 도 숫자(Integer)라는 클래스의 메소드입니다.
(B)는 다음과 같이 해석할 수 있습니다.
( (1 add: 2) mul:3 ) print
이해가 되사나요? ^^

x put: 1 print
이건 x라는 객체에 put 이라는 메소드가 호출되며, 메소드의 인자는 1 이라는 뜻입니다.
출력은 1이 됩니다.

x put: 1 + 2 print
출력은 3이 됩니다. 그런데 x는 1의 값이 들어가게 됩니다.
(B)를 이해하시면 이것도 이해가 쉬우실 겁니다.
위의 코드를 다시 작성해 보겠습니다.
( (x put: 1) add: 2 ) print

전통적인 OOP를 지원하는 컴파일러 언어에서는 클래스의 선언과 클래스의 구현 문법이 따로 나뉘어져 있습니다.
하지만 SmallTalk는 클래스의 선언조차 상기 (A)의 문법을 따릅니다.
아래는 Account라는 새로운 클래스를 선언하는 예제입니다.

Object subclass: #Account
instanceVariableNames: 'balance'

뜻은 클래스 선언인데 문법은 (A)와 똑같죠? (허걱 놀랍다!) ^^
SmallTalk는 선언부와 구현부를 따로 나누는 문법이 없습니다. (A) 문법 하나로 다 해결됩니다.
단지 여기에서 주의해야 할 점은 메소드가 객체의 메소드가 아닌 클래스의 메소드라는 것입니다.
(SmallTalk에서는 객체나 메소드는 소문자로, 클래스는 대문자로 시작하는 게 관례이며
Java에서 메소드를 소문자로 시작하는 것도 다 SmallTalk를 따라한 것임).
따라서 subclass, instanceVariableNames는 클래스 메소드라고 합니다.
(Pascal의 class..., C언어의 static...과 비슷하다고 보면 됨)

그리고, 델파이에서 VCL 클래스 구조가 있는 것처럼
SmallTalk도 Array, Set, Dictionaries 등등 기본적인 클래스들이 있습니다.

컴파일러나 인터프리터를 공부해 보신 분은 알겠지만
이러한 SmallTalk의 문법을 이용해서 엔진(Translator)를 만드는 것이
얼마나 간단한지 이해가 되실 겁니다.
문법이 워낙 간단하기 때문에 스크립트 엔진을 만들기가 쉽다는 것이지요.

이상 경문이의 SmallTalk에 대한 맛배기 설명이었습니다. ^^

ps:
위에서 설명한 내용은 SmallTalk의 이해를 돕기 위해 적은 의사코드(pseudo code)이지
실제 SmallTak의 전통적인 문법과 틀릴 수 있습니다.

인간에게 너무 익숙해져 있는 사칙연산만큼은 SmallTalk에서 예외사항을 두자는 의견도 있습니다.
따라서 SmallTalk 인터프리터마다 같은 코드에 대해 작동이 약간씩 다를 수 있습니다.