#8 Kotlin Koans Introduction/Smart casts 해설

1 소개



Kotlin 공식 레퍼런스의 Kotlin Koans/Smart casts의 해설 기사입니다.

Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.

다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!

일단 각자 도전하고 나서 볼 수 있다고 생각합니다

2-1 when 구문



when 구문은 if 구문의 동료와 같으며 조건별로 결과가 분기됩니다.
다음은 when 구문의 예입니다.
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { 
        print("x is neither 1 nor 2")
    }
}

변수 x가 1이면 x == 1가 표시되고 2이면 x == 2가 표시되고, 그렇지 않으면 x is neither 1 nor 2가 표시됩니다.

2-2 스마트 캐스트



cast(캐스트)란 변수(인스턴스)의 형태를 변환시키는 구조를 말합니다.

Java에서는 캐스트를 실행하려면 , 변수명의 전에 ()로 클래스명을 둘러싸 필요가 있습니다.

한편, Kotlin에서는 코드의 컨텍스트를 이해하고 자동으로 캐스트 해줍니다.

이것을 스마트 캐스트라고합니다.

3 Introduction/Smart casts 해설



Kotlin Koans Introduction/Smart casts 의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.

오른쪽의 본문을 보자.

Rewrite the following Java code using 스마트 casts and 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");
}

eval() 함수에 대해 생각해 봅시다.

Java 코드의 instanceof는 오른쪽과 왼쪽이 같으면 true를 취한다는 것을 나타냅니다.

eval() 함수가 인수 expr 을 받아 Num 형인지 Sum 형인지를 판단하고, 형태에 따라 반환값이 변화합니다.

expr이 Num 형일 때는, (Num) expr 로서 Num 형으로 변환해 getValue() 함수를 호출합니다 (이것이 캐스트를 이용한 형태의 변환입니다.).

expr 가 Sum 형일 때는 Sum sum = (Sum) expr 로서 Sum 형으로 변환해 변수에 대입해, getleft() 함수와 getRight() 함수를 호출합니다.

이 Java 코드를 왼쪽의 Kotlin 코드로 다시 작성해 봅시다.
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

Num 클래스에서는 생성자 내에서 value 속성을 정의하고 Sum 클래스 내에서 left와 right를 정의합니다.

또, 조건에 따른 결과의 분기를 when식을 이용해 표현하고 있습니다.

expr이 Num 형인 경우, Java의 코드에서는 getValue() 함수를 사용해 값을 취득하고 있었습니다만,

kotlin의 코드에서는 속성의 값을 그대로 이용하면 되므로 첫 번째 TODO()는
is Num -> expr.value

하면 됩니다.

이때 expr은 조건식에서 Num 형임이 분명하기 때문에 캐스트가 생략되었습니다 (이것은 스마트 캐스트에 의한 형의 변환입니다.).

expr이 Sum 형인 경우, 변수 left와 right를 eval() 함수에 인수로서 건네주면 되므로,
is sum -> eval(expr.left) + eval(expr.right)

하면 됩니다.

4 마지막으로



다음 번은 Kotlin Koans Introducion/Extension functions의 해설을합니다.

좋은 웹페이지 즐겨찾기