본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로프로그래밍 › Kotlin › 기초

3. 반복문

목차

조건을 먼저 검사할지, 몇 번 반복할지에 따라 구문을 선택한다.

for 문: 범위를 순회하기

for (number in 1..3) println(number) // 1, 2, 3
for (number in 3 downTo 1) println(number) // 3, 2, 1
for (index in 0 until 3) println(index) // 0, 1, 2

..는 끝값을 포함하고 until은 끝값을 제외한다. 컬렉션에 인덱스가 필요하면 withIndex()를 사용할 수 있다.

val names = listOf("Kim", "Lee")
for ((index, name) in names.withIndex()) {
    println("$index: $name")
}

while 문: 조건이 참인 동안

var count = 0
while (count < 3) {
    println(count)
    count++
}

조건이 처음부터 거짓이면 본문은 한 번도 실행되지 않는다. 반복 중 바뀌는 값이 조건에 반영되는지 확인해야 무한 반복을 피할 수 있다.

do-while 문: 먼저 한 번 실행하기

var input: String
do {
    input = readln()
} while (input.isBlank())

입력을 최소 한 번 받아야 하는 경우에 맞는다. break는 반복을 끝내고 continue는 다음 반복으로 이동한다.

예제: 목록에서 짝수의 합 구하기

val numbers = listOf(2, 5, 8, 11)
var sum = 0

for (number in numbers) {
    if (number % 2 != 0) continue
    sum += number
}
println(sum) // 10

continue를 만나면 그 아래 sum += number를 건너뛰고 다음 숫자로 간다. 단순 합계라면 numbers.filter { it % 2 == 0 }.sum()처럼 컬렉션 함수로도 표현할 수 있다. 중간에 종료하거나 여러 조건을 단계별로 확인해야 한다면 반복문이 읽기 쉬울 수 있다.

for (index in 0 until numbers.size)는 빈 목록에서 반복하지 않는다. 인덱스가 꼭 필요하지 않다면 for (number in numbers)를 사용해 범위의 끝값을 잘못 계산할 가능성을 줄인다. while은 종료 조건이 데이터에 따라 달라질 때, do-while은 본문을 반드시 한 번 실행해야 할 때 선택한다. 앞의 readln() 예제는 표준 입력이 끝나면 예외가 날 수 있으므로 파일이나 파이프 입력을 처리할 때는 readlnOrNull()로 종료 조건을 따로 마련한다.

참고: Kotlin 조건과 반복문 문서

종료 조건이 외부 입력에 달린 경우

readln()은 입력이 끝나면 예외를 던질 수 있다. 표준 입력이나 파일 파이프처럼 EOF가 정상 종료일 수 있다면 readlnOrNull()로 종료를 값으로 표현한다.

var accepted = 0
while (accepted < 3) {
    val line = readlnOrNull() ?: break
    if (line.isBlank()) continue
    println("처리: $line")
    accepted++
}
println("처리한 줄: $accepted")

빈 줄은 continue로 건너뛰고, EOF면 break로 종료한다. 처리한 줄이 세 개가 되면 입력이 더 있어도 루프가 끝난다. 따라서 종료 조건은 최대 처리 수와 입력 종료 두 가지다. 서비스 코드라면 최대 길이·문자 형식 등 입력 검증도 필요하다. 자료가 이미 메모리에 있는 컬렉션이라면 for (line in lines)가 상태 변수를 직접 관리할 필요가 없어 더 간단하다.

범위를 반복할 때 1..n은 n을 포함하므로 빈 배열의 인덱스처럼 사용할 때 주의한다. 0 until size나 indices는 빈 컬렉션에 대해 안전한 범위를 만든다. 특히 종료 경계가 0인 경우를 작은 예제로 확인하면 한 번 더 실행되는 오류를 줄일 수 있다.

같은 카테고리의 글