컬렉션
시퀀스
순서대로 나열한 데이터를 다루는 시퀀스(sequence)로, 자바에서는 java.util.List
를 주로 씁니다. 스칼라에서는, scala.collection.immutable.List
를 쓰며, 임의 위치 접근이 빈번한 경우에는 scala.collection.immutable.Vector
를 쓰기도 합니다. 스칼라의 List
와 Vector
는 기본으로 임포트 되기 때문에, 별도로 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에 추가된 Stream
에 map
을 비롯한 유용한 메서드를 써서 추리고 변환하다가 결국 리스트로 만들어 쓰기도 합니다.
스칼라
val squared = List(1, 2, 3).map(x => x * x) // => List(1, 4, 9)
스칼라는, 별도로 Stream을 만들어 낼 필요 없이, 컬렉션마다 직접 map
같은 메서드를 바로 호출해서 씁니다. 만약, 자바의 Stream
처럼 지연 평가가 필요하다면, LazyList
를 씁니다.