"self"의 의미는 무엇인가요?
self는 "현재의 객체"에 대한 생략이며, "현재 다루고 있는 모든 클래스"의 콘텍스트입니다. Inspector 화면을 이미 보셨다면, 이 용어를 보셨을겁니다. self는 항상 Inspector 화면 좌측 창에 있는 최초 항목입니다.
스몰토크는 식을 평가하고, 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 := Set new.
aSetOf6 := Set new.
1 to: 48 do: [ :each | aSetOfNumbers add: each].
total := aSetOfNumbers size.
[ (aSetOf6 size) = 6]
whileFalse:
[
random := Random new next.
pick := (random * 100) truncated \\ total.
computerNumber := pick + 1.
aSetOf6 add: computerNumber.
].
^aSetOf6 asArray.
다음은 게임을 개시하는 메서드를 적습니다. 작업의 하나로서, 이 start 메서드에 시뮬레이션 실행에 필요한 generateDrawing 메서드를 "호출합니다". 양쪽 메서드는 Lottery 클래스의 인스턴스 메서드입니다. start 메서드 안에서 generateDrawing을 call/부르고/참조할 필요가 있습니다. 어떻게 하면 실현할 수 있을까요? 아래의 코드는 동작하지 않습니다.
| theWinningNumbers |
theWinningNumbers := generateDrawing.
코드를 실행할 수 없습니다! 유효한 스몰토크 문법은 객체-메서드 형식이어야 합니다.
따라서, Lottery 객체를 참조하는 무언가, 즉 Lottery 클래스의 인스턴스를 참조하는 것이 필요하게 됩니다. 여기서 self가 등장합니다.
| theWinningNumbers |
theWinningNumbers := self generateDrawing.
|