Fast Blinking Hello Kitty
 

[📖JAVA] 불변 객체 참조형 변수와 사이드 이펙트

참조형 변수는 하나의 인스턴스를 공유할 수 있다


참조형 변수는 객체의 주소를 참조하기 때문에 여러 변수들이 동일한 객체를 공유할 수 있습니다.

이로 인해 하나의 변수에서 객체의 상태를 변경하면 모든 참조 변수에 영향을 미칠 수 있습니다.

이러한 상태 변경이 예기치 않게 발생할 때 사이드 이펙트라고 부릅니다.

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

System.out.println(a);
System.out.println(b);

b.setValue("부산"); // 값을 바꿨기 때문에
System.out.println(a); // 사이드 이펙트 발생!
System.out.println(b);

 

위 코드를 보면 `b = a;` 로 인해 `a`와 `b`는 동일한 주소값을 가진다.
그렇기 때문에 `b`의 값만 바꿨는데도 `a`도 같이 바뀌는 것인데,
이런 현상을 사이드 이펙트가 발생했다고 하는 것이다.

 

단순한 예제에서는 와닿지 않지만 복잡한 코드에서
사이드 이펙트가 발생했다면 원인을 찾기 어려워진다.
그러나! 여러 변수가 하나의 객체를 공유하는 것을 막을 방법은 없다.

그렇다고해서 객체의 참조값을 공유하는 것 자체는 문제가 아니기 때문에

객체를 공유한다고 바로 사이드 이펙트가 발생하는 건 아니다.

문제의 직접적인 원인은 공유된 객체의 값을 변경한 것에 있다.
👉 `b.setValue("부산");`
`b`의 값을 변경하였는데 `a`에도 그 변경사항이 반영되는 현상이다.


사이드 이펙트 해결방안? 불변객체 사용하기

불변 객체는 객체의 내부 상태(객체의 내부 값, 필드, 멤버 변수)가 생성 후 변경되지 않는 객체를 말합니다.  

 

⭐ 내부 로직에서 객체의 필드를 `final`로 선언하여 값을 못 바꾸게 한다.
final이 중요한 건 아니고 어쨌든 내부로직에서 setValue와 같은 값을 바꾸는 내용을 일절 넣지 않는다.

이렇게 원초적인 방법을 통해 사이드 이펙트를 예방한다.

객체의 종류
가변 객체

상태가 변할 수 있음 ex) Address


◾ 불변 객체

상태가 변하지 않음 ex) ImmutableAddress

 

💬 그렇다면 모든 객체를 불변객체로 만들어야 되나요?

모든 객체를 불변 객체로 만들 필요는 없습니다.
하나를 바꿨을 때 다른게 바뀌는 안되는 상태라면 불변 객체로 생성
하나를 바꿨을 때 같이 바뀌어야 되면 가변 객체로 생성

728x90
320x100