컬렉션

시퀀스

순서대로 나열한 데이터를 다루는 시퀀스(sequence)로, 자바에서는 java.util.List를 주로 씁니다. 스칼라에서는, scala.collection.immutable.List를 쓰며, 임의 위치 접근이 빈번한 경우에는 scala.collection.immutable.Vector를 쓰기도 합니다. 스칼라의 ListVector는 기본으로 임포트 되기 때문에, 별도로 import문을 적지 않아도 됩니다.

자바

List<String> stringList = List.of("a", "b", "c");

자바 9에 추가된 List.of 메서드로 새 리스트를 만들 수 있습니다.

스칼라

val stringList = List("a", "b", "c")
val stringVector = Vector("a", "b", "c")

스칼라에서는, 처음부터 차례로 접근하는 시퀀스의 경우, List를 쓰면 되고, 임의의 n번 째 요소에 접근할 일이 잦은 시퀀스는 Vector를 쓰면 유리합니다. 위 예제에서는, 각각 타입 추론 기능으로 List[String]Vector[String] 타입의 시퀀스를 만들었습니다.

집합 (Set)

자바

Set<String> set = Set.of("a", "b", "c");

자바 9에 추가된 Set.of 메서드로 집합을 만듭니다.

스칼라

val set = Set("a", "b", "c")

스칼라에서는 scala.collection.immutable.Set을 써서 집합을 다룹니다. List, Vector와 마찬가지로, import는 필요하지 않습니다.

맵 Map

자바

Map<String, Integer> map = Map.of(
  "a", 1,
  "b", 2,
  "c", 3
);

자바9에 추가된 Map.of 메서드로 맵을 만듭니다.

스칼라

val map = Map(
  "a" -> 1,
  "b" -> 2,
  "c" -> 3
)

스칼라에서는 scala.collection.immutable.Map으로 맵을 만듭니다. ->는 튜플(tuple)을 만드는 메서드입니다. 각각의 튜플이 키-값 한 쌍을 의미합니다.

변이(mutable) 버전 컬렉션

스칼라에서는 기본적으로 불변(immutable) 컬렉션 사용을 장려하지만, 필요에 따라 변이(mutable) 컬렉션이 경우에는, scala.collection.mutable 패키지에 있는 컬렉션을 쓰기도 합니다.

자바

String[] a = {"a", "b"};

자바에서 배열(array) 타입은, 중괄호를 써서 리터럴로 만들어 쓸 수 있습니다.

스칼라

val a = Array("a", "b")

스칼라의 Array[T] 클래스가 자바의 배열(T[])에 대응됩니다. 자바의 소통을 위해 배열 값이 필요하다면 Array를 쓰면 되겠습니다. 자바의 배열과 마찬가지로, 특정 인덱스로 접근해서, 값을 변경할 수 있습니다. 자바와의 소통(interop)을 위해 배열값을 전달해야 하거나, 자바 메서드의 결괏값으로 배열을 받아올 때도 씁니다.

컬렉션 메소드

자바 8에 추가된 스트림 관련 메서드로 컬렉션을 편하게 다룰 수 있습니다.

  • map - 각 원소를 다른 값으로 변환
  • filter - 조건에 맞는 값들을 선별
  • forEach / foreach - 모든 요소에 대해 수행
  • findFirst / find - 조건에 일치하는 첫 번째 요소 찾기

자바

var squared = List.of(1, 2, 3).stream().map(x -> x * x).collect(toList());

자바 8에 추가된 Streammap을 비롯한 유용한 메서드를 써서 추리고 변환하다가 결국 리스트로 만들어 쓰기도 합니다.

스칼라

val squared = List(1, 2, 3).map(x => x * x)  // => List(1, 4, 9)

스칼라는, 별도로 Stream을 만들어 낼 필요 없이, 컬렉션마다 직접 map같은 메서드를 바로 호출해서 씁니다. 만약, 자바의 Stream처럼 지연 평가가 필요하다면, LazyList를 씁니다.