이 프로그램을 실행하면 다음과 같은 결과를 콘솔에서 볼 수 있다.

    Total price: 1.9
    Total weight: 13.5

    실행은 잘 되지만 결과는 틀렸다! 오류가 당연하지만 문제는 컴파일러가 그 오류에 대해 경고하지 않았다는 점이다(Store 코드를 살펴보면 오류를 찾을 수 있다). 하지만 이와 똑같은 오류를 Product로 만들 때 저지를 수 있고, Product 생성이 아주 먼 곳에서 이루어질 수도 있다.

    이런 오류를 잡아내는 유일한 방법은 프로그램을 테스트하는 것이지만 테스트가 프로그램의 올바름을 증명하지는 못한다. 테스트는 단지 다른 프로그램(이 프로그램도 역시 잘못될 수 있다)을 작성해서 여러분의 프로그램이 올바르지 못함을 증명할 수 있을 뿐이다. 문제를 발견하지 못한 독자를 위해 어디가 잘못됐는지 알려주자면 문제가 있는 부분은 다음 두 줄이다.

    val weight = orderLines.sumByDouble { it.amount() }
    val price = orderLines.sumByDouble { it.weight() }

    가격과 무게를 바꿔 썼다. 두 값 모두 Double 타입이기 때문에 컴파일러가 이 오류를 알 수 없었다.

    Note≡

    모델링을 배운 독자라면 ‘클래스 하나에는 타입이 같은 프로퍼티가 여럿 들어가서는 안 된다’라는 오래된 규칙을 기억할 것이다. 클래스 안에는 특정 타입의 프로퍼티가 하나만 있고 관계 차수(cardinality)만 달라야 한다. 여기서 이 말은 Product 안에는 Double 타입의 프로퍼티가 있고 그 프로퍼티의 관계 차수가 2여야 한다는 뜻이다. 이런 식의 접근이 본문에서 다뤘던 문제를 해결하는 올바른 방법은 아니지만 규칙 자체는 기억해둘 만한 가치가 있다. 여러분이 객체를 모델링하면서 같은 타입의 프로퍼티가 여럿 들어 있는 클래스를 만들었다면 아마도 설계를 잘못했을 가능성이 크다.

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