더북(TheBook)

operator 키워드는 이 함수를 중위(infix) 연산자 위치에 사용할 수 있다는 뜻이다. 더 나아가 plus라는 이름의 함수를 정의하면 다음과 같이 + 기호를 사용해 이 함수를 대신할 수 있다.

val totalPrice = Price(1.0) + Price(2.0)

곱셈도 필요하다. 하지만 곱셈의 경우는 약간 다르다. 덧셈은 같은 타입의 객체 사이에 이뤄지지만 곱셈은 한 타입의 객체에 수를 곱한다. 따라서 타입을 중심으로 생각할 때 곱셈은 교환 법칙이 성립하지 않는다. 예를 들어 PriceInt의 곱은 Price 클래스 안에 정의할 수 있지만, IntPrice의 곱을 Price 클래스 안에 정의할 수 없다. 다음은 PriceInt의 곱셈을 Price 안에 정의한 모습을 보여준다.

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

    operator fun times(num: Int) = Price(this.value * num)
}

이제는 더 이상 sumByDouble을 사용해 Price 리스트의 합계를 계산할 수 없다. sumByDouble과 비슷한 방식으로 sumByPrice라는 함수를 정의할 수 있다. 관심이 있는 독자는 sumByDouble의 구현을 살펴보고 이를 Price에 적용할 수도 있을 것이다. 하지만 더 좋은 방법이 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.