combine 함수는 자신이 속한 클래스의 creditCard와 amount 필드에 접근한다. 따라서 이 함수를 클래스나 동반 객체 밖으로 빼낼 수 없다. 이 함수는 자신을 둘러싸고 있는 클래스의 인스턴스를 암시적 파라미터로 받는다. 이 파라미터를 명시하게 만들면 combine 함수 정의를 패키지 수준이나 동반 객체 안에 위치시킬 수 있다.
fun combine(payment1: Payment, payment2: Payment): Payment = if (payment1.creditCard == payment2.creditCard) Payment(payment1.creditCard, payment1.amount + payment2.amount) else throw IllegalStateException("Cards don't match.")
동반 객체나 패키지 수준에서 함수를 정의하면 함수를 둘러싸는 영역의 변수에 예기치 않게 접근하는 일을 막을 수 있다. 하지만 이 때문에 함수를 사용하는 방식이 달라진다. 클래스 안에서 이 함수를 사용하려면 this 참조를 넘겨야 한다.
val newPayment = combine(this, otherPayment)
차이는 그리 크지 않다. 하지만 함수를 합성하면 큰 차이가 생긴다. 여러 지급을 합쳐야 하는 경우를 인스턴스 함수로 작성하면 다음과 같이 만들 수 있다.
fun combine(payment: Payment): Payment = if (creditCard == payment.creditCard) Payment(creditCard, amount + payment.amount) else throw IllegalStateException("Cards don't match.")