본문 바로가기

Kotlin/Basic

[Kotlin] 반복문

최종 수정: 24.05.18

 

Kotlin에서 반복문을 통해 흐름을 제어(control flow)를 하는 방법에 대해서 알아보겠다.

반복구문은 for과 forEach, while, repeat를 사용할 수 있다.

for

코틀린의 for문은, 아래와 같은 형태로 사용한다.

집합 collection에 대해서 각각 요소를 Item으로 정의하고 식을 실행시키는 구조다.

사실 for문은 모든 언어에서 사용되는 반복문인 만큼, 처음 코딩을 접하는 것이 아니라면 익숙한 개념이다.

때문에, for문의 문법적인 내용을 다루기 보다는, 코틀린에서는 어떻게 반복 범위를 지정할 수 있는지를 다루는 것이 옳바른 방향이라고 생각된다.

‣상행 반복 예제

for (i in 0..5){
    println(i)
}
---
0
1
2
3
4
5

상향 반복에는 2개의 범위 지정자를 사용할 수 있다.

..는 이상, 이하로 범위의 지정된 모든 값을 포함한다. 위 코드의 경우, 0 ≤ .. ≤ 5 와 같다.

until은 이상, 미만으로 가장 마지막 값을 포함하지 않는다. 위 코드를 until로 변경한다면 0 ≤ until < 5와 같다.

 

‣하행 반복 예제

하행 반복, 즉 감소하는 for문은 downTo 키워드를 사용한다.

for ( i in 5 downTo 0){
    println(i)
}
---
5
4
3
2
1
0

간혹, 코딩테스트에서 하행 연산이 필요한 경우가 있다.

때문에, downTo는 알아두는 것이 좋다.

downTo는 ..과 동일하게 이상, 이하 값을 의미한다. 위 예제에서는 5 ≥ downTo ≥ 0가 되겠다.

 

‣ 증감 간격 설정

+2 혹은 +3과 같이 for문을 사용하다보면 간격 설정이 필요해질 때가 있다.

이 경우, step 키워드를 사용하면 된다.

for ( i in 1..10 step 2){
    println(i)
}
---
1
3
5
7
9

downTo와 사용하면, step 만큼 건너 뛰며 감소한다.

for ( i in 10 downTo 1 step 2){
    println(i)
}
---
10
8
6
4
2

 


forEach

본인은 실무나 알고리즘 문제를 풀 때, for문보다 forEach를 애용하는 편이다.

collection의 범위를 굳이 지정해 주지 않아도, 전체적으로 iteration을 수행할 수 있기 때문이다.

val numList = arrayListOf(1,2,3,4,5)

numList.forEach{ num -> 
    println(num)
}
---
1
2
3
4
5

forEach는 continue, break와 같은 흐름제어자(Control Flow Statements)를 사용할 수 없다.

하지만, return@run을 사용해 iteration 자체를 탈출할 수 있다.

 

앞서도 작성했지만, forEach는 주로 List나 Array와 같은 Data Structure를 전체적으로 탐방하기 위해 사용한다.
스코프 내부의 암시적 매개변수로 바로 값을 참조할 수 있기 때문이다.
하지만, 갑자기 해당 값의 index를 알고 싶어지는 경우가 생길 수 있다.
그럴때는 forEachIndexed를 사용하면 된다.
forEachIndexed는 forEach와 유사하지만, 람다 함수에서 인덱스와 요소를 함께 사용할 수 있게 해준다.

val fruits = listOf("Apple", "Banana", "Cherry", "Date")

fruits.forEachIndexed { index, fruit ->
    println("Item at index $index is $fruit")
}
---
Item at index 0 is Apple
Item at index 1 is Banana
Item at index 2 is Cherry
Item at index 3 is Date

 

 


while

코틀린의 while 구문도 사실 다른 언어와 별 차이 없다.

while은 조건식을 만족하는 한, 계속 반복된다.

while과 do-while의 차이점은 조건을 먼저확인하냐 아니면 뒤에 확인하냐의 차이일 뿐이다.

fun main() {
    var a: Int = 5
    while(a > 0){
        a --
        println(a)
    }

    var b:Int = 5

    do{
        b --
        println(b)
    }while(b > 0)
}

Repeat

repeat은 본인이 코딩테스트 문제를 풀이할 때, 가장 많이 사용하는 반복문이다.
그냥 "n번 만큼 반복한다"는 말이 있으면 for문으로 길게 쓸 필요 없이 아래처럼 간단하게 사용 가능하기 때문이다.

repeat(5){ cnt ->
    println(cnt)
}
---
0
1
2
3
4

repeat(n)은 for의 until과 동일하다고 생각하면 좋다.

대신, 무조건 0부터 시작한다.

 

주로 아래처럼, 문제에서 주는 데이터를 입력받을때 사용하는데, 간편하고 넘모좋다. 여러분도 꼭 쓰길 바란다.

repeat(n){ 
    readln()
}

 

'Kotlin > Basic' 카테고리의 다른 글

Kotlin 코딩테스트 기초 문법 정리 #1  (0) 2024.06.24
집합: Set, MutableSet  (0) 2023.12.03
가변 인자 목록: vararg  (0) 2023.12.03
[Kotlin] object & companion object  (0) 2023.01.19
[Kotlin] lateinit와 lazy의 차이점  (0) 2023.01.17