Smalltalk에서의 Collection

http://trans.onionmixer.net/mediawiki/index.php?title=SqueakByExample:3.6

이 내용을 보면 Collection에 대한 부분이 나오게 됩니다.
사실 중요한건 Collection이 아니라 collection이 가지고 있는 성질에 대한 부분인데요..
번역문에 내용을 추가할까 하다가.. 이건 아니다싶어 따로 blog에 정리를 하도록 하겠습니다.

Smalltalk에서의 Collection이라는것은 일반적으로 STL에 많이 비교가 되더군요.
중요한건 C++에서의 STL은 “자료를 다루기위한 표준라이브러리” 라는겁니다.

C++ 표준 템플릿 라이브러리, 즉 STL은 C++프로그래밍에서 최상의 성능을 얻어내는 것,
그리고 서로 다른 자료구조와 알고리즘을 결합하기 위해 설계되었습니다.

참고URL::http://t3ddy.tistory.com/15

Smalltalk에서의 Collection을 이런 STL같은거다..라는 개념적인 비교가 아니라
여기서 주요하게 비교되는점인 Iterator에 대해 좀 더 알아보도록 하겠습니다.

사실 C++에서 STL의 장점은 Iterator(반복처리자)를 통한 데이터의 탐색 및 조작에 있습니다.

C++에서 Iterator를 통한 데이터의 처리에 대한 간단한 예를 보겠습니다.
예제출처::http://printf.egloos.com/1992692

#include 
#include 
using namespace std;

void main( )
{
    vector v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);

    vector::iterator iter;
    for(iter = v.begin() ; iter != v.end() ; iter++)
        cout < < *iter << endl;

    iter = v.begin()+2;
    cout << *iter << endl;
}

위의 예제에서 vector라는 템플릿으로 v를 선언했고 값을 넣었습니다. 그리고 생성된 v 라는 인스턴스에 값들을 집어넣게되죠.
(물론 vector는 int형으로 선언되었기때문에 v에 넣을 수 있는값은 int입니다)
그리고 vector의 Iterator타입으로 iter라는 변수를 선언합니다.
이후 iter를 통해서 v라는 int-vector타입의 인스턴스의 데이터를 탐색합니다. 그리고 값을 출력하죠.

이렇게 Iterator는 탐색이 가능한 데이터집합의 포인터로서 사용될 수 있습니다.

굳이 비교를 하자면 php에서 database에 질의를 하고 그 결과를 변수에 받은다음 data를 seek하는데 이것도 일종의 Iterator라고 할 수 있겠죠.
(정확한 설명은 아닐 수 있겠습니다만.. 개념적으로는 맞지 않을까 합니다)

Smalltalk에서 Collection은 이러한 Iterator를 사용해서 Collection안의 데이터를 다루기 쉽게 해준다는데 있습니다.
맨위의 URL에 있는 예제를 아래에 옮겨서 보도록 하죠.

result := String new.
(1 to: 10) do: [:n | result := result, n printString, ' '].
(1 to: 10) collect: [ :each | each * each ]

이 2개의 예제를 보면 :n 그리고 :each가 Iterator인걸 알 수 있습니다.

첫번째 예제에서 do:라는 셀렉터에 [ ] 으로 묶여있는 블록식 안에서 :n은 n이라는 1 에서 10까지의 증가되고있는 현재값을 취급합니다.
1에서 10까지의 현재의 pointer가 되겠네요.

마찬가지로 두번째의 예제에서는 1에서 10까지의 증가되는값중 현재값을 :each가 받아서 데이터의 포인터로 사용하고 있습니다.

이렇게 Iterator는 현재 다루고있는 어떤타입의 배열에서도 데이터의 포인터값으로 사용될 수 있습니다.

실제로 Object Browser에서 Collections>Collection 을 보면 Collection을 상속받은
Array, FloatArray, Matrix, String, WordArray등을 찾을수가 있는데
이는 Smalltalk에서 사용되는 대부분의 배열은 Collection에서 지원하는 Iterator를 쓸 수 있다는것을 의미합니다.

한마디로 간단하게 설명되기는 애매해서 별도로 설명을 좀 길게 늘였지만
이것으로 제대로된 설명이 되는지는 모르겠습니다......-.-;