Scala에서의 리스트

Scala 2009. 8. 22. 17:52

Scala 는 기본적으로 Lisp과 유사하게 head - tail 스타일의 LinkedList 를 사용한다. 그런데 Scala의 immutable주의와 리스트가 혼합되면서 약간 특이한 구조가 되었다.

일반적으로 대부분의 언어에서는 리스트와 유사한 자료구조는 뒤에 데이터를 넣는 것이 효율적이다 (C++의 vector , java의 ArrayList , python 의 리스트 등). 그리고 다른 자료구조 (C++ 의 deque 등)도 뒤에 넣는 것이 앞에 넣는 것에 비해 특별히 비효율적이지는 않기 때문에 대부분 아무생각없이 뒤에 넣는 방식을 쓴다. 그리고 뒤에 넣으면 나중에 넣은게 뒤에 있게 되므로 좀 더 자연스럽다.

그런데 Scala의 기본 List 는 정반대이다. List 를 immutable 로 만들기 위해 리스트에 데이터를 넣을 때 원래의 리스트를 수정하지 않기로 결정했고, 그래서 새로 만든 노드를 원래 리스트의 앞에 붙인다. (head - tail 구조인 리스트에서 원래의 리스트를 수정하지 않고 뒤에 자료를 추가하는 방법은 없다.)

그래서 리스트를 붙이는 연산자인::는 약간 특이하게 동작하는데 오른쪽 매개변수에 대해 메소드를 호출하는 식으로 동작한다. 즉

        "abc" :: Nil

위의 코드는 실제로는 아래처럼 동작하고, 새로 만든 노드를 리턴한다.

        Nil.::("abc")

이해는 하겠는데 뭔가 사파스럽다.

Posted by lispholic
,