본문으로 바로가기
반응형

이 글은 Kotlin In Action을 참고 하였습니다.

더욱 자세한 설명이나 예제는 직접 책을 구매하여 확인 하시기 바랍니다

2.4 while과 for

코틀린은 for-each에 해당하는 형태만 존재 합니다.

따라서 for <item> in <elements> 형태로 사용됩니다.


while과 do-while문은 기존 java와 사용법이 같습니다.

따라서 형태가 좀 다른 for문을 보도록 하겠습니다.

2.4.2 Number iteration

기존 자바에서 for문을 쓰는 가장 기본적인 문법은 초기값, 증가값, 반복조건 입니다.
코틀린에서는 이런값 대신에 range를 사용합니다.
fun fizzBuzz(i: Int) = when {
    i % 15 == 0 -> "FizzBuzz "
    i % 3 == 0 -> "Fizz "
    i % 5 == 0 -> "Buzz "
    else -> "$i "
}

fun main(args: Array) {
   // 1~ 100 까지
    for (i in 1..100) {
        print(fizzBuzz(i))
    }
   
   // 100 부터 1까지 2개 간격으로 (-2씩 차감되면서 반복)
    for (i in 100 downTo 1 step 2) {
        print(fizzBuzz(i))
    }   
}


위와같이 var i = 1..100는 i변수에 1~100까지의(100 포함) 범위를 담습니다.

반대로 100 downTo 1은 역순으로 진행되면 step 2 로 설정했으므로 사실 -2씩 감소되면서 진행됩니다.


.. 은 우항을 포함합니다만, 사실 자바를 쓸때 우항은 포함하지 않도록 사용하는게 대부분 입니다.

이때는 until을 사용하면 됩니다.

for (x in 1..size-1) {
    //..
}

for (x in 1 until size) {
   //..
}
위 두개는 같은 표현 입니다.

2.4.3 Map, List에 대한 이터레이션

in 연산자는 확장성을 가지기 때문에 여러가지 형태로 사용할수 있습니다.
"이게 되나??" 싶을정도 확장성을 갖는 연산자로 아래와 같은 형태로도 사용이 가능합니다.


fun main(args: Array) {
    val binaryReps = TreeMap()

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

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

Map을 iteration할때 위와같이 for문에 in 연산자를 사용하면 key와 value를 동시에 뽑아낼수 있습니다.

자바보다 훨씬 편합니다~


또한 list의 경우에 index와 함께 뽑고 싶다면, 내부적으로 (보통 i 라는 이름으로) 변수를 따로 잡지 않고도 수행할 수 있습니다.

val list = arrayListOf("10", "11", "12")
for ((index, value) in list.withIndex()) {
    println("index: $index, vaue: $value")
}


2.4.4 in을 이용한 컬렉션이나 범위의 원소 검사

in을 이용하여 해당 원소가 collection이나 특정 범위(range)에 속해있는지도 검사할 수 있습니다.

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

fun main(args: Array) {
    println(isLetter('q'))
    println(isNotDigit('x'))
}

위 예제는 in을 이용하여 range 내부에 특정값이 존재하는지를 확인할 수 있고, !in을 사용하여 포함되지 않는지를 검사할 수 있습니다.

in 연산자는 해당 object가 Comparable을 구현했다면 사용이 가능합니다.


println("Kotlin" in "Java".."Scala") // "Java" <= "Kotlin" && "Kotlin" <= "Scala" 와 같다.
// true

println("Kotlin" in setOf("Java", "Scala")) // 집합 내부에는 Kotlin이 들어가 있지 않다.
// false




반응형