더북(TheBook)

이런 문제를 피하려면 어떻게 해야 할까? 먼저, 가격과 무게는 숫자가 아니라는 점을 깨달아야 한다. 상품 수량은 숫자일 수 있지만 가격은 금액 단위의 수량이고, 무게는 무게 단위의 수량이다. 절대로 킬로그램과 원을 서로 더하는 상황이 생겨서는 안 된다.

 

값 타입 정의하기

이런 문제를 피하려면 값 타입을 사용해야만 한다. 값 타입(value type)은 값을 표현하는 타입을 말한다. 가격을 표현하는 값 타입을 다음과 같이 정의할 수 있다.

data class Price(val value: Double)

무게를 표현하는 클래스도 같은 방식으로 정의할 수 있다.

data class Weight(val value: Double)

하지만 다음과 같이 쓸 수 있다면 이런 타입을 도입해도 문제가 사라지지 않는다.

val total = price.value + weight.value

필요한 것은 PriceWeight에 대한 덧셈을 정의하는 것이다. 함수를 사용해 각 클래스에 속한 객체 간의 덧셈을 정의할 수 있다.

data class Price(val value: Double) {
    operator fun plus(price: Price) = Price(this.value + price.value)
}

data class Weight(val value: Double) {
    operator fun plus(weight: Weight) = Weight(this.value + weight.value)
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.