무지를 아는 것이 곧 앎의 시작

Kotlin

[Kotlin] 코틀린은 for-each밖에 없다고?

Alex96 2023. 7. 12. 01:42

코틀린에서의 for 문은 자바에 비해 좀 특이한 형태를 띄고 있다.
 

일단 자바랑 비교

자바 코드로 1 ~ 10까지 출력하는 for문을 작성하라면 다음처럼 작성할 수 있다.

for(int i = 1; i <= 10; i++) {
    System.out.println(i);
}

 
자바로 작성한 위의 코드를 코틀린으로 작성하면 다음과 같다.

for (i in 1..10) {
    println(i)
}

 
처음 코틀린의 for 문을 보았을 때 그냥 문법이 저런 줄 알았다. 이번엔 for-each문을 비교해볼까?

final int[] intArray = new int[]{1, 2, 3};
for (int i : intArray) {
    System.out.println(i);
}

위 자바 코드를 코틀린으로 작성하면..

val intArray = arrayOf(1, 2, 3)
for (i in intArray) {
    println(i)
}

이렇게 된다.
자, 보면 코틀린은 for 문이나 for-each문이나 다를게 없다.
아니 사실 코틀린은 for-each문만 존재한다.
 
처음 예제 코드에 `1..10` 이라는 구문을 사용했는데 ..은 어떤 연산자일까?

인텔리제이에서 .. 위에 커서를 올리면 다음처럼 나온다.

코틀린은 객체에 연산자를 정의할 수 있고, ..연산자는 rangeTo라는 함수로 동작이 정의되어있다. rangeTo 함수는 IntRange라는 객체를 반환한다.
 
IntRange도 까보자.

IntRange

시작 숫자와 끝 숫자를 가지고 있고 IntProgression이라는 타입을 상속받는다 IntProgression은 뭐하는 타입일까?

IntProgression

대충 보면 감이 오지만, 시작숫자와 종료숫자 그리고 몇씩 증가하는지를 가지는 Iterable 타입이고 이 객체는 등차수열을 의미하는 객체이다.
따라서 for(i in 숫자..숫자) {} 구문으로 작성된 for문은 for-each문이며, 1씩 증가하는 등차수열을 순회 대상으로 둔 것이다.
 
1씩 감소하는 for 문을 사용할 땐 downTo라는 키워드를 사용한다. 

downTo

얘는 뭘까? 얘도 ..연산자와 똑같이 등차수열 객체를 리턴한다. 얘는 코틀린의 특별한 문법을 알면 쉽게 유추할 수 있다.
코틀린엔 `값 함수이름 값` 으로 나열하여 함수를 호출할 수 있다. 어떻게 되냐면

코틀린의 특별한 문법..

저 두 구문은 완전히 같은 구문이다. 즉 Int 타입에 downTo 라는 함수가 정의되어있고, Int 타입을 인자로 받아서 공차가 -1인 등차수열을 리턴하는 함수를 코틀린만의 함수호출 문법으로 for 문의 in 부분에 호출한 것이다.
 
step도 마찬가지다.

i가 2씩 증가하는 for문

..연산자로 생성된 등차수열 타입에 step이란 함수를 호출하면, 해당 등차수열 객체에서 공차를 나타내는 상태값만 바꾼 새로운 등차수열 객체를 리턴한다.

step 함수 내부

fromCloseRange라는 함수를 호출하는데 생긴게 딱봐도 정적 팩토리 메소드다.

역쉬나..

코틀린의 재밌는 for문에 대해서 알아보았다.