본문 바로가기
2023년 이전/kotlin

코틀린(Kotlin)- 대상을 이터레이션: while과 for 루프

by JeongUPark 2019. 10. 11.
반응형

[출처 -  Kotlin In Action] [아래 내용들은 Kotlin In Action을 공부하면서 스스로 정리한 내용입니다] 

이번에는 for 문과 while 문을 공부해 보겠습니다.

while의 경우에는 do while과 while 두가지가 있고 Java와 다르지 않습니다.

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

하지만 for문은 쫌 다릅니다.

Java의 경우에는 

for(int i = 0; i < size ; i++){
        ....
}

for( item : List<item>()){
        ....
}

로 for문을 만듭니다. 

 

반면 kotlin에서는 아래와 같이 for문을 만들 수 있습니다. (아래와 같이 작성하면 1부터 100까지 값이 프린트 됩니다.)

for(i in 1..100){
   println(i)
}

// or

for(i in 1 until 101){  // until의 경우에는 전까지만 적용됩니다.
    println(i)
}

그리고 100부터  1까지 표현은

for (i in 100 downTo 1 ) {
    println(i)
}

로 만들 수 있습니다. (다운 count의 경우에는 .. 으로 표현이 되지 않습니다.)

마지막으로 step을 사용하면 step을 적용한 만큼 건너 뛰어 표현합니다.

for(i in 1..100 step 2){
   println(i)
}

// or

for(i in 1 until 101 step 2){
    println(i)
}

이렇게 할 경우 1,3,5,7, .... , 95,97,99가 print됩니다.

 

그리고 만약 array의 통하여 for 문을 만든다면 다음과 같습니다.

val list = listOf<String>("Alpha","Beta","Gamma","Delta")
fun main(args: Array<String>) {
    for (i in 0..list.size) {
        print(i)
    } // 0,1,2,3,4,
    for (i in list.indices) {
        print(i)
    } // 0,1,2,3,
    for (i: String in list) {
        print(i)
    } // Alpha,Beta,Gamma,Delta,
}

이런 식으로 표현 할 수 있습니다. 첫번째 for문은 위에서 작성한 for문과 마찬가지로 0부터 list의 size 까지 나타냅니다.

2번쨰 for문은 list의 데이터 인덱스를 나타내는 값을 쓸 때 사용합니다. 즉 위의 list는 

list[0] = "Alpha" list[1] = "Beta" list[2] = "Gamma" list[3] = "Delta"로 0,1,2,3이 데이터 인덱스를 나타내기 때문에 0,1,2,3을 출력합니다. 마지막 for문은 list가 포함하는 데이터를 출력하는 방식입니다. (list가 String 타입을 가지는 list이기 때문에 String을 사용하고 있습니다. 다른 타입이면 다른 타입을 적용하면 그 타입에 맞게 i에 데이터가 적용됩니다.)

 

숫자 뿐만 아니라 문자로도 표현을 할수 있습니다.

for (c in 'A'..'F') {
    println(c)
}

 이렇게 할경우 결과 값은 A B C D E F로 출력 됩니다.  이런 특성을 이용하여 각 문자의 2진값을 출력 해 볼수도 있습니다.

fun main(args: Array<String>) {
    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")
    }
}

 첫번쨰 for문을 사용하여 TreeMap에 각 문자와 그에 맞는 이진수 값을 string으로 저장합니다. 그리고 그 결과값을 2번째 for을 사용하여 출력합니다. 출력 결과는 아래와 같이 출력 됩니다.

A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110

마지막으로 in은 for문 말고도 다른 곳에서 사용할 수 있습니다.

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

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

isLetter는 c가 a~z이거나 A~Z일 경우 true를 return 하고 isNotDigit는 0~9사이의 값이 아닐 경우 true를 출력합니다.

또한

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

fun main(args: Array<String>) {
    println(recognize('8'))
}

when에서 조건으로 사용하여 c가 0~9일 경우 It's a digit!를 return하고 a~z 또는 A~Z일 경우 It's a letter!를 return 합니다.

반응형