You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
유효성 검사를 먼저 하는 경우에도 어차피 객체 불변성을 보장하기 위해서는 방어적 복사를 해야 하기 때문
방어적 복사(Defensive Copy)?
객체를 복사할 때 해당 객체가 가변 객체인 경우, 객체의 상태를 수정하는 것이 의도치 않게 다른 객체의 상태를 변경할 수 있는 상황을 방지하기 위한 복사 방식
Serializable 만 구현하면 불변식을 보장할 수 있을까?
→ 아님! readObject 메서드도 생성자만큼이나 주의해야 함
2. 예시와 함께 보기
publicfinalclassPeriod{privatefinalDatestart;privatefinalDateend;/** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발생한다. */publicPeriod(Datestart,Dateend){this.start=newDate(start.getTime());// 가변인 Date 클래스의 위험을 막기 위해 새로운 객체로 방어적 복사this.end=newDate(end.getTime());if(this.start.compareTo(this.end)>0){thrownewIllegalArgumentException(start+" after "+end);}}publicDatestart(){returnnewDate(start.getTime());}publicDateend(){returnnewDate(end.getTime());}publicStringtoString(){returnstart+" - "+end;}// ... 나머지 코드는 생략}
Period 클래스의 생성자에서
start와 end 필드에 대해 방어적 복사를 수행
start와 end 필드를 반환하는 메서드에서도 방어적 복사를 수행
→ start와 end 필드의 참조값이 노출되는 것을 방지하여 불변 객체처럼 동작하도록 하고 있음
하지만, Period 클래스는 여전히 불변식을 보장하지 못함
start와 end 필드가 가변인 Date 클래스의 객체를 참조하고 있기 때문
Period 클래스의 사용자가 start와 end 필드가 참조하는 Date 객체를 수정할 수 있다면, Period 객체의 불변성이 깨질 수 있음
No description provided.
The text was updated successfully, but these errors were encountered: