원문: Scala Collections API - An Overview of the Collections API
Traversable (Scala 3에서는 지원하지 않습니다)
mutable.ResizableArray (2.13에서 제거되었습니다)
(String, Array - 2.13에서는 ArraySeq)
mutable.MutableList (2.13에서 제거되었습니다)
(immutable.EmptySet, immutable.Set1, ..., immutable.Set4)
(immutable.EmptyMap, immutable.Map1, ..., immutable.Map4)
Collection hierarchy
가장 중요하게 여겨지는 컬렉션 클래스들은 위의 화면에서 확인할 수 있습니다. 이 모든 클래스에는 상당한 공통점이 있습니다. 예를 들어, 모든 종류의 컬렉션은 동일하면서 통일된 문법으로 생성될 수 있습니다. 컬렉션 클래스 이름 뒤에 해당 요소들을 나열하는 방식입니다:
Traversable(1, 2, 3)
Iterable("x", "y", "z")
Map("x" -> 24, "y" -> 25, "z" -> 26)
Set(Color.red, Color.green, Color.blue)
SortedSet("hello", "world")
Buffer(x, y, z)
IndexedSeq(1.0, 2.0)
LinearSeq(a, b, c)
이 원칙은 특정 컬렉션 구현에도 적용됩니다. 예를 들어:
List(1, 2, 3)
HashMap("x" -> 24, "y" -> 25, "z" -> 26)
모든 컬렉션은 toString을 통해 위와 같이 출력됩니다.
모든 컬렉션은 Traversable이 제공하는 API를 지원하지만, 적절한 경우 타입을 특화합니다. 예를 들어, Traversable 클래스의 map 메서드는 다른 Traversable을 결과로 반환합니다. 하지만 이 결과 타입은 하위 클래스에서 재정의됩니다. 예를 들어, List에서 map을 호출하면 다시 List가 반환되며, Set에서 호출하면 다시 Set이 반환되는 식입니다.
scala> List(1, 2, 3) map (_ + 1)
res0: List[Int] = List(2, 3, 4)
scala> Set(1, 2, 3) map (_ * 2)
res0: Set[Int] = Set(2, 4, 6)
이러한 동작은 컬렉션 라이브러리 전체에 구현되어 있으며, 이를 일관된 반환 타입 원칙(uniform return type principle)이라고 합니다.
컬렉션 계층 구조에 있는 대부분의 클래스는 세 가지 변형으로 존재합니다: 루트, 변경 가능(mutable), 변경 불가능(immutable). 이의 유일한 예외는 Buffer 트레이트로 오직 변경 가능한 컬렉션으로만 제공됩니다.
다음으로, 이 클래스들을 하나씩 살펴보겠습니다.