SmalltalkBestPracticePatterns:5.1
- 5.1 컬렉션(collections)
컬렉션 계층구조는 스몰토크의 위대한 강점들 중 하나이다. 다른 언어에서는 여러 번 지루하게 반복해서 써야 하는 코드가 스몰토크에서는 하나의 단어로 가능하다. 그렇지만 컬렉션은 동일한 프로토콜에 대부분 반응하기 때문에 그 결과는 더 유연하며, "OrderedCollection" 대신 "Set"로 대체함으로써 선형 리스트를 해시 테이블(hash table)로 변환할 수 있다.
단점은 컬렉션 클래스로 인해 스몰토크를 숙달하기까지 더 많은 내용을 학습해야 한다는 점이다. 좋은 소식은 프로토콜의 어떤 조각도 복잡하거나 배우기가 어렵지 않고, 더 간단하고 빠르며 유지가 쉬운 동시에 유연한 코드를 생산해낸다는 점이다.
단, 컬렉션 클래스가 많다는 가장 큰 단점이 있다. 초보 프로그래머들은 자신들이 이용할 수 있는 클래스와 메시지를 극히 일부만 학습하고, 그 외에 필요로 하는 기능은 절차적 프로그래밍에서 남은 기술들에 의존하는 것이 보통이다. 그 결과, 코드는 필요량보다 훨씬 커지고, 숙련된 스몰토커들이 읽기가 힘든, 오류가 발생하기 쉬운 코드를 생산하게 된다.
예를 들어, 초보자 스몰토크의 코드에선 반복에 대해 직접 코딩한 루프(hand coded loops)를 발견하기가 쉽다. 아래 코드는:
| index |
index := 1.
[index <= aCollection size] whileTrue:
[...aCollection at: index...
index := index + 1]
아래에 비해 작성하기도 힘들고 읽기도 까다로울 뿐 아니라 유연성도 떨어진다:
aCollection do: [:each | ...each...]
첫 번째 코드는 인덱스된(indexed) 컬렉션을 이용할 때만 작동하지만 두 번째는 Sets와 Dictionaries에서도 작동할 것이다.
코드를 검토하면서 필자는 컬렉션 프로토콜을 전력으로 이용하여 4개~6개 행으로 이루어진 표현식을 하나의 행으로 변형할 수 있는 기회를 발견하곤 한다.
컬렉션에 관한 본 책의 논의는 세 가지 부분으로 나뉜다:
- 클래스 – 컬렉션을 사용하고 싶다면 가장 먼저 결정해야 할 것은 “어떤 것”을 정하는 일이다. 해당 절은 각 주요 컬렉션 클래스가 해결하는 문제를 설명한다.
- 프로토콜 – 다른 언어들로부터 이행되던 프로그래밍 습관들이 컬렉션을 이용 시에는 효과를 감소시킬 수 있다. 해당 절은 당신이 컬렉션으로 전송할 수 있는 주요 메시지와 각 컬렉션이 어떠한 문제를 해결하는지를 설명한다.
- 관용구(Idiom) - 컬렉션은 너무나 강력하기 때문에 숙련된 스몰토커들이 활용하는 몇 가지 표준 기법 집합이 있다. 이러한 관용구 중 하나를 사용하는 코드를 읽고 있다면 처음엔 깜짝 놀랄 것이다. 해당 절은 컬렉션을 특이한 방식으로 사용하여 해결할 수 있는 문제를 소개한다.