코틀린 대용량 반복문을 효율적으로 돌리기

KotlinDeepDive #4 — Loop

Ji Sungbin
3 min readNov 14, 2021

안드로이드 Jetpack Compose 구현 코드를 보다가 재밌는 클래스를 발견했다.

위 코드가 발견한 재밌는 코드들 중 일부인데, 코틀린에서 기본적으로 지원하는 반복문 함수들을 대부분 ~fast 로 다시 만들어서 사용하고 있었다. 그 중에서 This does not allocate an iterator like [Iterable.forEach] 라는 주석이 눈에 띄었다. 이 주석을 이해하기 위해 공부한 내용을 기록해 본다.

forEach

위 처럼 매우 기본적인 forEach 코드가 있다. 이를 자바로 디컴파일 해 보면

처럼 결국 Iterable로 바뀌어 while문에서 실행된다. 이 과정은 iterable을 만들어 메모리에 할당시키는 과정이 포함돼 있다. allocate an iterator like [Iterable.forEach] 주석이 이 과정을 말하는거 같다.

fastForEach

이제 동일 코드에서 forEach만 위 재밌는 코드에 있던 fastForEach로 바꾼 후 다시 자바로 디컴파일 해 보자.

기존 forEach 방식에서 Iterable이 메모리에 할당되는 과정이 사라졌다. This does not allocate 주석이 이 결과를 말하는거 같다. 메모리에 할당하는 부분이 없어짐으로써, 반복문을 여러번 돌릴 때 forEach에 비해 메모리 사용과 시간에 대해 이점을 가져갈 수 있다.

forEach 내부 구현

forEach는 왜 Iterable를 할당시키는걸까? forEach는 아래와 같이 구현돼 있다.

위 코드를 자바로 디컴파일 해 보면

이렇게 결국 코틀린의 in 키워드는 내부적으론 Iterable 를 통해 진행된다는걸 확인 할 수 있다.

마무리

Jetpack Compose처럼 스케일이 큰 반복문이 여러번 실행되는 환경 아니면 forEach 대신에 fastForEach를 쓴다고 해서 얻는 이점은 딱히 없을 것 같다. 이런 사소한 부분까지 다 신경써서 개발한 Jetpack Compose 개발 팀이 무섭다.. 역시 구글..!!

--

--

Ji Sungbin

Experience Engineers for us. I love development that creates references.