아래의 글은 드미트리 제메로프, 스베트라나 이사코바 저/오현석역,『Kotlin in Action』,에이콘출판사(2017)의 내용을 기반으로 작성하였습니다.

 

( 1 + 2 ) + 4 같은 산술식을 계산하는 함수

 

interface Expr

class Num(val value: Int): Expr

class Sum(val left: Num, val right: Num): Expr

// (1 + 2) + 4
Sum(Sum(Num(1), Num(4)), Num(4))

 

1. 식은 트리 구조로 저장됨, Num은 노드에서 말단, Sum 은 자식 둘 있는 중간 노드, Sum의 두 자식은 덧셈의 인자

2. Expr 인터페이스 구현

3. class 뒤의 : Expr은 인터페이스 구현 한다는 의미 ( fun의 뒤의 : returnType 은 리턴값이다. class 뒤의 인터페이스 구현은 좀 이상하지 않는가 라고 생각했는데, java에서도 a implements Expr, b implements Expr , class Sum 의 메소드는 public Expr sum(Int a, Int b) 뭐 이런깃으로 표현을 하는데 즉, interface 구현은 즉 상위 구현체의 리턴으로 upcasting 된 것을 의미하므로 return type이자 interface의 구현이기 때문이라고 표현할 수 있으니 결과론 적으로 return type을 inteface로 표현했다는 것은 inteface의 구현이라고 생각할 수 있음, 놀랍군.)

4. 스마트 캐스트는 타입 검사 뒤에 변경 될 수 없는 변수에만 적용 가능하다 ( p 148), 즉 final 이여야하는데, 프로퍼티는 기본 final 임

 

// java style

fun eval(e: Expr): Int = 
	if (e is Num) {
    	val n = e is Num
        return n.value
    }
    if (e is Sum) {
    	return eval(e.right) + eval(e.left)
    }
    throw IllegalArgumentException("Unknown expression")

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

eval(sum(Num(1), Num(2)))

// use when expression

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


fun evalWithLogging(e: Expr): Int = 
	when(e) {
    	is Num -> {
        	println("Num: ${e.value}")
            e.value
        }
        is Sum -> {
        	val left = evalWithLogging(e.left)
            val right = evalWithLogging(e.right)
            print("sum: ${left} + ${right}")
            left + right
        }
        else -> throw IllegalArgumentException("Unknown expression")
    }
    

 

 

 

 

'독서관련 > Kotlin in Action' 카테고리의 다른 글

CH02 코틀린기초 - 맵이터레이션  (0) 2021.01.01
CH02 코틀린 기초 - loop  (0) 2021.01.01
CH02 코틀린 기초  (0) 2020.12.28
CH00 kotlin useful info  (0) 2020.12.27
CH01 코틀린이란 무엇이며, 왜 필요한가?  (0) 2020.12.27

+ Recent posts