방어적으로 프로그래밍하라 항상 우리는 클라이언트가 우리의 불변식을 깨뜨리려고 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. 아래와 같은 클래스를 불변식으로 만들려고 의도하고 코드를 작성하였다고 해보자. 위 클래스는 불변인가? 그렇지 않다. 기본적으로 final은 기본형인 int와 같은 타입은 변경이 불가능하도록 한다. 하지만 Date와 같은 가변 클래스는 변경이 가능하게 된다. 그 말인 즉슨 Date를 final로 선언하여도 Date 내부의 값을 변경할 수 있다는 뜻이다. 이러한 이유로 Date보다는 자바 8 이후에 등장한 Java.time.Instant나, LocalDateTIme과 같은 불변으로 정의된 클래스를 사용하는 것이 좋다. 하지만 현재 위 코드의 상태로 클라이언트로부터 Peri..