when, 스마트 캐스팅

박상훈·2023년 7월 20일
0

when 예제

when 기본 사용법

// when 예제
// when 기본 사용법
fun exValueInWhen(age: Int): String {
    return when (age) {
        10 -> "10살 입니다."
        19 -> "19살 입니다."
        else -> "성인 입니다."
    }
}

when 에 인자가 없는 경우
각 분기의 조건이 true 또는 false 를 리턴하는 식을 이용하여 사용 가능

fun exWithoutParameterWhen(age: Int): String {
    return when {
        age == 10 -> "10살 입니다."
        age == 19 -> "19살 입니다."
        else -> "성인 입니다."
    }
}

식(When)이 본문인 함수
리턴 타입, 리턴 키워드, 로직 선언 바디 {} -> = 으로 변경

fun exWithoutReturnValueInWhen(age: Int) =
    when (age) {
        10 -> "10살 입니다."
        19 -> "19살 입니다."
        else -> "성인 입니다."
    }

enum class 를 when 으로 분기

enum class AgeGroup { 
	TEENS, 
    TWENTIES, 
    THIRTIES, 
    FORTIES, 
    FIFTIES, 
    SIXTIES, 
    SEVENTIES, 
    EIGHTIES, 
    NINETIES 
}

enum class 안에 모든 값을 분기로 설정했을 때

fun exEnumAllValueInWhen(ageGroup: AgeGroup): String {
    return when(ageGroup) {
        AgeGroup.TEENS -> "십대 입니다."
        AgeGroup.TWENTIES -> "이십대 입니다."
        AgeGroup.THIRTIES -> "삼십대 입니다."
        AgeGroup.FORTIES -> "사십대 입니다."
        AgeGroup.FIFTIES -> "오십대 입니다."
        AgeGroup.SIXTIES -> "육십대 입니다."
        AgeGroup.SEVENTIES -> "칠십대 입니다."
        AgeGroup.EIGHTIES -> "팔십대 입니다."
        AgeGroup.NINETIES -> "구십대 입니다."
    }
}

enum class 안에 모든 값을 분기로 설정하지 않았을 때, else 추가

fun exEnumSomeValueInWhen(ageGroup: AgeGroup): String {
    return when(ageGroup) {
        AgeGroup.TEENS -> "십대 입니다."
        AgeGroup.TWENTIES -> "이십대 입니다."
        else -> "삼십대 이상입니다."
    }
}

when 으로 타입 검사를 진행하는 경우

interface Parent
class FirstChild: Parent
class SecondChild: Parent
fun exTypeCheckInWhen(parent: Parent): String {
    return when (parent) {
        is FirstChild -> "첫 번째 자식 클래스입니다."
        is SecondChild -> "두 번째 자식 클래스입니다."
        else -> "저는 남의 자식입니다."
    }
}

명시적인 타입 캐스팅 없이 캐스팅 된 객체의 함수를 호출할 수 있음.

interface Car { fun move() }
class Mohave: Car {
    override fun move() = println("모하비 차가 멋지게 지나갑니다.")
}
class Wrangler: Car {
    override fun move() = println("랭글러 차는 그냥 존재가 멋집니다.")
}
fun exSmartCase(car: Car) {
    if (car is Mohave) {
        car.move()
    }
    else if(car is Wrangler) {
        car.move()
    }
    else {
        println("차가 아닙니다.")
    }
}
profile
엔지니어

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 유익한 글이었습니다.

답글 달기