이펙티브 코틀린 Item 52: mutable 컬렉션 사용을 고려하라

woga·2024년 1월 20일
0

코틀린 공부

목록 보기
53/54
post-thumbnail

immutable 컬렉션보다 mutable 컬렉션이 좋은 점은 성능적인 측면에서 더 빠르다.
왜냐면 immutable에 요소를 추가하려면 새로운 컬렉션을 만들면서까지 추가해야 한다.

operator fun <T> Iterable<T>.plus(element: T): List<T> {
	if (this is Collection) return this.plus(element)
    val result = ArrayList<T>()
    result.addAll(this)
    result.add(element)
    return result
}

컬렉션을 복제하는 처리는 비용이 굉장히 많이 드는 처리이다. 그래서 복제 처리를 하지 않는 mutable 컬렉션이 성능적 관점에서 좋다. 그러나 immutable은 안전하다는 측면에서 좋다.

하지만 일반적인 지역 변수는 이때 언급했던 동기화와 캡슐화 문제가 될 수 있는 경우에 해당되지 않는다. 따라서 지역변수로 사용할 때는 뮤터블 컬렉션이 더 합리적이다.
그래서 표준 라이브러리도 내부적으로 어떤 처리를 할때는 mutable 컬렉션을 사용하도록 구현되어 있다.

inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
	val size = if (this is Collection<*>) this.size else 10
    val destinatio = ArrayList<R>(size)
    for (item in this)
    	destination.add(transform(item))
    return destination
}

정리

가변 컬렉션은 일반적으로 추기 처리가 빠르다. immutable 컬렉션은 컬렉션 변경과 관련된 처리를 더 세부적으로 조정할 수 있다. 일반적으로 지역 스코프에서는 이러한 세부적인 조정이 필요하지 않으므로, 가변 컬렉션을 사용하는 것이 좋다. 특히 utils에서는 요소 삽입이 자주 발생할 수 있기 때문이다.

profile
와니와니와니와니 당근당근

0개의 댓글