12장. 드디어, 더하기
우선 간단한 예인 $끼리의 덧셈부터 시작해보자.
@kotlin.test.Test
fun testSimpleAddition() {
val sum = Money.dollar(5).plus(Money.dollar(5))
assertEquals(Money.dollar(10), sum)
}
위 테스트를 통과하기 위한 구현은 어떻게 구현할지가 명확하므로 바로 구현하자.
fun plus(addend: Money): Money {
return Money(amount + addend.amount, currency)
}
다중 통화 연산을 어떻게 표현해야 할까?
편하게 여러 환율을 표현할 수 있으면서도 산술 연산 비슷한 표현들을 여전히 산술 연산처럼 다룰 수 있는 해법이 있으면 좋을 것 같다.
해법은 Money와 비슷하게 동작하지만 사실은 두 Money의 합을 나타내는 객체를 만드는 것이다.
예를 들어 ($2 + 3CHF) x 5 같은 수식이 있다고 해보자. Money를 가장 작은 단위로 볼 수 있다. 연산의 결과로 Expression들이 생기는데, 그 중 하나는 Sum(합)이 될 것이다. 연산이 완료되면 환율을 이용해서 결과 Expression을 단일 통화로 축약할 수 있다.
테스트에 적용해보자.
@kotlin.test.Test
fun testSimpleAddition() {
val five = Money.dollar(5)
val sum: Expression = five.plus(five)
val bank = Bank()
val reduced = bank.reduce(sum, "USD")
assertEquals(Money.dollar(10), reduced)
}
interface Expression
open class Money(var amount: Int, var currency: String) : Expression {
...
fun plus(addend: Money): Expression {
return Money(amount + addend.amount, currency)
}
}
open class Bank {
fun reduce(source: Expression, to: String): Money? {
return null
}
}
테스트가 성공하도록 가짜 구현을 해두자.
open class Bank {
fun reduce(source: Expression, to: String): Money? {
return Money.dollar(10)
}
}
Last modified: 31 January 2024