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로 테스트함.