패턴에 따라 동작을 수행하는 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 아톰은 여기서 마치겠다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
| [Atomic 35 ] 데이터 클래스 (feat. data class 클래스명) (0) | 2024.02.07 |
|---|---|
| [Atomic 34] 이넘(feat. Enum) (0) | 2024.02.06 |
| [Atomic 32] 오버로딩 (feat. overloading) (1) | 2024.02.05 |
| [Atomic 31] 이름 붙은 인자와 디폴트 인자 (0) | 2024.02.05 |
| [Atomic 30] Extension function (feat. 확장 함수) (7) | 2024.02.01 |