Java ‐ 불변 객체 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 기본형과 참조형의 공유
- 기본형(Primitive Type) : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
- 참조형(Reference Type) : 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.
public class RefMain {
public static void main(String[] args) {
Address address1 = new Address("Seoul"); // 참조형 변수
Address address2 = address1;
address2.setValue("Daegu");
System.out.println(address1); // 얘도 Daegu
System.out.println(address2); // 얘도 Daegu
}
}

Address
타입의 참조 변수 address1과 address2는 같은 인스턴스를 가리킨다.
- 따라서, address2의 값을 변경했는데 둘 다 바뀌는 것이다.
📚 공유 참조와 사이드 이펙트
- 사이드 이펙트(Side Effect)는 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다.
- 사이드 이펙트는 보통 부정적인 의미로 사용되는데, 사이드 이펙트는 특정 부분에서 발생한 변경이 의도치 않게 다른 부분에 영향을 미치는 경우에 발생한다.
- 사이드 이펙트를 해결하려면 서로 다른 인스턴스를 참조하거나 변경 시
setter
를 개방하지 않고 변경 시 새로운 불변 객체를 만드는 방법이 존재한다.
public class RefMain2 {
public static void main(String[] args) {
// 처음부터 서로 다른 인스턴스를 가리키도록 한다.
Address address1 = new Address("Seoul");
Address address2 = new Address("Daegu");
address2.setValue("Ulsan");
System.out.println(address1);
System.out.println(address2);
}
}
📚 불변 객체
- 객체의 상태가 변하지 않는 객체를 불변 객체(Immutable Object)라고 한다.
- 앞서 만들었던 Address 클래스를 상태가 변하지 않는 불변 클래스로 리팩토링하면 다음과 같다.
public class ImmutableAddress {
private final String value; // final 키워드 추가 및 Setter 제거
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
}
public class RefMain2 {
public static void main(String[] args) {
ImmutableAddress address1 = new ImmutableAddress("Seoul");
ImmutableAddress address2 = address1;
address2 = new ImmutableAddress("Daegu");
System.out.println(address1);
System.out.println(address2);
}
}

📚 불변 객체 값 변경
public class ImmutableObj {
private final int value;
public ImmutableObj(int value) {
this.value = value;
}
public int getValue() {
return value;
}
// 반환 타입을 불변 객체로
public ImmutableObj add(int number) {
return new ImmutableObj(value + number);
}
}
public class ImmutableMain {
public static void main(String[] args) {
ImmutableObj obj = new ImmutableObj(1);
ImmutableObj result = obj.add(4);
System.out.println(obj.getValue());
System.out.println(result.getValue());
}
}