티스토리 뷰

Kotlin에도 Java 8 Stream과 동일한 지연 계산이 존재하며, Sequence 인터페이스를 활용해서 이를 처리한다. 이에 대해서 간략하게 정리해보려고 한다.

컬렉션 함수를 연쇄할 때, 처리되는 방식

컬렉션 함수의 경우에는 결과 컬렉션을 즉시 생성한다는 특징을 가지고 있다. 따라서 map과 filter를 연쇄해서 처리할 때, 계산 중간 결과를 새로운 컬렉션에 임시로 담는다. 예를 들어 아래와 같은 코드가 있다면, 다음과 같이 처리된다.

people.map { it.age }.filter { it >= 30 }

컬렉션의 원소가 적은 경우에는 위와 같이 처리돼도 문제가 없지만, 컬렉션의 원소가 수십만 개에서 수백만 개로 이루어져 있는 경우에는 효율이 떨어지게 된다. 원소가 정말 많은 컬렉션에서 Sequence를 사용하면, 눈에 띄게 성능이 좋아진다.

Sequence 사용하여, 컬렉션을 시퀀스로 변환하기

우선 Sequence의 특징을 정리해보면 다음과 같다.

 

  • Sequence 인터페이스에는 한 번에 하나씩 열거될 수 있는 원소의 시퀀스를 표현할 뿐이다.
  • Sequence 인터페이스에는 iterator() 메서드가 있다.
  • 시퀀스의 원소는 필요할 때, 계산되기 때문에 중간 처리 결과를 저장하지 않고도 연산을 연쇄적으로 적용해서 효율적으로 계산을 수행한다.
  • asSequence() 확장 함수를 사용하여, 연쇄적으로 컬렉션들을 처리한다.
  • asSequence() 확장 함수를 통해 컬렉션을 시퀀스로 바꿔서 처리한 다음, 시퀀스를 리스트로 만들 때는 toList() 함수를 사용한다.
  • Java 8 Stream가 개념이 같다.

시퀀스를 사용하는 코드는 아래와 같으며, 시퀀스는 모든 연산에 대해 각 원소들을 순차적으로 처리한다.

people.asSequence() // 원본 컬렉션을 시퀀스로 변환한다.
    .map { it.age }
    .filter { it >= 30 }
    .toList() // 결과 시퀀스를 다시 리스트로 변환한다.

 

위의 처리 방식을 더 효율적으로 하고 싶다면, filter를 먼저 처리하고, 그다음에 map을 처리하면 되고, 처리되는 횟수가 줄어들게 되어 성능 부분에 있어서도 좋아진다.

people.asSequence()
    .filter { it.age >= 30 } // 먼저 30 이상인 값만 거른다.
    .map { it.age }
    .toList()

시퀀스 연산 실행 (중간 연산, 최종 연산)

시퀀스에 대한 연산은 중간 연산과 최종 연산으로 나눠진다. 중간 연산은 다른 시퀀스를 반환하며, 그 시퀀스는 최초 시퀀스의 원소를 변환하는 방법을 안다. 최종 연산은 결과를 반환한다. 결과는 최초 컬렉션에 대해 변환을 적용한 시퀀스로부터 일련의 계산을 수행해 얻을 수 있는 컬렉션이나 원소, 숫자 또는 객체이다.

people.asSequence()
    .filter {}.map {} // 중간 연산
    .toList() // 최종 연산

중간 연산은 항상 지연 계산된다는 특징을 가지고 있다. 따라서 최종 연산이 없는 경우, 변환이 늦춰지고 결과를 얻을 필요가 있을 때, 계산이 적용된다. 즉, 최종 연산이 적용이 되는 경우에 중간 연산이 동작한다는 의미이다.

주의할 점

성능을 위해서 시퀀스를 모든 컬렉션에 붙여서는 안 된다. 코틀린 표준 라이브러리의 컬렉션 함수는 inline 키워드를 활용해서 성능적으로 잘 풀어냈기 때문에 리스트에 원소가 적은 경우에는 즉시 계산을 하는 것이 더 효율적이라고 한다. 이 부분은 inline 키워드를 공부하고, 정리하게 된다면, 그때 다시 자세하게 알아보려고 한다. 마지막으로 시퀀스를 사용해서 성능적으로 잘 풀어내기 위한 경우는 컬렉션의 크기가 큰 경우에만 적용해야 한다.

참고

 

Kotlin in Action - YES24

코틀린이 안드로이드 공식 언어가 되면서 관심이 커졌다. 이 책은 코틀린 언어를 개발한 젯브레인의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 코틀린 언어의 가장

www.yes24.com

 

'Kotlin' 카테고리의 다른 글

[Kotlin] null 처리 방법 정리  (0) 2022.03.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함