본문 바로가기

개발 노트/Kotlin

[kotlin]반복문

반복문코드를 반복적으로 실행하고자 할 때 사용한다

만약 1부터 10까지의 숫자를 로그를 사용하여 출력할때 반복문이 없다면, 로그코드를 10줄을 작성해야될것이다

그치만 반복문을 사용하면, 반복문 내에서 로그코드를 한줄만 작성하면 된다!

  • 반복문에는 for문while문 두가지가 있으며, for문특정 횟수만큼 코드를 반복하기위해 사용하고, while문특정조건이 만족할 때까지 코드를 반복할 때 사용한다
  • while문은 if문처럼 조건식을 사용해서 언제까지 반복할지 결정할 수 있다

 

 

# for 반복문 

- 아래 코드처럼 for 다음의 괄호 ( ) 안에 반복할 범위를 지정하면, for블록의 코드가 지정한 횟수만큼 반복해서 동작한다

for (반복할 범위){
    // 실행 코드
}

 

 

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

- 시작값과 종료값으로 지정한 숫자 범위만큼 코드를 반복하는 일반적인 방법이다

- in을 사용하여, 반복하는 범위의 숫자를 변수에 담아두고 사용할 수 있다

for (변수 in 시작값..종료값){
    // 실행 코드
}

 

 

for (index in 1..10){
    Log.d("For", "현재 숫자는 $index")
}

 

-> 1부터 10까지 열번 반복하면서, 그 숫자를 변수 index에 먼저 저장하고, 반복하는 횟수만큼 for블록의 코드를 실행한다

-> 첫번째 반복에서는 변수 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){
    // 실행 코드
}

 

 

for (index in 0..100 step 3){
    Log.d("For", "현재 숫자는 $index")
}

 

-> 0부터 100까지 반복하는데, 0부터 100까지 한번 반복할때마다 3씩 증가시켜서 실행한다

-> 0,3,6,9.....99까지 실행

 

 

 

# downTo : 감소시키기 

- downTo를 사용하면 큰수에서 작은수로 감소시키면서 반복문을 실행할 수 있다

- 증가할 때와 같이 step을 사용할 수도 있다

for (index in 10 downTo 0){
    Log.d("For", "현재 숫자는 $index")
}

 

-> 10부터 0까지 감소시키면서 반복문 실행 

 

 

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

- 배열이나 컬렉션을 엘리먼트 개수만큼 반복하면서 사용할 수 있다

for (변수 in 배열 또는 컬렉션){
    // 실행 코드
}

 

 

var arrayMonth = arrayOf("JAN", "FEB", "MAR", "APR", "MAY", "JUN")
for (month in arrayMonth){
    Log.d("for", "현재 월은 ${month}입니다.")
}

 

-> 다음은 arrayMonth에 담겨있는 엘리먼트들을 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 입니다
*/

 

 

 

 

# while 반복문

- for문특정 범위만큼 반복하기 위한 구문이라면, while문은 특정 조건이 만족할때까지 반복하기 위한 구문이다!!

- 반복이 가능한 if문이라고 생각할 수 있다

while (조건식) {
    // 실행 코드
}

 

-> 괄호 안의 조건식에는 주로 두 항비교연산자가 사용된다 

 

var a = 1
while (a == 1) {
    Log.d("while", "조건을 만족하면 여기를 출력하세요!")
}

 

-> while문 괄호 안의 조건식 결과가 항상 true이면, 끝없이 동작하는 무한루프에 빠진다

 

 

 

# 일반적인 while 반복문 

- for문과는 다르게, 증감하는 인덱스가 있으면 코드에서 직접 처리해야한다

- 아래 코드에서는 current변수가 인덱스의 역할을 하고있다

var current = 1
var until = 12
while (current < until) {
    Log.d("while", "현재 값은 ${current}입니다.")
    current = current + 1
}

 

-> 위 while문에는 current가 until보다 작을때만 ture를 반환하는 조건식이 입력되어있다

-> current값이 1로 시작해서 current < until의 조건을 만족하기 때문에, 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 (game < match) {
    Log.d("while", "while 테스트입니다.")
    game +=1
}
// do ~ while 테스트
game = 6
do {
    Log.d("while", "do ~ while 테스트입니다.")
    game += 1
} while (game < match)

 

-> 변수 game의 시작값을 6으로 변경한 후, while과 do~while로 실행해보면,

while에서는 아무것도 출력되지 않는 반면, do ~ while 에서는 조건과 상관없이 처음 한번 로그가 출력된다

 

 

 

# 반복문 제어하기 

- 반복문이 실행되는 도중에 특정조건에서 반복문을 벗어나거나, 다음 반복문으로 넘어가야하는 상황이 있다

- 이럴땐 breakcontinue를 사용해서 반복문을 제어해줄수있다

 

 

# break : 반복문 탈출하기 

- 반복문 안에서 break를 사용해서 반복문을 탈출할 수 있다 

- 특정조건에서 무조건 for블록을 벗어날때 사용한다 (가장 가까이있는 반복문을 빠져나간다)

for (index in 1..10){
    Log.d("break", "현재 index는 $index 입니다.")
    if (index > 5){
        break
    }
}

 

-> index의 값이 5보다 크면 break가 실행되기 때문에, 여섯번째 로그가 찍힌 후에 for블록을 빠져나간다

 

 

# continue: 다음 반복문으로 

- 반복문 내에서 continue를 만나면, continue 다음코드는 실행하지 않고, 반복문의 처음으로 돌아간다

for (exceptin 1..10) {
    if (except > 3 && except < 8){
        continue
    }
    Log.d("continue", "현재 index는 $except 입니다.")
}

 

-> except가 3보다 크고 8보다 작으면, continue 명령으로 로그를 찍지 않고, for문의 처음으로 돌아가기때문에  4,5,6,7은 출력되지 않는다

 

 

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문처럼 완전히 벗어나지는 않고 다음 반복문의 조건에 따라 실행여부가 결정)

 

 

 

 

 

 

 

 

 

 

 

 

'개발 노트 > Kotlin' 카테고리의 다른 글

[kotlin]클래스와 설계  (0) 2024.01.16
[kotlin]함수  (0) 2024.01.16
[kotlin]배열과 컬렉션  (0) 2024.01.16
[kotlin]조건문  (0) 2024.01.16
[kotlin]변수  (0) 2024.01.16