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
	}
}

스크린샷 2025-01-09 오후 10 05 19

  • 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);
	}
}

스크린샷 2025-01-09 오후 10 35 57

📚 불변 객체 값 변경

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());

	}
}