아래의 글은 드미트리 제메로프, 스베트라나 이사코바 저/오현석역,『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 |