공유하면 안되는 객체를 공유하고, 그 값을 변경하면 다른 객체도 값이 변경되어 버린다.
그런데, 사이드 이펙트의 원인을 생각해보면 객체를 공유하는 것 자체가 문제가 되지는 않는다.
다만, 직접적인 원인은 공유된 객체의 값을 변경했기 때문이다.
Address a = new Address("서울");
Address b = a;
현재 a와 b는 같은 인스턴스를 참조하고 있다.
b의 인스턴스를 부산으로 변경한다고 가정해보자.
처음에는 b = a를 이용해서 Address 인스턴스를 같이 참조하는 것이 메모리 절약과 성능상 효율적이다.
b의 address를 부산으로 변경할 경우 a의 주소도 같이 변경이 되어 버린다.
다만, 자바에선 여러 참조형 변수가 하나의 객체(인스턴스)를 참조하는 것을 막을 수 없다.
만약 Address의 객체의 값을 변경하지 못하게 했다면 사이드 이펙트는 발생하지 않을 것이다.
객체의 상태(필드)가 변하지 않는 객체를 불변객체라고 한다.
package lang.imutable.address;
public class ImmutableAddress {
private final String value;
public ImutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
}
불변객체를 만드는 법은 매우 간단하다.
필드의 값을 변경하지 못 하도록 막으면 된다.