본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 33] When 식

패턴에 따라 동작을 수행하는 When

 

 

아톰 7에서 학습했던 if문을 대신할 수 있는 when 식에 대해 오늘 아톰에서 학습할 예정이다.

if문 보다 when 식의 활용을 더 권장한다고 하는데 어떻게 쓰이고 왜 더 나은지 알아보자.

 


 

[ When ]

when

: 어떤 값을 여러가지 가능성과 비교해 선택

when(비교대상){
	비교대상 값1 -> 결과식1
   	비교대상 값2 -> 결과식2
    ...
    else -> 결과식n
}

 

: 위와 같이 when(비교대상; 임의의 식이 올 수도 있음)이 오고 그 뒤에 값과 일치할 수 있는 여러 매치가 있는 본문 오는 형태

: 매치 다음의 화살표 -> 사이에는 공백이 없어야 함

: else가 없을 경우 컴파일 오류가 발생하며, when 식을 문처럼 취급하는 경우에만 else 생략 가능

: 결과식에 중괄호({})는 '아무일도 일어나지 않음'을 표현

: when 식과 if 식의 기능이 겹치는 부분이 존재하나, when식이 유연하기 때문에 when 사용을 권장

: when 뒤에 비교대상(인자)를 취하지 않는 형태의 경우 각 매치 가지를 Boolean 조건에 따라 검사

 

 

[ 기본 when ]

import atomictest.*

class Coordinates {
	var x: Int = 0
    	set(value) {
			trace("x gets $value")
			field = value
        }
	var y: Int = 0 
    	set(value) {
			trace("y gets $value")
			field = value
        }
	override fun toString() = "($x, $y)"
}

fun processInputs(inputs: List<String>) {
	val coordinates = Coordinates()
	for (input in inputs) {
		when (input) {
        	"up", "u" -> coordinates.y--
            "down", "d" -> coordinates.y++
            "left", "1" -> coordinates.x--
            "right", "r" -> {
                trace("Moving right")
                coordinates.x++
            }
            "nowhere" -> {}
            "exit" -> return
            else -> trace("bad input:$input")
       }
   }
}

fun main() {
	processlnputs(list0f("up", "d", "nowhere","left", "right", "exit", "r"))
    trace eq """
    	y gets -1
		y gets 0
		x gets -1
        Moving right
        x gets 0
    """
}

 

: 결과식에 중괄호({})는 '아무일도 일어나지 않음'을 표현

 

 

[ 인자를 취하지 않는 when ]

import atomictest.eq

fun bmiMetricOld(
	kg: Double,
    heightM: Double
):String {
	val bmi = kg / (heightM * heightM)
    return if (bmi < 18.5) "Underweight"
    else if (bmi < 25) "Normal weight"
	else "Overweight"
}

fun bmiMetricWithWhen(
	kg: Double,
	heightM: Double
):String {
	val bmi = kg / (heightM * heightM)
    return when {
		bmi < 18.5 -> "Underweight"
        bmi < 25 -> "Normal weight"
        else -> "Overweight"
    }
}

fun main() {
	bmiMetric01d(72.57, 1.727) eq
		bmiMetricWithWhen(72.57, 1,727)
}

 

: when 내의 본문에 따라 각 가지에서의 T/F인 Boolean 조건에 따라 검사 진행

 

 


 

[ 오늘의 학습 소감 ]

 

오늘은 when 식에 대해서 학습을 했다. 자바로 코딩을 할 때 switch ~ case 보다는 if문을 많이 쓰는데, 코틀린에서는 when이 if문 보다 더 유연하게 작용한다는 사실을 아니, when에 익숙해져야겠다는 생각이 들었던 학습 아톰이었다. if문과 크게는 다르지 않기 때문에 금방 적용할 수 있을 것이라는 생각과 함께 when 아톰은 여기서 마치겠다.