• [이펙티브 코틀린] 8장 효율적인 컬렉션 처리

    2023. 4. 30.

    by. 하루플스토리

    반응형

    8장 효율적인 컬렉션 처리

    • 컬렉션은 프로그래밍에서 중요한 개념이다.
    • 안드로이드에서도 RecyclerView, ListView 등의 컬렉션을 사용하지 않은 앱은 상상하기 어렵다.
    • 컬렉션 처리 최적화는 생각보다 어렵지만 굉장히 중요하다. 컬렉션 처리가 성능에 큰 문제를 일으키는 경우도 많다.

    하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라

    • Iterable와 Sequence는 정의가 거의 동일하므로 차이를 잊는경우가 많다. 하지만 완전히 다른 목적으로 설계되었기 때문에 완전히 다른 형태로 동작한다. 무엇보다 시퀀스는 lazy로 처리된다.
    • 최종적인 계산은 toList, count등의 최종 연산이 이루어질 때 수행된다.
    • 시퀀스 처리의 장점
      • 자연스러운 처리 순서를 유지한다.
      • 최소한만 연산한다.
      • 무한 시퀀스 형태로 사용할 수 있다.
      • 각각의 단계에서 컬렉션을 만들어 내지 않는다.
    • 무거운 객체나 규모가 큰 컬렉션을 여러 단계에 걸쳐서 처리할 때는 시퀀스를 사용하는 것이 좋다. 또한 시퀀스 처리는 Kotlin Sequence Debugger 플러그인을 활용해서 처리 단계를 시각적으로 확인할 수 있다.

    컬렉션 처리 단계 수를 제한하라.

    • 모든 컬렉션 처리 메서드는 비용이 많이 든다. 시퀀스 처리도 시퀀스 전체를 랩하는 객체가 만들어지며 조작을 위해서 또 다른 추가적인 객체를 만들어 낸다.
    • 따라서 적절한 메서드를 활용해서 컬렉션 처리 단계 수를 적절하게 제한하는 것이 좋다.
    • 사실 컬렉션 처리와 관련해서 비효율적인 코드를 작성하는 이유는 그것이 필요엇다고 생각해서가 아니라 어떤 메서드가 있는지 몰라서인 경우가 많다. 따라서 어떤 메서드가 있는지 확인해보는 것이 좋다.

    성능이 중요한 부분에서는 기본 자료형 배열을 사용하라

    • 기본 자료형은 가볍고 빠르다는 특징이 있다. 따라서 대규모의 데이터를 처리할 때 기본 자료형을 사용하면 상당히 큰 최적화가 이루어진다.
    • 그런데 코틀린에서 List 와 Set 등의 컬렉션은 제네릭타입이다. 제네릭 타입에는 기본 자료형을 사용할 수 없으므로 래핑된 타입을 사용해야한다.
    • 하지만 성능이 중요한 경우라면 IntArray와 같이 기본 자료형을 활용하는 배열을 사용하는 것이 좋다.

    mutable 컬렉션 사용을 고려하라

    • imutable 컬렉션 보다 mutable 컬렉션이 좋은 점은 성능적인 측면에서 더 빠르다는 것이다. immutable 컬렉션에 요소를 추가하려면 새로운 컬렉션을 만들면서 여기에 요소를 추가해야한다.
    • 컬렉션을 복제하는 처리는 비용이 굉장히 많이 드는 처리이다.
    • 그래서 이러한 복제 처리를 하지 않는 mutable 컬렉션이 성능적 관점에서 좋다.
    • immutable 컬렉션은 안전하다는 측면에서 좋다.
    반응형

    댓글