본문 바로가기

Kotlin

Kotlin - 조건문

https://kotlinlang.org/docs/control-flow.html

 

Conditions and loops | Kotlin

 

kotlinlang.org

 

If 표현식 (expression)

Kotlin에서 if 는 표현식 이기 때문에 값을 반환하고, 3항 연산자(condition ? then : else)가 존재하지 않는다.

val a = 5
val b = 10

var max = a
if (a < b) max = b
println("Max value is $max")

if (a > b) {
    max = a
} else {
    max = b
}
println("Max value is $max")

// 표현 식 으로서의 if
max = if (a > b) a else b
println("Max value is $max")

// else if도 표현식 으로 사용 가능
val maxLimit = 1
val maxOrLimit = if (maxLimit > a) maxLimit else if (a > b) a else b
println("Max value is $maxOrLimit")

if 문의 코드 작성 부분은 괄호로 블록 처리 할 수 있다. 블록처리 한 경우 가장 마지막 표현식이 if 문의 값으로 처리 된다. 

if가 표현식으로 사용되어 변수에 할당하는 경우에는 else 부분이 반드시 작성 되어야 한다.

val a = 5
val b = 10

// else 문이 없는 경우 에러가 발생한다.
val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

println("Max value is $max")

 

When 표현식 (expression)

when 은 복수의 분기 조건식을 정의 할 때 사용한다. 다른 언어의 switch와 비슷하다.

val x = 2

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

when은 조건을 만족시키는(true) 분기를 찾을때 까지 차례대로 분기를 순회 한다. 조건을 만족시키는 분기를 찾지 못한 경우 else가 처리 된다.

구문, 표현식 모두 사용가능하다. 표현식으로 사용되는 경우 처음 조건을 만족시키는 분기의 값이 표현식의 값으로 대표 된다. 구문으로 사용되는 경우에는 각 분기의 값들은 무시 된다. if와 마찬가지로 각 분기는 블록으로 처리 할 수 있으며, 블록의 가장 마지막 표현식이 해당 블록의 값으로 간주 된다.

when이 표현식으로 사용되는 경우 else를 필수로 작성 해야 한다. 하지만 Boolean이나, enum, sealed 클래스의 서브 타입 처럼 제한된 조건들을 모두 커버하는 경우는 else를 작성하지 않아도 된다.

enum class Bit {
    ZERO, ONE
}
fun whenExpression2() {
    val b: Bit = Bit.ONE

    val numericValue = when (b) {
        Bit.ZERO -> 0
        Bit.ONE -> 1
        // 모든 경우를 커버하기 때문에 else가 필요 없다.
    }

    val isZero = when (b) {
        Bit.ZERO -> true
        else -> false // 모든 경우를 커버지 않는경우 enum 타입이라도 else가 필요하다.
    }

    val isOverZero = when (numericValue) {
        0 -> false
        1 -> true
        else -> true // else 가 없으면 에러가 발생한다.
    }
}

하나의 분기에 여러 조건을 작성 하고 싶은 경우 콤마로 조건들을 조합 할 수 있다.

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

조건 부 에는 단순 상수 뿐만 아니라 임의의 표현식을 작성 할 수도 있다.

when (x) {
    s.toInt() -> print("s encodes x")
    else -> print("s does not encode x")
}

in, !in 을 사용해서 range 에 포함이 되는지 안되는지를 확인 할 수 있다.

val x = 2
when (x) {
    in 1..10 -> print("x is in the range")
    !in 10 ..20 -> print("x is outside the range")
    else -> print("none of the above")
}
// x is in the range

is, !is 를 사용해서 특정 타입 여부를 확인 할 수 있다. 이 경우 스마트 형 변환 이 이루어 진다.

fun whenExpression6(x: Any) = when(x) {
    is String -> x.startsWith("prefix") // 스파트 형 변환 (smart cast) 으로 x 는 String 타입으로 처리 된다.
    else -> false
}

when에서 값을 변수로 할당해서 처리 할 수 도 있다. when 에서 할당한 변수는 when 구문 내에서만 유효하다.

// 처리 결과를 response 에 할당한다.
fun Request.getBody() = when (val response = executeRequest()) {
    is Success -> response.body // 처리 결과가 Success 타입이면 처리 결과의 body 를 반환하고
    is HttpError -> throw HttpException(response.status) // 처리 결과가 HttpError 이면 예외를 발생 시킨다.
}

 

반응형

'Kotlin' 카테고리의 다른 글

Kotlin - Returns and jumps  (0) 2024.01.11
Kotlin - 반복문(for, while)  (0) 2024.01.10
Kotlin - 타입체크와 형 변환  (0) 2024.01.06
Kotlin - 데이터 타입 (배열)  (0) 2024.01.01
Kotlin - 데이터 타입 (Character, String)  (0) 2023.12.31