The Scala 2.8 Collections API
Martin Odersky, Lex Spoon
2010년 9월 7일
많은 이들이 보기에 Scala 2.8에서 가장 중요한 변화는 바로 새로운 컬렉션 프레임워크입니다. Scala는 이미 이전에도 컬렉션을 가지고 있었습니다(사실, 새 프레임워크는 기존 컬렉션과 대부분 호환됩니다). 그러나 다양한 컬렉션 타입을 위한 공통적이고 일관적이며 포괄적인 프레임워크는 오직 2.8에서만 제공됩니다.
컬렉션에 추가된 내용은 처음 보았을때는 다소 미묘해 보이지만, 이 변화는 여러분의 프로그래밍 스타일에 깊은 영향을 미칠 수 있습니다. 실제로 마치 프로그램의 기본 구성 요소가 개별 요소가 아니라 전체 컬렉션인 것처럼 더 높은 수준에서 작업하는 느낌을 자주 받을 수 있을 것입니다. 이 새로운 프로그래밍 스타일에는 적응이 필요합니다. 다행히도, 새로운 Scala 컬렉션에 있는 여러 가지 훌륭한 특성들이 적응을 도와줄 것입니다. 컬렉션은 사용하기 쉽고, 간결하며, 안전하고, 빠르고, 범용적입니다.
사용하기 쉬움:
크지 않은 20 ~ 50개 정도의 메서드만으로 대부분의 컬렉션 문제를 몇 번의 연산으로 해결할 수 있습니다. 복잡한 반복 구조나 재귀로 인해 당신이 고민할 필요도 없습니다. 영속적인 컬렉션과 부수 효과가 없는 연산은 당신이 실수로 새로운 데이터를 사용해 기존 컬렉션을 훼손할 걱정에서 벗어나게 해줍니다. 이터레이터와 컬렉션 사이의 업데이트로 인한 간섭도 제거됩니다.
간결함:
과거에는 한두 번의 반복문이 필요했던 작업을 이제는 한 단어로 해결할 수 있습니다. 이제 가벼워진 문법으로 함수적인 연산을 표현할 수 있고 연산을 쉽게 결합할 수 있어졌으며, 이는 결과적으로 마치 사용자가 정의한 대수(algebra)처럼 느껴지게 해 줍니다.
안전함:
이 부분은 경험해 보면 더 와 닿습니다. Scala 컬렉션의 정적인 타입과 함수적인 특성은 여러분이 실수할 수 있는 대부분의 오류를 컴파일 시간에 잡을 수 있게 해줍니다. 그 이유는 (1) 컬렉션 연산 자체가 많이 사용되고 철저히 테스트되었으며, (2) 컬렉션 연산의 사용이 마치 함수의 파라미터와 결과처럼 입력과 출력을 명확히 표시해주고, (3) 이 명시적인 입력과 출력이 정적 타입 검사를 받기 때문입니다. 대부분의 잘못된 사용은 타입 오류로 나타나게 됩니다. 몇 백 줄의 프로그램이 처음부터 문제 없이 실행되는 경우도 드물지 않습니다.
빠름:
컬렉션 연산은 라이브러리에서 최적화되어 있어 매우 효율적입니다. 당신이 직접 세심하게 조정된 데이터 구조와 연산을 만들어 약간 더 나은 성능을 낼 수 있을지 모르지만, 그러한 과정에서 잘못된 구현 결정을 내리면 오히려 성능을 떨어뜨릴 수 있습니다. 게다가, 현재 컬렉션은 멀티 코어에서 병렬 실행에 맞게 적용된 상태입니다. 병렬 컬렉션은 순차 컬렉션과 동일한 연산을 지원하므로 새로운 연산을 배울 필요도 없고 코드를 다시 작성할 필요도 없습니다. 당신은 그저 par 메소드를 사용하는 것 만으로도 순차 컬렉션을 병렬 컬렉션으로 변환할 수 있습니다!
범용적임:
컬렉션은 적용하기 알맞기만 하다면 어떠한 타입에서도 동일한 연산을 제공합니다. 덕분에 비교적 적은 연산 어휘로 많은 작업을 수행할 수 있습니다. 예를 들어, 문자열은 개념적으로 문자들의 순차적인 나열(sequence)입니다. 따라서, Scala 컬렉션에서 문자열은 모든 sequence 연산을 지원합니다. 이는 배열에도 동일합니다.
예제
다음은 Scala 컬렉션이 가진 장점을 보여주는 한 줄의 코드입니다.
// partition을 통해 두 가지 그룹으로 나눌 수 있습니다
val (minors, adults) = people partition (_.age < 18)
이 코드는 전통적인 컬렉션 처리에 필요한 하나에서 세 개의 반복문보다 훨씬 간결합니다 (배열의 경우 중간 결과를 따로 저장해야 하므로 세 번의 반복이 필요합니다). 기본적인 컬렉션 문법을 배우고 나면 이 코드를 작성하는 것이 명시적인 반복문을 작성하는 것보다 훨씬 쉽고 안전하다는 것을 알게 될 것입니다. 게다가, partition 연산은 상당히 빠르며, 멀티코어에서 병렬 컬렉션으로 사용할 경우 더욱 빨라집니다(병렬 컬렉션은 현재 개발 빌드에 있으며 Scala 2.9에 포함될 예정입니다).
이 페이지에서는 사용자 관점에서 Scala 2.8의 컬렉션 클래스 API를 깊이 있게 설명합니다. 이를 통해 기본적인 클래스와 이들이 정의한 메서드를 모두 살펴볼 수 있을 것입니다.