ComputerProgrammingwithGNUSmalltalk:3.9

From 흡혈양파의 번역工房
Jump to navigation Jump to search

공통 클래스와 사용법 : 2부

이제 여러분들이 아마 사용하게 될 다른 유용한 클래스들을 소개하겠습니다. 예제에서는 변수 개념도 사용할 것입니다.


배열

여러 종류의 자료와 작업들을 처리할 때, 그룹화 할 필요가 있습니다. 보통, 우리가 그룹화한 데이터들은 특정 방식으로 연결되어 있습니다. 장보기 목록이나 우리가 좋아하는 영화, 읽었던 책 등 처럼 말입니다.. 따라서 다른 객체의 집합을 갖고 있을 수 있는 객체가 필요합니다. Array, Set, Dictionary 클래스는 다른 방법으로 여러 객체를 한꺼번에 다루는 객체들입니다.


먼저 Array 클래스를 보겠습니다. 이 클래스는 지정한 수 만큼의 객체들을 순서대로 갖고 있을 수 있습니다.


new:

new: 메시지를 Array 클래스에 전달하여 새 Array 객체를 만들 수 있습니다. 얼마나 많은 객체를 배열에 둘 것인지 정해야만 합니다. 코드는 다음과 같습니다.

| anArray |

anArray := Array new: 10
(nil nil nil nil nil nil nil nil nil nil )


위의 내용을 각각의 행으로 입력하거나, 파일에 소스코드를 입력한 후 GST 인터프리터에 전달하는 것으로 프로그램을 실행할 수 있습니다만 앞으로 작성할 내용을 위해, 각각의 행으로 입력하여주십시오.


각각의 행을 입력하였다면, 이제 anArray 변수가 다른 열 개의 객체를 담을 수 있는 Array 객체를 참조할 것입니다. 현재의 Array 객체의 상태를 위에서 볼 수 있을 것입니다. 먼저 Array 객체의 모든 객체는 아무것도 나타내지 않는 특수한 객체 nil 로 초기화 하였습니다.


at:

어떤 한 위치의 객체를 알아보기 위해 at: 메시지를 사용할 수 있습니다. 입력한 프로그램 내용을 유지한 상태에서, 아래와 같이 명령을 입력하여 주십시오.

anArray at: 1
nil


물론 현재 배열의 첫 번째 객체는 nil 입니다. 여기서 배열의 위치로 전달한 값1 은 인덱스(indexes)라고 부릅니다. 스몰토크의 인덱스는 1로 시작합니다.


프로그래밍 유경험자들에게:
C 기반의 언어들과 대조적으로, 스몰토크에서는 인덱스가 0이 아닌 1로 시작합니다.


at:put:

배열의 특정 위치에 객체를 두기 위해 at:put: 메시지를 사용합니다.

anArray at: 1 put: 'Toothbrush'
'Toothbrush'


인터렉티브 모드에서 객체의 이름을 입력하는 것만으로 배열 객체의 값을 확인할 수 있습니다.

anArray
('Toothbrush' nil nil nil nil nil nil nil nil nil )


이제 보시다시피 첫번째 객체는 String 클래스의 인스턴스 ‘Toothbrush’ 입니다. 이제 soap를 배열에 입력해보겠습니다.

anArray at: 2 put: 'Soap'
'Soap'


anArray
('Toothbrush' 'Soap' nil nil nil nil nil nil nil nil )


includes:

특정 객체를 배열이 갖고 있는지 includes: 메시지를 전달하여 확인할 수 있습니다.

anArray includes: 'Soap'
true


anArray includes: 'Toothpaste'
false


reverse

Array 객체가 순서를 갖는 집합이라고 말한 것을 기억하십시오. 이 순서를 다루는 방법이 있습니다. 그 중 그 순서를 반대로 만드는 것이 reverse 메시지입니다.

anArray reverse
(nil nil nil nil nil nil nil nil 'Soap' 'Toothbrush' )


Set

Set은 Array와 비슷하지만, 순서없이 객체를 담아둔다는 점과 갯수의 한계를 미리 정의하지 않는다는 점이 다릅니다. GNU 스몰토크에서의 Set은 수학에서 말하는 집합과 비슷한 것입니다. 따라서 수학에서의 집합과 같이 생각하시면 됩니다.


new

new 메시지로 Set 클래스의 인스턴스를 생성할 수 있습니다. 그러니 이 경우 메시지에 다른 인자가 필요없습니다.

| aSet |

aSet := Set new
Set ()


초기화 한 것을 우리에게 보여주지만 어떤 객체도 포함하지 않았다는 것을 보여줍니다.


add:

Set에 add: 메시지를 이용하여 객체를 추가할 수 있습니다.

aSet add: 'Toothbrush'
'Toothbrush'


aSet
Set ('Toothbrush' )


이제 우리는 'Toothbrush' 라는 값을 갖는 string 객체를 넣어두었습니다. 이제 다른 String 객체를 추가해봅시다.

aSet add: 'Soap'
'Soap'


aSet
Set ('Soap' 'Toothbrush' )


GST가 'Toothbrush' 앞에 객체를 둔 것을 확인할 수 있을 것입니다. 실제로는 이전 객체의 앞에 둔 것이 아니라, 그냥 임의로 집어넣은 것입니다. 'Soap' 와 'Toothbrush' 의 객체 위치는 예측하지 못하며, 다른 말로 Set 안에선 확실한 위치를 알 수 없다는 것입니다.


질문:
왜 Set 클래스가 reverse 메시지를 갖고 있지 않은지 설명할 수 있습니까?


아마도 다음 예제를 보면 이해하기 쉬울 것입니다.

aSet add: 'Toothpaste'
'Toothpaste'


aSet
Set ('Soap' 'Toothpaste' 'Toothbrush' )


이제 우리가 추가한 마지막 객체가 두 객체 사이에 있습니다. 하지만, 또한 이것도 역시 실제로는 순서가 없습니다.


Set 객체 안에서는 순서를 알 수 없다는 것이 흥미로운 점입니다. 두 번 이상 같은 객체를 Set 객체에 집어넣으려 해도, 같은 객체는 들어가지 않습니다.

aSet add: 'Toothbrush'
'Toothbrush'


aSet
Set ('Soap' 'Toothpaste' 'Toothbrush' )


GST에게는 객체가 Set 안에 있는지 없는지가 중요합니다. 앞으로 차차 보시게 되겠지만, 이것은 수학의 집합과 매우 흡사한 점입니다.


remove:

Set에 remove: 메시지를 보내어 지정한 객체를 제거할 수 있습니다.

aSet remove: 'Toothpaste'
'Toothpaste'


remove: 메시지가 Set 객체를 반환하지 않고 삭제한 객체를 보여준다는 것을 주의하십시오.

aSet
Set ('Soap' 'Toothbrush' )


보신 것처럼, Set의 항은 인덱스가 없기 때문에, 인덱스가 아닌 항을 가지고서 제거합니다.


집합에서 각 항을 제거하였다고 하여서, 그것이 시스템에서 객체가 삭제되는 것을 의미하지는 않습니다. 다음의 예를 보십시오.

| anElement | 

anElement := 'Perfume'
'Perfume'


별도의 변수에 String 객체를 지정하였습니다. 이제 집합에 추가하도록 하겠습니다.

aSet add: anElement
'Perfume'


aSet
Set ('Soap' 'Toothbrush' 'Perfume' )


이제 제거해보겠습니다.

aSet remove: anElement
'Perfume'


aSet
Set ('Soap' 'Toothbrush' )


이제 Set으로부터 항목을 제거하였습니다. 아직 변수가 살아있는지 확인해보겠습니다.

anElement
'Perfume'


보다시피 여전히 잘 존재합니다. 우리가 Set 에 보낸 메시지 remove: 메시지는 String 객체와 이를 가리키는 변수에 영향을 미치지 않았습니다.


Dictionary

이제 보여드릴 마지막 클래스는 Dictionary라고 합니다. Dictionary는 Array와 Set과 같이 여러 개의 객체를 묶는 기능을 제공하고 있습니다.


Dictionary는 각 데이터를 관련된 인덱스 키와 연결하여 자료를 유지한다는 것이 Array와 같습니다. 그러나 Dictionary의 키는 정수가 아니어도 된다는 점이 다릅니다. 자료에 대한 키로서 어떠한 객체도 정의할 수 있습니다.


Dictionary는 Set과 같이 순서가 없다는 것, 그리고 객체의 갯수를 제한하지 않는다는 점이 같습니다.


new

Set과 같이 new 메시지를 사용할 수 있습니다.

| aDictionary |

aDictionary := Dictionary new
Dictionary (
)


초기에 Dictionary 객체가 아무 객체도 포함하지 않았다는 것을 볼 수 있습니다.


at:put:

at:put: 메시지를 사용하여 사전에 객체를 추가할 수 있습니다.

aDictionary at: 'Canol' put: 'Gokel'
'Gokel'


aDictionary
Dictionary (
   'Canol'->'Gokel'
)


이제 사전은 Canol로 이름붙인 문자열과 연결된 Gokel이라는 문자열을 갖고 있습니다. 이제 다른 String 객체를 추가해봅시다.

aDictionary at: 'Paolo' put: 'Bonzini'
'Bonzini'


aDictionary
Dictionary (
   'Canol'->'Gokel'
   'Paolo'->'Bonzini'
)


keys

keys 메시지로 Dictionary 안의 모든 키를 얻을 수 있습니다. GST는 포함하고 있는 모든 키를 Set 객체로 반환할 것입니다.

aDictionary keys
Set ('Canol' 'Paolo' )


removeKey:

Dictionary로부터 항목을 제거하기 위해 removeKey: 메시지를 사용할 수 있습니다.

aDictionary removeKey: 'Canol'
'Gokel'


aDictionary
Dictionary (
   'Paolo'->'Bonzini'
)


removeKey: 메시지는 Set의 remove: 메시지와 같이 제거한 객체를 반환합니다.