스몰토크 언어에는 다섯가지 예약어가 있습니다. self는 그 중 하나입니다. 객체는 자신에게 참조를 가능케 하는 "shortcut" 입니다. Workspace에 코드를 쓸 때, self는 전혀 필요 없습니다. 하지만 나만의 클래스 메서드를 쓰기 시작하면 self없이는 살아갈 수 없을겁니다.
self라는 용어는 단순하지만, 스몰토크에 있어서는 매우 중요합니다. 이 입문서는 self의 동작과 필요성을 설명하겠습니다.
"self"의 의미는 무엇인가요?
self는 "현재의 객체"에 대한 생략이며, "현재 다루고 있는 모든 클래스"의 콘텍스트입니다. Inspector 화면을 이미 보셨다면, 이 용어를 보셨을겁니다. self는 항상 Inspector 화면 좌측 창에 있는 최초 항목입니다.
4squared
스몰토크는 식을 평가하고, 16을 돌려줍니다. Inspect는 "16"이 SmallInteger 클래스의 인스턴스라는 것을 나타냅니다. 아래와 그림과 같은지 확인해 주십시오.
그림 S-1. "16" 이 인스팩터에 표시되었습니다. Self에 주목해 주십시오.(-그림 2-3입니다)
여기서 self는 16의 인스턴스(객체)를 참조하고 있습니다. 믿을수 없다면 다음 작업을 해주십시오. 오른쪽 창에 self -3을 입력하고, 그것을 반전시키고 <오퍼레이트 클릭>후 Print를 선택해 주십시오. 13이 표시될겁니다.
그림 S-2. 인스팩터 화면이 워크스페이스 처럼 동작합니다.
그림 S-3. Self가 "16" 을 참조하고 있는 것을 확인
메서드를 쓰기 시작했을 때 self가 중요해집니다. 복권(lottery) 시뮬레이션 프로그램을 적읍시다. Lottery 클래스를 작성하고, 48개의 숫자에서 6개의 숫자를 뽑는 시뮬레이션의 메서드를 적습니다. 아래의 메서드는 이 시뮬레이션을 실행합니다. 여섯개의 요소배열에 무작위로 추출한 6개의 숫자(1에서 48까지)를 반환합니다.
generateDrawing"Simulate a random drawing"| aSetOfNumbers aSetOf6 random pick computerNumber total |aSetOfNumbers:=Setnew.aSetOf6:=Setnew.1to:48do: [ :each|aSetOfNumbersadd:each].total:=aSetOfNumberssize.
[ (aSetOf6size) =6]
whileFalse:
[
random:=Randomnewnext.pick:= (random*100) truncated\\total.computerNumber:=pick+1.aSetOf6add:computerNumber.
].^aSetOf6asArray.
다음은 게임을 개시하는 메서드를 적습니다. 작업의 하나로서, 이 start 메서드에 시뮬레이션 실행에 필요한 generateDrawing 메서드를 "호출합니다". 양쪽 메서드는 Lottery 클래스의 인스턴스 메서드입니다. start 메서드 안에서 generateDrawing을 call/부르고/참조할 필요가 있습니다. 어떻게 하면 실현할 수 있을까요? 아래의 코드는 동작하지 않습니다.