[Scala] lazy vs strict collections

smlee·2023년 8월 21일
0

Scala

목록 보기
24/37
post-thumbnail

우리는 지금까지 "builder based"로 컬렉션들을 사용해왔다. 하지만, 우리는 "view based"라는 컬렉션의 새로운 패턴을 사용할 수 있다.

Lazy vs Strict Colletions

우리는 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)와 같이 사용 가능하다.

Views

단순히 메모리 측면으로만 보았을 때는 View를 사용한 Lazy collection이 훨씬 좋아보인다. 하지만, views library에는 2가지 문제점이 존재한다.

1. 기본 연산자 implementation이 laziness를 깨트린다.

앞쪽에서 Programming in Scala를 정리하며 map, filter, ++와 같은 연산들은 기존 collection에서 새로운 collection을 리턴한다는 사실을 정리했었다. 결과적으로, 이러한 default operation들은 lazy collection이 상속 받고, laziness를 깨트리는 결과를 낳는다.

2. CanBuildFrom은 view와 작동하지 않는다.

새로운 operation을 위해 collection을 확장시키는 최고의 매커니즘 중 하나인 CanBuildFrom을 view가 사용할 수 없다.

Stream

Stream은 위에서 잠깐 소개했듯, lazy collection 중 하나이다. List의 lazy 버전으로 생각하면 된다. 따라서, List의 특징과 같고, 메서드 역시 List와 대부분 공유한다고 생각하면 된다.

Reference

0개의 댓글