더북(TheBook)

3.2.5 객체 표기법과 함수 표기법 비교

앞 절에서 클래스 인스턴스의 프로퍼티에 접근하는 인스턴스 함수를 해당 클래스의 인스턴스를 암시적 파라미터로 받는 것으로 생각할 수 있다고 했다. 자신이 들어 있는 클래스 인스턴스에 접근하지 않는 함수는 해당 클래스 밖으로 빼내도 안전하다. 이런 함수를 동반 객체 안에 넣을 수 있고(동반 객체에 들어가는 함수를 자바의 정적 메서드와 같다고 봐도 된다), 아예 어느 클래스에도 속하지 않도록 패키지 수준에 넣어도 된다. 그리고 클래스 인스턴스를 명시적으로 파라미터로 받게 만들면 클래스 인스턴스의 프로퍼티에 접근하는 함수를 동반 객체나 패키지 수준에 넣을 수 있다. 1장에서 본 Payment 클래스를 생각해 보자.

class Payment(val creditCard: CreditCard, val amount: Int) {
    fun combine(payment: Payment): Payment =
        if (creditCard == payment.creditCard)
            Payment(creditCard, amount + payment.amount)
        else
            throw IllegalStateException("Cards don't match.")

    companion object {
        fun groupByCard(payments: List<Payment>): List<Payment> =
            payments.groupBy { it.creditCard }
                    .values
                    .map { it.reduce(Payment::combine) }
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.