자바의 데이터 타입을 가장 크게 보면 기본형(Primitive Type)과 참조형(Reference Type)으로 나눌 수 있다.
하나의 값을 공유하거나 또는 공유하지 않는다는 것이 무슨 뜻인지 모르겠으면 이 링크의 글을 읽어보자
사이드 이펙트(Side Effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다.
Address
public class Address {
private String value;
public Address(String value) {
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Main
Address a = new Address("서울");
Address b = a;
b.setValue("부산");
System.out.println("부산 -> b");
System.out.println("a = " + a); //사이드 이펙트 발생
System.out.println("b = " + b);
실행 결과
부산 -> b
a = Address{value='부산'}
b = Address{value='부산'}
개발자는 b
의 주소값을 서울에서 부산으로 변경할 의도로 값 변경을 시도했다. 하지만 a, b
는 같은 인스턴스를 참조한다. 따라서 a
의 값도 함께 부산으로 변경되어 버린다.
이렇게 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 사이드 이펙트라 한다. 프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용되는데, 사이드 이펙트는 프로그램의 특정 부분에서 발생한 변경이 의도치 않게 다른 부분에 영향을 미치는 경우에 발생한다. 이로 인해 디버깅이 어려워지고 코드의 안정성이 저하될 수 있다.
문제의 해결방안은 아주 단순하다. a
와 b
가 처음부터 서로 다른 인스턴스를 참조하면 된다.
Address a = new Address("서울");
Address b = new Address("서울");