Kotlin Examples > Control Flow

HH·2022년 3월 2일
0

Kotlin Examples

목록 보기
2/8

작성완료: 2022-03-02

When


널리 사용되는 switch 구문 대신, 코틀린은 더 유연하고 클리어한 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. obj1과 같은지 확인한다.
  3. objHello와 같은지 확인한다.
  4. 타입 체크를 수행한다.
  5. 역 타입 체크를 수행한다.
  6. 디폴트 문 (생략 가능).

하나가 만족될 때 까지 모든 브랜치 컨디션이 순차적으로 체크된다는 것에 주의하자. 즉 오직 가장 처음 들어맞는 브랜치만 실행된다.


When expression


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. obj1과 같을 경우 값을 one으로 지정한다.
  3. objHello와 같을 경우 값을 1로 지정한다.
  4. objLong 인스턴스일 경우 값을 false로 지정한다.
  5. 선행 조건이 아무것도 충족되지 않을 경우 42로 값을 지정한다. when 문과 달리, 디폴트 브랜치는 일반적으로 when 표현식에서는 필수적이다. 컴파일러가 다른 브랜치들이 가능한 모든 케이스를 커버한다고 확인할 수 있는 경우만 예외이다.

Loops


코틀린은 일반적으로 사용되는 모든 루프를 지원한다: for, while, do-while


for


코틀린의 for은 대부분의 언어와 같은 방식으로 동작한다.

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

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

while and do-while


whiledo-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. 조건이 true인 동안 블록을 실행한다.
  2. 첫 블록을 실행하고 컨디션을 체크한다.

Iterators


iterator 연산자를 클래스 내부에 구현함으로써 이터레이터를 정의할 수 있다.

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를 리턴한다.
    • next() : Animal
    • hasNext() : Boolean
  3. zoo의 animals를 사용자 정의 iterator를 사용해 루프한다.

이터레이터는 확장 함수로써, 또는 타입에 선언할 수 있다.


Ranges


코틀린에서 range를 정의하기 위해 사용하는 도구 모음이다. 짧게 살펴보자.

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(" ")
  1. 0에서 3까지(3 포함)인 범위를 순회한다. 다른 언어(C/C++/Java)의 for(i=0; i<=3; ++i)와 같다.
  2. 0에서 3까지(3 제외)인 범위를 순회한다. 다른 언어(C/C++/Java)의 for(i=0; i<3; ++i)나 python의 루프와 같다.
  3. 연속적인 요소들을 지정한 증가 step으로 순회한다.
  4. 역순으로 범위를 순회한다.

char range 또한 지원된다:

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

for (c in 'z' downTo 's' step 2) { // 2
    print(c)
}
print(" ")
  1. 알파벳 순서로 char range를 순회한다.
  2. char range는 stepdownTo 또한 지원한다.

범위는 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. !inin의 반대이다.

Equality Checks


코틀린은 구조적 비교(structural comparison)에 ==를 사용햐고 참조적 비교(referential comparison)에 ===를 사용한다.

더 정확하게는, a == bif (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)를 호출하고 set은 원소 순서를 무시하므로 true를 반환한다.
  2. authorswriters가 별개의 참조이므로 false를 반환한다.

Conditional Expression


코틀린에는 삼항연산자 condition ? then : else가 없다. 그 대신 if가 표현문으로 사용될 수 있다:

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

println(max(99, -42))

0개의 댓글