우리는 지금까지 "builder based"로 컬렉션들을 사용해왔다. 하지만, 우리는 "view based"라는 컬렉션의 새로운 패턴을 사용할 수 있다.
우리는 collections
를 2가지 분류로 나눌 수 있다.
(1) 컬렉션이 생성될 때 값을 할당/확인하는 컬렉션 (builder-based/strict
)
(2) 필요할 때만 값들을 할당/확인하는 컬렉션(view-based/lazy
/늦은 초기화)
저번에 포스트로 정리했던 컬렉션들은 strict collection
이었다. 대표적으로, "List"나 "Set"와 같은 자료구조들이 strict collection에 속한다.
그렇다면 lazy collections에 속하는 자료구조는 무엇이 있을까? 대표적으로 Stream[A]
로, Stream을 사용한다면 원소들을 계산하지 않고 생성하거나 옮길 수 있다.
또한, Laziness는 메모리를 즉시 할당하지 않아 메모리를 부풀리지 않고도 수려하게 유한 collection을 사용할 수 있다 : Stream.continually(42)
와 같이 사용 가능하다.
단순히 메모리 측면으로만 보았을 때는 View를 사용한 Lazy collection이 훨씬 좋아보인다. 하지만, views library에는 2가지 문제점이 존재한다.
앞쪽에서 Programming in Scala
를 정리하며 map
, filter
, ++
와 같은 연산들은 기존 collection에서 새로운 collection을 리턴한다는 사실을 정리했었다. 결과적으로, 이러한 default operation들은 lazy collection이 상속 받고, laziness를 깨트리는 결과를 낳는다.
CanBuildFrom
은 view와 작동하지 않는다.새로운 operation을 위해 collection을 확장시키는 최고의 매커니즘 중 하나인 CanBuildFrom
을 view가 사용할 수 없다.
Stream은 위에서 잠깐 소개했듯, lazy collection 중 하나이다. List의 lazy 버전으로 생각하면 된다. 따라서, List의 특징과 같고, 메서드 역시 List와 대부분 공유한다고 생각하면 된다.