[Kotlin] 반복문

[Kotlin] 반복문

반복문을 알아보자!


  • 반복문은 코드를 반복적으로 실행하고자 할 때 사용한다.
  • 1부터 10까지의 숫자를 Log를 사용하여 출력할 때 반복문이 없다면 Log 코드를 열 줄 작성해야 한다.
  • 반복문을 사용하면 반복문 내에서 Log 코드를 한 줄만 작성하면 된다.
  • 반복문에는 for와 while문 두 가지가 있으며 for는 특정 횟수만큼 코들르 반복하기 위해 사용하고, while문은 특정 조건이 만족할 때까지 코드를 반복할 때 사용한다.
  • while문은 if 문처럼 조건식을 사용해서 언제가지 반복할지를 결정할 수 있다.

1) for 반복문

  • 다음처럼 for 다음의 괄호 ( ) 안에 반복할 범위를 지정하면 for 블록의 코드가 지정한 횟수만큼 반복해서 동작한다.
for (반복할 범위){
    // 실행 코드
}

for in ..(온점 2개): 일반적인 형태의 for 반복문

  • 시작값과 종료값으로 지정한 숫자 범위만큼 코드를 반복하는 일반적인 방법이다.
  • in을 사용하여 반복하는 범위의 숫자를 변수에 담아두고 사용할 수 있다.
for (변수 in 시작값..종료값){
    // 실행 코드
}
  • 다음은 1부터 10까지 열 번 반복하면서 그 숫자를 변수 index에 먼저 저장하고, 반복하는 횟수만큼 for 블록의 코드를 실행한다.
for (index in 1..10){
    Log.d("For", "현재 숫자는 $index")
}
  • 첫 번째 반복에서는 변수 index에 ‘1’이 저장되고, 두 번째 반복에서는 index에 ‘2’가 저장된다.

until: 마지막 숫자 제외하기

  • 시작값과 종료값 사이의 .. (온점 2개) 대신에 until을 사용하면 종료값 이전까지만 반복한다.
for (변수 in 시작값 until 종료값){
    // 실행 코드
}
  • 컴퓨터의 인덱스가 항상 0부터 시작하기 때문에 배열의 인덱스를 사용하여 처리하는 코드에서 사용할 수 있다.
var array = arrayOf("JAN", "FEB", "MAR", "APR", "MAY", "JUN")
for (index in 0 until array.size){
    Log.d("For", "현재 월은 ${array.get(index)}입니다.")
}
  • 배열의 인덱스가 0부터 시작하기 때문에 배열의 크기는 항상 ‘마지막 인덱스 + 1의 값’ 이다.
  • 반복을 할 때 배열의 크기 바로 전까지만 반복해야 한다.

step: 건너뛰기

  • 1부터 100까지 반복하면서 3의 배수만 사용하고 싶다면 어떻게 해야 할까?
  • for 문 안에 if 문을 사용해서 현재 값이 3의 배수일 때만 출력하도록 할 수 있다.
  • 하지만 이렇게 하면 매번 해당 if 문을 실행해서 코드가 낭비되는 단점이 있다.
  • 이럴 때! step을 사용하게 되면 for 문의 블록을 step수 만큼 건너뛰어서 실행한다.
for (변수 in 시작값..종료값 step 3){
    // 실행 코드
}
  • 다음의 코드는 0~100까지 반복하며 시작값에서 종료값까지 한 번 반복할 때마다 3씩 증가시켜서 출력하는 코드이다.
for (index in 0..100 step 3){
    Log.d("For", "현재 숫자는 $index")
}

downTo: 감소시키기

  • downTo를 사용하면 큰 수에서 작은 수로 감소시키면서 반복문을 실행할 수 있다.
  • 증가할 때와 같이 step을 사용할 수도 있다.
for (index in 10 downTo 0){
    Log.d("For", "현재 숫자는 $index")
}

배열, 컬렉션에 들어 있는 엘리먼트 반복하기

  • 배열이나 컬렉션을 엘리먼트의 개수만큼 반복하면서 사용할 수 있다.
for (변수 in 배열 또는 컬렉션){
    // 실행 코드
}
  • 다음은 arrayMonth에 담겨 있는 엘리먼트들을 month 변수에 담은 후에 로그로 출력하는 예제이다.
  • 인덱스를 사용하는 방법보다 더 편하고 가독성도 좋다.
var arrayMonth = arrayOf("JAN", "FEB", "MAR", "APR", "MAY", "JUN")
for (month in arrayMonth){
    Log.d("for", "현재 월은 ${month}입니다.")
}
  • 다음은 for 반복문을 다루는 예제 이다. 안드로이드 스튜디오에서 해당 코드를 작성해서 로그를 확인해보자!
package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 1. 일반적인 반복문 사용으로 10번 반복하기
        for (index in 1..10) {
            Log.d("For", "현재 숫자는 ${index}")
        }
        // 2. 마지막 숫자 제외하기
        var array = arrayOf("JAN", "FEB", "MAR", "APR", "MAY", "JUN")
        for (index in 0 until array.size) {
            Log.d("For", "현재 월은 ${array.get(index)} 입니다")
        }
        // 3. 건너뛰기
        for (index in 0..10 step 3) {
            Log.d("For", "건너뛰기 : ${index}")
        }
        // 4. 감소시키기
        for (index in 10 downTo 0) {
            Log.d("For", "감소시키기 : ${index}")
        }
        // 4.1 건너뛰면서 감소시키기
        for (index in 10 downTo 0 step 3) {
            Log.d("For", "건너뀌면서 감소시키기 : ${index}")
        }
        // 5.1 배열, 컬렉션 사용하기
        for (month in array) {
            Log.d("for", "현재 월은 ${month} 입니다")
        }
    }
}

/** [로그캣 출력 내용]
현재 숫자는 1
현재 숫자는 2
현재 숫자는 3
현재 숫자는 4
현재 숫자는 5
현재 숫자는 6
현재 숫자는 7
현재 숫자는 8
현재 숫자는 9
현재 숫자는 10
현재 월은 JAN 입니다
현재 월은 FEB 입니다
현재 월은 MAR 입니다
현재 월은 APR 입니다
현재 월은 MAY 입니다
현재 월은 JUN 입니다
건너뛰기 : 0
건너뛰기 : 3
건너뛰기 : 6
건너뛰기 : 9
감소시키기 : 10
감소시키기 : 9
감소시키기 : 8
감소시키기 : 7
감소시키기 : 6
감소시키기 : 5
감소시키기 : 4
감소시키기 : 3
감소시키기 : 2
감소시키기 : 1
감소시키기 : 0
건너뀌면서 감소시키기 : 10
건너뀌면서 감소시키기 : 7
건너뀌면서 감소시키기 : 4
건너뀌면서 감소시키기 : 1
현재 월은 JAN 입니다
현재 월은 FEB 입니다
현재 월은 MAR 입니다
현재 월은 APR 입니다
현재 월은 MAY 입니다
현재 월은 JUN 입니다
*/

2) while 반복문

  • for 문이 특정 범위만큼 반복하는 구문이라면, while 문은 특정 조건이 만족할 때만 반복하는 구문이다.
  • 더 쉽게 접근하자면, 반복이 가능한 if 문이라고 생각할 수 있다.
  • 괄호 안의 조건식에는 주로 두 개의 항과 비교 연산가 사용된다.
while (조건식) {
    // 실행 코드
}
  • while 문 괄호 안의 조건식 결과가 항상 true이면 끝없이 동작하는 무한반복문이 된다.
  • 다음은 while문을 사용한 무한반복문 예제이다.
var a = 1
while (a == 1) {
    Log.d("while", "조건을 만족하면 여기를 출력하세요!")
}

일반적인 while 반복문

  • for 문과는 다르게 증감되는 인덱스가 있으면 코드에서 직접 처리해야 한다.
  • 다음 코드에서는 current 변수가 인덱스의 역할을 하고 있다.
var current = 1
var until = 12
while (current < until) {
    Log.d("while", "현재 값은 ${current}입니다.")
    current = current + 1
}
  • 위 while 문에는 current가 until보다 작을 때만 true를 반환하는 조건식이 입력되어 있다.
  • current의 값이 1로 시작하는데 while 문을 만났을 때 괄호 안의 조건식을 풀어 쓰면 while (1 < 12)가 된다.
  • 조건을 만족하기 때문에 while 블록의 코드가 실행되며, 먼저 로그를 출력한 후 current에 1을 더하고 다시 한번 while 문의 조건식이 실행된다.
  • 이와 같이 current가 until에 입력된 12보다 작을 때까지 총 열한 번이 반복된다.

do와 함께 사용하기

  • do와 함께 사용하면 while 문의 조건식과 관계없이 do 블록 안의 코드를 한 번 실행한다.
var game = 1
var match = 6
do {
    Log.d("while", "${game}게임 이겼습니다. 우승까지 ${match-game}게임 남았습니다.")
    game +=1
} while (game < match)

while과 do ~ while의 차이점

  • 가장 큰 차이점은 최초 값이 조건식을 만족하지 않았을 경우 실행 코드가 달라지는 것 이다.
  • 위 코드에서 변수 game의 시작 값을 6으로 변경한 후 while과 do ~ while로 실행해보면 while에서는 아무것도 출력되지 않는 반면, do ~ while에서는 조건과 상관없이 처음 한번 로그가 출력된다.
// 위 코드에 이어서
game = 6
while (game < match) {
    Log.d("while", "while 테스트입니다.")
    game +=1
}
// do ~ while 테스트
game = 6
do {
    Log.d("while", "do ~ while 테스트입니다.")
    game += 1
} while (game < match)

여기서 잠깐!

  • +=, -=, *=, /= 대입 연산자 사용하기
    • 변수와 등호(=) 사이에 산술 연산자인 +, -, *, /가 있으면 변수 자신과 연산한 결과를 대입하라는 의미이다.
      • (변수 = 변수 + 1)과 같은 수식은 (변수 += 1)로 바꿀 수 있다.
      • (변수 = 변수 - 3)도 역시 (변수 -= 3)과 동일하다.

3) 반복문 제어하기

  • 반복문이 실행되는 도중에 특정 조건에서 반복문을 벗어나거나 다음 반복문으로 넘어가야 하는 상황이 있다.
  • 이럴 때 사용하는 두 가지 방법을 알아보겠다.

break: 반목문 탈출하기

  • 반복문 안에서 break를 만나면 반복문을 탈출하게 된다.
  • break는 특정 조건에서 무조건 for 블록을 벗어날 때 사용한다.
  • 다음 코드를 보면 index의 값이 5보다 크면 break가 실행되기 때문에 여섯번째 로그가 찍힌 후에 for 블록을 빠져나간다.
for (index in 1..10){
    Log.d("break", "현재 index는 $index 입니다.")
    if (index > 5){
        break
    }
}

continue: 다음 반복문으로

  • 반복문 내에서 continue를 만나면 continue 다음 코드는 실행하지 않고 반복문의 처음으로 돌아간다.
  • 다음의 예시 코드를 보면 except가 3보다 크고 8보다 작으면 continue 명령으로 로그를 찍지 않고 for 문의 처음으로 돌아가기 때문에 4, 5, 6, 7은 출력되지 않는다.
for (exceptin 1..10) {
    if (except > 3 && except < 8){
        continue
    }
    Log.d("continue", "현재 index는 $except 입니다.")
}
  • 다음은 while 반복문을 다루는 예제이다. 안드로이드 스튜디오에서 해당 코드를 작성해서 로그를 확인해보자!
package net.flow9.thisiskotlin.basicsyntax

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 1. 일반적인 while 사용하기
        var current = 1
        val until = 12
        while (current < until) {
            Log.d("while", "현재값은 ${current} 입니다")
            // current를 1씩 증가시켜서 11번 반복한 후 while문을 빠져 나간다.
            current = current + 1
        }
        // 2. do~while 사용하기
        var game = 1
        val match = 6
        do {
            Log.d("while", "${game}게임 이겼습니다 우승까지 ${match - game}게임 남았습니다")
            game += 1
        } while (game < match)
        // 3. while vs do~while
        // while 테스트
        game = 6
        while (game < match) {
            Log.d("while", "while 테스트 입니다")
            game += 1
        }
        // do ~ while 테스트
        game = 6
        do {
            Log.d("while", "do ~ while 테스트 입니다.")
            game += 1
        } while (game < match)
        // 4. break 반복문 탈출하기
        for (index in 1..10) {
            Log.d("while", "break > 현재 index 는 $index 입니다")
            if (index > 5) { // index 가 5보다 크면 break 명령어로 현재 반복문을 벗어난다.
                break       // 따라서 Log 는 6까지만 출력된다.
            }
        }
        // 5. continue 다음 반복문으로
        for (except in 1..10) {
            // except가 3보다 크고 8보다 작으면 continue 명령으로 로그를  찍지 않고 for문의 처음으로 jump 한다.
            if (except > 3 && except < 8) {
                continue
            }
            // 따라서 4,5,6,7은 출력되지 않는다.
            Log.d("while", "continue > 현재 index 는 $except 입니다")
        }
        // 0. 무한루프 테스트
        // 이 아래의 주석을 해제하고 실행해 보세요
        // 무한루프에 빠지는 while 문 - 실행 후 멈추기 위해서는 우측 상단에 있는 빨간색 사각형 아이콘(Stop)을 클릭하면 된다.
        //        var a = 1
        //        while ( a == 1 ) {
        //            Log.d("While", "조건을 만족하면 여기를 출력하세요!")
        //        }
    }
}

/** [로그캣 출력 내용]
현재값은 1 입니다
현재값은 2 입니다
현재값은 3 입니다
현재값은 4 입니다
현재값은 5 입니다
현재값은 6 입니다
현재값은 7 입니다
현재값은 8 입니다
현재값은 9 입니다
현재값은 10 입니다
현재값은 11 입니다
1게임 이겼습니다 우승까지 5게임 남았습니다
2게임 이겼습니다 우승까지 4게임 남았습니다
3게임 이겼습니다 우승까지 3게임 남았습니다
4게임 이겼습니다 우승까지 2게임 남았습니다
5게임 이겼습니다 우승까지 1게임 남았습니다
do ~ while 테스트 입니다.
break > 현재 index 는 1 입니다
break > 현재 index 는 2 입니다
break > 현재 index 는 3 입니다
break > 현재 index 는 4 입니다
break > 현재 index 는 5 입니다
break > 현재 index 는 6 입니다
continue > 현재 index 는 1 입니다
continue > 현재 index 는 2 입니다
continue > 현재 index 는 3 입니다
continue > 현재 index 는 8 입니다
continue > 현재 index 는 9 입니다
continue > 현재 index 는 10 입니다
*/
  • 핵심요약!
    • for 문: 정해진 범위만큼 코드를 반복하기 위해 사용하는 문법이다.
    • while 문: for 문과는 조금 다르게 정해진 범위가 아닌, 특정 조건을 만족할 때까지 코드를 반복하기 위해 사용하는 문법이다.
    • break 문: 반복문을 완전히 벗어나기 위해 사용한다.
    • continue 문: 반복문 도중에 다음 반복문으로 넘어가기 위해서 사용한다. break 문처럼 완전히 벗어나지는 않고 다음 반복문의 조건에 따라 실행 여부가 결정된다.

© 2023. All rights reserved.

AgileCatch