문제

Rewrite the following Java code using smart casts and the when expression:

public int eval(Expr expr) {
    if (expr instanceof Num) {
        return ((Num) expr).getValue();
    }
    if (expr instanceof Sum) {
        Sum sum = (Sum) expr;
        return eval(sum.getLeft()) + eval(sum.getRight());
    }
    throw new IllegalArgumentException("Unknown expression");
}
fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> TODO()
            is Sum -> TODO()
            else -> throw IllegalArgumentException("Unknown expression")
        }

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> expr.value
            is Sum -> eval(expr.left) + eval(expr.right)
            else -> throw IllegalArgumentException("Unknown expression")
        }

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

풀이

스마트 캐스트와 when을 활용하여 자바 코드를 코틀린으로 변경하는 문제이다.

Smart cast

  • is 연산자를 이용해 타입을 확인할 때 만약 특별한 타입으로 확인되면 명시적으로 타입 캐스팅 형
    변환)을 하지 않아도 자동으로 캐스팅된다.

자바코드를 보면

exprNum 클래스인 경우 exprNum으로 형변환 해주고 value를 반환한다.

exprSum 클래스인 경우 exprSum 객체로 캐스팅한 후, 왼쪽과 오른쪽 표현식을 각각 eval 메서드에 다시 넣어서 결과 반환받고 더해서 최종적으로 더한 값을 반환한다.

이러한 자바코드를 코틀린 코드로 변경할 때 스마트 캐스트 is람다식을 활용해서 작성해주면 된다.

expr instanceof Num으로 타입을 확인해주고 내부에서 (Num) expr 명시적으로 형변환을 해주던 코드는

is 연산자를 통해서 자동으로 캐스팅되어 형변환 될 수 있다.

profile
개발하는 다람쥐

0개의 댓글