더북(TheBook)

타입은 유효성 증명을 넘겨줄 수 있다. 게시물 식별자를 위한 정수 값이나 사용자 이름을 위한 문자열 값을 전달하는 대신 생성 단계에서 입력을 검증하는 클래스나 구조체를 전달할 수 있기 때문에 유효하지 않은 값이 포함되는 것은 불가능하다. 이는 간단한 것 같지만 강력하다. 매개변수로 포스트 식별자를 받는 함수는 정수 대신 PostId라는 클래스를 요구한다. 이렇게 하면 생성자가 먼저 유효성 검사를 한 후에 유효성 증명을 그대로 전달한다. 이때 정수일 경우에는 유효성 검사를 다시 해야 하지만, PostId인 경우에는 이미 유효성 검사를 통과한 상태가 된다. 다음 코드에서 볼 수 있듯이 유효성 검사를 거치지 않고는 PostId 객체를 만들 수 없기 때문에 다시 그 내용을 확인하지 않아도 된다. 코드에서 PostId를 구성하는 유일한 방법은 생성자를 호출하는 것이다. 생성자는 값의 유효성을 검사하고 유효하지 않으면 예외를 발생시킨다. 즉, 유효하지 않은 PostId 인스턴스를 가질 수 없다.

public class PostId{
    public int Value { get; private set; }    → 외부 코드로 값을 변경할 수 없다.
    public PostId(int id) {    → 이 객체를 생성하려면 반드시 생성자를 사용해야 한다.
        if (id <= 0) {
            throw new ArgumentOutOfRangeException(nameof(id));
        }
        Value = id;
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.