본문 바로가기
Kotlin

[Kotlin in Action] 2.4 대상을 이터레이션: while과 for 루프

by Nhahan 2025. 3. 14.

2.4.1 while 루프

코틀린에는 while과 do-while 루프가 있다. 두 루프의 문법은 자바와 다르지 않다.

while (조건) {
    // ...
}

do {
    // ...
} while (조건)

 

2.4.2 수에 대한 이터레이션: 범위와 수열

코틀린에서는 가장 흔한 용례인 범위 문법을 지원한다.

보통은 정수 등의 숫자 타입 두 값이며, .. 연사자로 시작 값과 끝 값을 연결해서 범위를 만든다. (양 끝 값을 포함)

val oneToTen = 1..10 // 양 끝 값을 포함하므로 1부터 10까지의 숫자들이다.

 

역방향으로 증가 값을 갖고 범위 이터레이션을 하는 방법은 아래와 같다.

for (i in 100 downTo 1 step 2) {
    print(i)
}
// 결과: 100, 98, 96, ...

 

2.4.3 맵에 대한 이터레이션

val binaryReps = TreeMap<Char, String>()

for (c in 'A'..'F') {
    val binary = Integer.toBinaryString(c.toInt())
    binaryReps[c] = binary
}

for ((letter, binary) in binaryReps) {
    println("$letter = $binary")
}

 

맵이 아닌 컬렉션에도 위와 같은 구조 분해 구문을 활용할 수 있다.

val list = arrayListOf("10", "11", "1001")

for ((index, element) in list.withIndex()) {
    println("$index: $element")
}

 

2.4.4 in으로 컬렉션이나 범위의 원소 검사

in 연산자를 사용해 어떤 값이 범위에 속하는지 검사할 수 있다. 반대로 !in을 사용하면 어떤 값이 범위에 속하지 않는지 검사할 수 있다.

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'

>>> println(isLetter('q'))
true
>>> pritln(isNotDigit('x'))
true

// c in 'a'..'z' <-- 내부적으로 'a' <= c && c <= 'z'로 변환된다.

 

in과 !in 연산자를 when 식에서 사용해도 된다.

fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's digit!"
    in 'a'..'z', in 'A'..'Z' -> "It's a letter!"
    else -> "I dont' know..."
}

>>> println(recognize('8'))
It's a digit!

 

댓글