더북(TheBook)

이런 목적으로 별도로 Purchase 클래스를 만드는 대신 더 일반적인 Pair 클래스를 쓸 수도 있다. Pair 클래스는 그 내부에 저장할 두 값의 타입(앞의 예에서는 DonutPayment)으로 파라미터화된 타입(parameterized type)이다. 코틀린은 두 값을 표현하는 Pair 외에 세 값을 표현하는 Triple이라는 클래스도 제공한다. 자바 같은 언어에 PairTriple 같은 클래스가 있다면 유용할 것이다. 왜냐하면 Purchase와 같은 클래스를 정의하려면 생성자(constructor), 게터(getter), 세터(setter), 그리고 어쩌면 equals, hashCode 메서드와 toString 메서드까지 작성해야 할 수도 있기 때문이다. 코틀린에서는 다음과 같이 단 한 줄로 Purchase를 만들 수 있어 Pair와 같은 클래스의 효용 가치가 좀 떨어진다.

class Purchase(val donut: Donut, val payment: Payment)

Purchase 클래스에는 생성자와 게터를 명시적으로 정의할 필요가 없다. 클래스 앞에 data 키워드를 추가하면 코틀린이 자동으로 equals, hashCode, toString, copy 메서드를 구현해 준다. 하지만 코틀린이 제공하는 기본 구현을 받아들일 때만 이런 식으로 간단하게 사용할 수 있다. 한 데이터 클래스의 두 인스턴스 객체는 모든 프로퍼티가 일치할 때만 서로 동등하다. 만약 기본 구현이 제공하는 것과 다른 성질이 필요하다면 직접 함수를 오버라이드(override)해서 여러분이 원하는 구현으로 바꿔야 한다.

fun buyDonut(creditCard: CreditCard): Purchase {
    val donut = Donut()
    val payment = Payment(creditCard, Donut.price)
    return Purchase(donut, payment)
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.