본문 바로가기

Language/Kotlin

코틀린[Kotlin] 흐름 통제하기 (When, Loop, Ranges, Equality, Contidional ..)

코틀린으로 반복문, 조건문 등을 어떻게 사용하는지 알아보겠습니다~!

코틀린 공식 문서를 참고했습니다.

 

When

자바에서서 사용되는 switch문 대신에 Kotlin은 When으로 구성할 수 있습니다. When을 선언문이나 표현식으로 사용할 수 있습니다.

When 선언문

fun main() {
    cases("Hello")
    cases(1)
    cases(0L)
    cases(MyClass())
    cases("hello")
}

fun cases(obj: Any) {                                
    when (obj) {                                     // 1   
        1 -> println("One")                          // 2
        "Hello" -> println("Greeting")               // 3
        is Long -> println("Long")                   // 4
        !is String -> println("Not a string")        // 5
        else -> println("Unknown")                   // 6
    }   
}

class MyClass
  1. when 선언문입니다
  2. obj가 1인지 확인합니다.
  3. obj가 Hello와 같은지 확인합니다.
  4. 타입 검사를 합니다.
  5. 반대 타입 검사를 합니다.
  6. 기본 선언문(생략 가능).

모든 조건은 그중 하나가 충족될 때까지 순차적으로 확인됩니다. 따라서 첫 번째 적합한 조건만 실행됩니다.

When 표현식

fun main() {
    println(whenAssign("Hello"))
    println(whenAssign(3.4))
    println(whenAssign(1))
    println(whenAssign(MyClass()))
}

fun whenAssign(obj: Any): Any {
    val result = when (obj) {                   // 1
        1 -> "one"                              // 2
        "Hello" -> 1                            // 3
        is Long -> false                        // 4
        else -> 42                              // 5
    }
    return result
}

class MyClass
  1. when 표현식입니다.
  2. obj가 1인 경우 값을 "one"로 설정합니다.
  3. obj가 "Hello"와 같으면 값을 1로 설정합니다.
  4. obj가 Long의 인스턴스인 경우 값을 false로 설정합니다.
  5. 이전 조건이 충족되지 않으면 값 "42"를 설정합니다. when 선언문과 달리 when 표현식은  default가 일반적으로 when 표현식에 필요합니다. (컴파일러가 다른 분기가 가능한 모든 경우를 포함하는지 확인할 수 있는 경우를 제외함, 예를 들어 seal class)

Loops

Kotlin은 일반적으로 사용되는 모든 루프를 지원합니다: for, while, do-while

for

For는 Kotlin에서는 대부분의 언어와 동일한 방식으로 작동합니다.

val cakes = listOf("carrot", "cheese", "chocolate")

for (cake in cakes) {                               // 1
    println("Yummy, it's a $cake cake!")
}
  1. 리스트의 각 케이크를 반복합니다.

while and do-while

while 및 do-while 구문은 대부분의 언어와 유사하게 작동합니다.

fun eatACake() = println("Eat a Cake")
fun bakeACake() = println("Bake a Cake")

fun main(args: Array<String>) {
    var cakesEaten = 0
    var cakesBaked = 0
    
    while (cakesEaten < 5) {                    // 1
        eatACake()
        cakesEaten ++
    }
    
    do {                                        // 2
        bakeACake()
        cakesBaked++
    } while (cakesBaked < cakesEaten)

}
  1. 조건이 참인 동안 블록을 실행합니다.
  2. 블록을 먼저 실행한 다음 조건을 확인합니다.

Iterators

Iterators 연산자를 구현하여 클래스에 고유한 Iterators를 정의할 수 있습니다.

class Animal(val name: String)

class Zoo(val animals: List<Animal>) {

    operator fun iterator(): Iterator<Animal> {             // 1
        return animals.iterator()                           // 2
    }
}

fun main() {

    val zoo = Zoo(listOf(Animal("zebra"), Animal("lion")))

    for (animal in zoo) {                                   // 3
        println("Watch out, it's a ${animal.name}")
    }

}
  1. 클래스의 iterator를 정의합니다. 이름이 iterator여야 하고 operator 한정자가 있어야 합니다.
  2. 다음 메서드 요구 사항을 충족하는 iterator를 반환합니다.
    1. next(): Animal
    2. hasNext(): Boolean
  3. 사용자 정의 iterator를 사용하여 Zoo의 동물을 반복합니다.

iterator는 타입 또는 확장 함수로 선언할 수 있습니다.

Ranges

Kotlin에는 범위를 정의하기 위한 도구들이 있습니다. 

for(i in 0..3) {             // 1
    print(i)
}
print(" ")

for(i in 0 until 3) {        // 2
    print(i)
}
print(" ")

for(i in 2..8 step 2) {      // 3
    print(i)
}
print(" ")

for (i in 3 downTo 0) {      // 4
    print(i)
}
print(" ")
// 0123 012 2468 3210
  1. 0에서 3(포함)까지의 범위를 반복합니다. 다른 프로그래밍 언어(C/C++/Java)의 'for(i=0; i<=3; ++i)'와 같습니다.
  2. 0에서 3(제외)까지의 범위를 반복합니다. Python의 for 루프 또는 다른 프로그래밍 언어(C/C++/Java)의 'for(i=0; i<3; ++i)'와 같습니다.
  3. 연속 요소에 대해 사용자가 정의한 증가 단계를 사용하여 범위를 반복합니다.
  4. 역순으로 범위를 반복합니다.

Char 범위도 지원됩니다.

for (c in 'a'..'d') {        // 1
    print(c)
}
print(" ")

for (c in 'z' downTo 's' step 2) { // 2
    print(c)
}
print(" ")
  1. 알파벳 순서로 문자 범위를 반복합니다.
  2. Char 범위는 step 및 downTo도 지원합니다.

범위는 if 문에서도 유용합니다.

val x = 2
if (x in 1..5) {            // 1
    print("x is in range from 1 to 5")
}
println()

if (x !in 6..10) {          // 2
    print("x is not in range from 6 to 10")
}
  1. 값이 범위에 있는지 확인합니다.
  2. !in은 in의 반대입니다.

동일성 확인 (Equality Checks)

Kotlin은 구조적 비교를 위해 ==를 사용하고 참조 비교를 위해 ===를 사용합니다.

더 정확하게 말하면, a == b는 if (a == null) b == null else a.equals(b)로 컴파일됩니다.

val authors = setOf("Shakespeare", "Hemingway", "Twain")
val writers = setOf("Twain", "Shakespeare", "Hemingway")

println(authors == writers)   // 1
println(authors === writers)  // 2
  1. Authors.equals(writers)를 호출하고 요소 순서 무시를 설정하기 때문에 true를 반환합니다.
  2. authors와 writers가 별개의 참조이므로 false를 반환합니다.

조건 표현식 (Conditional Expression)

Kotlin에는 삼항 연산자가 없습니다.(condition ? then : else) 대신 if를 표현식으로 사용할 수 있습니다.

fun max(a: Int, b: Int) = if (a > b) a else b         // 1

println(max(99, -42))
  1. if는 여기에서 값을 반환하는 표현식입니다.