SqueakByExample:2.6

From 흡혈양파의 번역工房
Revision as of 04:35, 30 August 2012 by Onionmixer (talk | contribs)
Jump to navigation Jump to search

클래스 SBEGame을 정의하기

자 이제, SBEGame이라 부를 게임을 위해 우리가 필요한 다른 클래스를 만들겠습니다.


Squeak comment.png메인 창의 브라우저에서 보이는 클래스 정의 템플릿(the class definition template)를 만듭니다.


이미 선택한 클래스 카테고리의 이름을 두 번 클릭하거나 SBECell을 정의를 다시 표시함으로써(instance 버튼을 클릭하여)이 작업을 수행합니다. 다음과 같이 읽을 수 있도록 코드를 편집하고 accept 합니다.


클래스 2.3: SBEGame 클래스 정의하기

BorderedMorph subclass: #SBEGame                                                                            
instanceVariableNames: ''                                                                                      
classVariableNames: ''                                                                                        
poolDictionaries: ''                                                                                           
category: 'SBE--Quinto'


여기에 우리는 BoderedMorph를 하위분류하였습니다; 모프(Morph)는 스퀵에서 모든 그래픽 문양의 수퍼클래스 이며 그리고 BorderedMorph는 경계를 가진 모프(Morph)입니다. 우리는 또한 인스턴스 변수의 이름을 두 번째 라인의 따옴표 사이에 삽입할 것이지만, 지금은 그 목록을 빈 목록으로 남겨 놓겠습니다.

자 이제 SBEGame을 위해 초기화 메소드(initialize method)를 정의합시다.


Squeak comment.png다음 내용을 SBEGame을 위한 메소드로서 브라우저에 타이핑하고, accept 를 실행합니다.


메소드 2.4: 게임 초기화하기

initialize
 | sampleCell width height n |
 super initialize.
 n := self cellsPerSide.
 sampleCell := SBECell new.
 width := sampleCell width.
 height := sampleCell height.
 self bounds: (5@5 extent: ((width*n) @(height*n)) + (2 * self borderWidth)).
 cells := Matrix new: n tabulate: [ :i :j | self newCellAt: i at: j ].


스퀵은 용어들 중 몇 가지의 의미를 모른다고 불평할 것입니다. 스퀵은 여러분에게 메시지 CellsPerSide를 모른다고 말할 것이며, 여러 수정을 가한 용어들을 제시할 것입니다. 그러할 경우, 여러분의 스펠링 실수가 있었던 것입니다.


UnknownSelector.png DeclareInstanceVar.png
그림 2.8 알려지지 않은 selector를 감지한 스퀵 그림 2.9: 새로운 인스턴스 변수 공표하기


그러나 cellsPerSide는 실수가 아닙니다- 이것은 단지 우리가 아직 정의하지 않은 메소드이므로, 우리는 이 작업을 1-2분내에 수행할 것입니다.


Squeak comment.png그러므로 단지 메뉴에서 우리가 정말로 의미했던 cellsPerside인 첫 번째 아이템을 선택합니다.


그 다음ㅡ 스퀵은 셀의 의미를 모른다고 불평할 것입니다. 스퀵은 이 오류를 수정하는 여러 개의 방법을 여러분에게 제공합니다.


Squeak comment.pngdeclare instance를 선택합니다. 그 이유는 우리는 셀이 인스턴스 변수(instance variable)가 되기를 원하기 때문입니다.


마지막으로, 스퀵은 우리가 마지막에 보낸 메시지 newCellAt:at에 관해 불평할 것이지만, 이것은 실수가 아니므로, 그 메시지 또한 확인(confirm) 합니다.

만약 여러분이 클래스 정의(the class definition)을 다시 한번 보았다면(instance버튼을 누름으로서 할 수 있는), 인스턴스 변수 셀을(the instance variable cells)를 포함하기 위해 브라우저가 그 정의를 수정했다는 것을 알게 될 것입니다.

이 초기화 메소드(initialize method)를 보겠습니다. 이 라인 | sampleCell width height n | 은 4개의 임시 변수(temporary variables)를 공표합니다. 그 변수들은 임시 변수로 불리며, 그 이유는, 그 변수들의 범위(scope)와 수명(life time)이 이 초기화 메소드에 제한되어있기 때문입니다. 설명하는 이름을 가진 임시 변수는 코드를 좀더 읽기 쉽게 만드는 작업에 유익합니다. 스몰토크는 상수(constant)와 변수(variables)를 구분하기 위한 특별한 구문(syntax)을 갖고 있지 않으며, 사실 이 4개의 “변수”는 실제로 상수입니다. 4-7라인은 이 상수들을 정의합니다.

우리의 게임 보드는 얼마나 커야 할까요? 몇몇 진정수(眞整數,integral number)만큼의 셀을 담기에 충분히 크고, 그 셀 주위에 경계를 그리기에 충분한 커야 합니다. 얼마나 많은 셀이 적합한 숫자의 셀일까요? 5? 10? 100? 우리는 아직 그것을 모르며 만약 그것을 알았다면, 나중에 우리의 마음을 아마도 바꾸었을 것입니다. 그러므로, 그 수를 알기 위한 책임을 우리가 cellsPerSide라고 부를 다른 메소드에 위임하였으며, 우리는 1-2분내에 그 메소드를 작성할 것입니다. 그 이유는 우리가 초기화(initialize)를 위해 메소드 바디(the method body)를 수락할 때, 스퀵은 우리에게 "확인(confirm), 수정(correct) 또는 취소(cancel)"할 것을 질문한 이름으로 우리가 메소드를 정의하기 전에, 우리는 cellsPerSide 메시지를 보내고 있기 때문입니다. 이 작업을 망설이지 마십시오. 이 작업은 우리가 아직 정의하지 않은 다른 메소드에 관해서 작성해야 할 좋은 실행법입니다. 왜 그럴까요? 글쎄요, 이 실행법은 우리가 초기화 메소드 작성이 필요하다는 것을 인식하고, 작성을 시작할 때까지 좋은 실행법이 아니었고, 그 시점에서, 우리는 의미있는 이름을 그 실행법에 부여한 후 우리의 작업흐름을 방해하지 않고, 계속 작업을 진행하였기 때문입니다.

4 번째의 라인은 이 메소드를 사용합니다. 스몰토크 self cellsPerSide는 메시지 cellsPerSider를 이 그 자신에게 보냅니다. 예를 들어, 바로 그 오브젝트에 보냅니다(i.e., to this very object). 이에 대한 반응은, 게임 보드의 측면당 셀의 숫자가 되며, n에 할당됩니다.

다음의 3개의 라인은, 새로운 SBCcell 오브젝트를 만들고, 그것의 너비와 높이를 적합한 임시 변수에 할당합니다.

8번째의 라인은 새로운 오브젝트의 bounds를 설정합니다. 지금까지의 세부적인 내용에 대한 염려 없이, 괄호안의 표현식은 점 (5,5)에서 사각형의 원점(예를 들어 상단 왼쪽 모서리)으로 사각형을 만들고, 하단 우측 모서리는 셀의 오른쪽 숫자만큼의 공간을 허용하기 위해 충분히 떨어져 있을 것이라는 우리의 설명을 믿어주십시오.

마지막 라인은 SBEGame 오브젝트의 인스턴스 변수 셀을 행과 열의 알맞은 숫자로, 매트릭스를(matrix) 만듭니다. 우리는 이 작업을 메시지 new:tabulate를 매트릭스 클래스(오브젝트이기도 한 클래스이므로, 우리는 그 클래스에 오브젝트를 보낼 수 있습니다)에 보냄으로써 수행합니다. 우리는 new:tabulate가 두개의 인수를 취한다는 것을 알고 있으며, 그 이유는 그것이 두 개의 콜론(:)을 그 이름에 갖고 있기 때문입니다. 인수는 콜론 바로 뒤에 옵니다. 만약 여러분이 인수를 모두 괄호 안에 넣는 언어를 사용해 왔었다면, 이 표기법이 매우 이상하게 느껴질 것입니다. 당황해 하지 마십시오, 이것은 단지 구문(syntax)일 뿐입니다. 이 구문은, 메소드의 이름이 인수의 역할을 설명하기 위해 사용되었으므로, 매우 좋은 구문인 것으로 밝혀졌습니다. 예를 들면, Matrix rows: 5 columns: 2 는 5개의 가로열과 2개의 새로열을 갖는 것이지 2개의 가로열과 5개의 세로행을 가진 것이 아닙니다.

Matrix n tabulate: [ :i :j | self newCellAt: i at: j ] 은 새로운 n x n 매트릭스를 만들고 그 매트릭스의 구성요소를 초기화합니다. 각 구성요소의 초기 값은 그 구성요소의 좌표(coordinates)에 기초합니다. (i,j) 구성요소는 자체 newCellAt: i at: j. 평가의 결과로 초기화 됩니다.

그것이 initialize(초기화) 입니다. 여러분이 이 메시지 바디를 수락하면, 아마도 포맷 작업을 아름답게 꾸밀 수 있는 기회를 갖기를 원하실 것입니다. 직접 그렇게 할 필요는 없으며, 노랑-버튼 메뉴에서, more▷prettyprint를 선택하면, 브라우저가 여러분을 위해 그 작업을 실행할 것입니다. 여러분이 pretty-printed 메소드를 갖은 후에, 다시 accept 하거나 또는 결과가 맘에 들지 않으면, 물론 취소를 할 수 있습니다. (CMD-l 숫자 1이 아닌 L의 소문자) 대안적으로, 여러분은 예쁜 프린터(the pretty-printer)를 자동으로 사용하기 위해, 브라우저가 코드를 보여줄 때마다 그 브라우저를 설정할 수 있습니다: 뷰를 조정하기 위해 버튼 바 에서 오른쪽 마우스 버튼을 사용할 수 있습니다.

만약 여러분이 more...를 좀더 많이 사용한다는 것을 인식하셨다면 more...를 직접 불러오기 위해 마우스 버튼을 클릭할 때 SHIFT키를 누르고 있을 수 있습니다.

Notes