공유 참조와 사이드 이펙트

사이드 이펙트(Side Effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다. 앞서 b 의 값을 부산으로 변경한 코드를 다시 분석해보자.

b.setValue("부산"); //b의 값을 부산으로 변경해야함
System.out.println("부산 -> b");
System.out.println("a = " + a); //사이드 이펙트 발생
System.out.println("b = " + b);

스크린샷 2025-03-11 오전 11.06.49.png

b.setValue(”부산”)

이렇게 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 사이드 이펙트라 한다. 프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용되는데, 사이드 이펙트는 프로그램의 특정 부분에서 발생한 변경이 의도치 않게 다른 부분에 영향을 미치는 경우에 발생한다. 이로 인해 디버깅이 어려워지고 코드의 안정성이 저하될 수 있다.

사이드 이펙트 해결 방안

생각해보면 문제의 해결방안은 아주 단순하다. 다음과 같이 ab 가 처음부터 서로 다른 인스턴스를 참조하면 된다.

Address a = new Address("서울");
Address b = new Address("서울");

코드를 작성해보자

  package lang.immutable.address;
  
  public class RefMain1_2 {
		  public static void main(String[] args) {
					Address a = new Address("서울");
					Address b = new Address("서울");
					System.out.println("a = " + a);
					System.out.println("b = " + b);

					b.setValue("부산");
					System.out.println("부산 -> b");
					System.out.println("a = " + a);
					System.out.println("b = " + b);

		}
}

a = Address{value='서울'}
b = Address{value='서울'}
부산 -> b
a = Address{value='서울'}
b = Address{value='부산'}

실행결과를보면 b 의 주소값만 부산으로 변경된 것을 확인할 수 있다.

ab 는 서로 다른 Address 인스턴스를 참조한다.