Skils/Kotlin

[Kotlin] 반복문 while, do-while, for

재한 2022. 8. 17. 21:09

코틀린에서의 반복문은 세 가지 제어 구조를 제공한다.


📕do- while

fun main(){
    var sum=0
    var n=0
    do{
        n=readLine()!!.toInt()
        sum+=n
    }while(n!=0)

    println("Sum: $sum")
}
  1. do 와 while 키워드 사이에 있는 루프 몸통을 실행한다.
  2. while 키워드 다음에 있는 조건을 평가한다. 이 값이 참이면 1번 단계로 되돌아가고, 이 값이 거짓이면 루프 문 다음에 있는 문을 실행한다.

루프 몸통을 실행한 후에 조건을 검사하기 때문에 루프 몸통이 최소한 한 번은 실행한다는 사실을 유의해야 한다.!

📕while

fun main(){
    val num = Random.nextInt(1,101)
    var guess =0
    while(guess!=num) {
        guess = readLine()!!.toInt()
        if (guess < num) println("Too small")
        else if (guess > num) println("Too big")
    }
    println("Right : num is $num")
}

어떤 조건이 참인 동안 루프를 실행하지만 루프 몸통을 실행하기 전에 조건을 먼저 검사한다. 이 경우 조건이 거짓이면 루프 몸통이 한 번도 실행되지 않는다.

do while Vs while

do while 문은 루프를 실행하고 조건을 검사하지만 while문은 조건을 검사하고 루프를 실행한다는 점에서 차이가 있다.

📕for

fun main() {
    val a=IntArray(10) {it}
    var sum=0
    for(x in a){
        sum+=x
    }
    println("sum is $sum")
}
  1. 이터레이션 대상을 담을 변수 정의(x)
  2. 이터레이션에 사용할 값들이 담겨 있는 컨테이너를 계산하기 위한 식(a)
  3. 루프 몸통에 해당하는 문({sum+=1}). 이터레이션 시 이 몸통이 실행된다.

이터레이션 변수는 루프 몸통 안쪽에서만 접근할 수 있으며 일반 변수와 달리 val이나 var을 붙이지 않고 자동으로 불변 값이 된다.
즉 루프 몸통에서 루프 변수를 변경할 수는 없다.

🔎자바 vs 코틀린

코틀린의 for 루프는 Iterable 인스턴스에 대한 루프를 간편하게 작성하도록 해주는 자바 for-each 루프와 비슷하다.
배열, 리스트, 집합은 Iterable에 속하며, 사용자가 정의한 타입도 Iterable을 상속할 수 있다.
하지만 코틀린에서는 선언, 초기화, 검사 및 갱신으로 구성되는 일반 자바 for 루프에 해당하는 언어 구조가 없다.
자바에서는 문자열의 각 문자에 대해 루프를 직접 수행할 수 없다. 따라서 인덱스를 사용한 루프를 돌거나, 문자열을 문자 배열로 바꾸는 등의 대안을 사용해야 한다.
수 범위에 대한 일반적인 루프를 수행하기 위해서는 진행 타입을 사용해야 한다. [.. , until, in , !in]

💡인덱스에 접근해서 배열의 원소 바꾸기

fun main() {
    val a=IntArray(10) {it*it}
    var sum=0
    for(i in 0..a.lastIndex){
        if(i%2==0){ //index가 짝수일때 실행
            a[i]*=2
        }
    }
}

💡step을 사용한 코드

fun main() {
    val a=IntArray(10) {it*it}
    var sum=0
    for(i in 0..a.lastIndex step 2){ //index가 2만큼 증가시켜서 짝수만 돌아가게됨.
        a[i]*=2
    }
}

💡문자열과 배열에는 원소나 문자의 인덱스 범위를 제공하는 indices라는 프로퍼티가 들어있다.

fun main(){
    val a= IntArray(10){it*it}
    for( i in a.indices step 2){
        a[i]*=2
    }
}

✔정리

  • 코틀린에서 반복문을 수행하는 구조는 while, do-while, for 3가지가 있다.
  • do -while과 while문은 조건을 검사하고 조건을 만족하면 루프를 실행하는 구조다.
    • do-while은 루프를 실행 후에 조건을 검사하기에 최소 1번은 실행된다.
    • while은 루프를 실행하기 전에 조건을 검사하기 때문에 조건이 맞지 않다면 루프가 실행 안될 수도 있다.
  • for은 여러 값이 들어있을 수 있는 값에 대한 루프를 수행한다.
    • for에서 사용하는 이터레이션 변수는 루프 몸통 안쪽에서만 접근 가능하며 루프 몸통에서 루프 변수를 변경할 수 없다.
  • 문자열과 배열에는 원소나 문자의 인덱스 범위를 제공하는 indices라는 프로퍼티가 들어있다.(C++ vector.size() 느낌?)