정리

자바로 작성한 클래스는 시스템의 다른 부분에서 무슨짓을 하든 그 불변식이 지켜진다. 메모리 전체를 하나의 거대한 배열로 다루는 언어에서는 누릴수 없는 강점이다. 하지만 아무리 자바라 해도 다른 클래스로부터의 침범을 아무런 노력없이 다막을 수 있는 건 아니다. 그러니 클라이언트가 여러부느의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍을 해야한다. Date 는 낡은 api 이니 새로운 코드를 작성할 때는 더이상 사용하면 안된다. 외부 공격으로부터 Period 인스턴스의 내부를 보호하려면 생성자에서 받은 가변 매개변수 각각을 방어적으로 복사해야 한다. 매개변수의 유효성을 검사하기 전에 방어적 복사본을 만들고 이 복사본으로 유혀성을 검사한 점에 주목하자. 매개변수가 제3자에 의해 확장될 수 있는 타입이라면 방어적 복사본을 만들때 clone 을 사요해서는 안된다.

핵심정리

클래스가 클라이언트로부터 받는 혹은 클라이언트로 반환하는 구성요소가 가변이라면 그요소는 반드시 방어적으로 복사해야 한다. 복사 비용이 너무 크거나 클라이언트가 그 요소를 잘못 수정할 일이 없읆을 신뢰한다면 방어적 복사를 수행하는 대신 해당 구성요소를 수정했을때의 책임이 클라이언트에 있음을 문서에 명시하도록하자.