[Kotlin] 객체 할당 없는 for loop

Kotlin에서는 배열이나 컬렉션을 다룰 때 forEach, forEachIndexed, map 등을 통해 내부 항목들을 접근해서 연산을 수행할 수 있다.

이러한 함수들은 인덱스를 직접 관리할 필요가 없어서 편리하긴 하지만, Range나 Iterator같은 부가적인 객체를 생성한다는 단점이 있다.

대부분의 경우에는 객체 한두개 정도 추가 할당하는 것이 큰 문제가 되지 않겠지만, 안드로이드에서 View 클래스의 onDraw 메서드를 오버라이드할 때에는 메서드 내에서 새로운 객체를 생성하지 않도록 주의해야한다.

Kotlin의 기본적인 loop 문법은 아래와 같다.

for (x in 0..9)
for (x in 0 until 10)
for (x in 0 until 10 step 2)

결론부터 말하자면 두 번째 for loop만 추가객체 할당이 없다.

내부적으로 첫 번째는 IntRange, 세 번째는 IntProgression 객체를 생성한다.

문서만 보면 ..(rangeTo) 연산자until 연산자는 둘 다 Range 객체를 생성하는 것으로 나와있지만, 디컴파일 결과를 보면 두 번째 루프는 아래와 같이 나온다.

int var0 = 0;

for(byte var1 = 10; var0 < var1; ++var0) {
}

forEach는 내부적으로 Iterator 객체를 생성하고 map은 Collection과 Itrator 객체를 생성한다.

Kotlin 1.4로 테스트함.

Leave a Comment

Your email address will not be published.