iterator, 반복자

Twitter icon류광, 2005-08-29 00:08

iterator를 반복자로 번역한 것에 대해 의문을 표시한 독자분이 있었습니다.

돌이켜보면 제 번역서에서 반복자를 처음 사용한 것은 1999년 정보문화사에서 나온 Waite Group의 C++ How-To였던 것 같습니다. 그 때 반복자라는 용어를 제가 직접 생각해 냈는지(최초는 아니겠지만) 아닌지는 기억이 나지 않습니다. 그 책을 번역하기 전에 제가 읽은 유일한 한글 C++ 책은 1995년도에 인포북에서 나온 양진석 저(역?) "C++ 프로그래밍"이었는데 거기에는 반복자라는 용어가 없었구요.

어쨌든, iterator의 번역어로 무엇을 택할 것인가에 대해 고민했던 기억은 없었습니다. '당연히 반복자다'하는 느낌이었던 것 같습니다.이후 여러 번역서와 문헌들에서 반복자라는 용어를 접하면서, 제 모든 번역서에서 iterator는 반복자가 되었습니다.

앞에서 언급한 독자분은 iterator가 과연 반복이라는 것과 관련이 있는가 하는 문제를 제기하셨습니다. 그런데 사실 iterator의 어근(?)인 iterate에는 '반복하다', '되풀이하다'라는 뜻이 있을 뿐입니다. 거기에, constructor-생성자의 예처럼 '~or'를 '~자'로 번역해서 반복자가 된 것입니다.

앞의 독자분이 제기한 것은 아마도 C++의(그리고 사실 자료구조 전반에서의) iterator가 뜻하는 바를 과연 '반복자'라는 용어가 온전히 담고 있는가의 문제일 것입니다.

전산학에서 말하는 iteration을 단순한 되풀이(repetition)과 굳이 구분하자면, "매개변수화된 반복", 즉 매번 뭔가 다른 부분이 있는 반복이라고 할 수 있습니다. 예를 들어 다음은

for(int i = 0; i

같은 일을 10번 반복한다는 점에서 단순한 되풀이에 해당하지만, 다음은

SomeIter it = ....;
for(;it != somecont.end(); ++it)
    std::cout 

매번 출력하는 글자가 다를 수 있다는 점에서 it에 의해 매개변수화된 반복이라고 할 수 있습니다.

이러한 반복에서 중요한 수단으로 쓰이는 것이 바로 반복자입니다. 물론 반복자 자체에 반복 메커니즘이 있는 것은 아니라는 반박도 유효합니다. 사실 반복자는 "요소 접근을 일반화하는 수단"이라고 설명하는 것이 가장 정확할 것입니다. 다만 그러한 일반화의 주된 목적이 반복이라는 점이 중요하겠고요. (그 외에는 전달, 저장이 있겠습니다.)

지금까지 말한 것들이 반복자라는 용어 자체에 온전히 담겨 있지는 않습니다. 그러나 이런 문제는 iterator 자체에도 적용이 됩니다. 어쩌면 데이터베이스에서 쓰이는 "커서(cursor)"가 더 적합할지도 모르겠습니다. 사실 예전의 객체지향은 잘못된 번역인가 에서도 이런 관점의 논의가 있었습니다. 이 부분에 대해서는 "함흥차사"가 좋은 예가 될 것입니다. :)

제가 반복자라는 용어에 완전히 만족하는 것은 물론 아닙니다. 예전의 객체지향 논의에서 변별력, 합의 같은 이야기를 했었는데, 만일 그런 것에 자유로울 수 있다면 반복자 대신 "훑개"라는 용어를 사용하고 싶습니다.

훑개가 마음에 드는 이유는 두 가지인데, 첫째는 반복자가 쓰이는 어떤 작동을 이야기할 때 "훑다"라는 동사가 요긴하다는 점입니다. 예를 들면 "요소들을 차례로 훑으면서..." 등. 또 한가지는 '~or'를 '~자'로 두는 것(예를 들면 constructor/생성자 등)에서 벗어나고 싶다는 점입니다. 어떤 도구의 이름을 만들 때 ~자(아들 자)를 붙여서 말을 만드는 방식이 어디서 비롯된 것인지는 잘 모르겠는데, 아마도 일제 강점기부터가 아닐까 싶습니다. 어쨌든, '훑다'라는 순우리말 동사에 '지우개', '깔개' 등 이미 많이 쓰이는 '~개'를 붙여서 만든 '훑개'는 iterator의 의미를 '반복자'보다 더 잘 반영하며(적어도 일부 측면은) 게다가 구성요소와 조어법 모두 순 우리말이라는 점에서 마음에 듭니다.

p.s. 쓸 때는 몰랐는데 쓰고 보니 꽤 기네요... 긴 글 읽어 주셔서 고맙습니다. 그리고 예제 코드가 엉망이었습니다... 뭐 의사코드 차원으로 만든 것이긴 하지만, 그래도 완전히 말도 안 되는 부분은 고쳤습니다.

태그: 번역 프로그래밍 C++
comments powered by Disqus

예전 댓글(읽기 전용)