Java - 불변 객체

c.Hano·2024년 11월 27일

자바

목록 보기
11/17
기본형: 하나의 값을 여러 변수에서 공유하지 않음
참조형 : 하나의 객체를 여러 변수에서 참조값을 통해 공유가 가능.
int a = 10;
int b = a; // a -> b, 값을 복사 후 대입
System.out.println("a = " + a);// 10
System.out.println("b = " + b);// 10

b = 20;
System.out.println("20 -> b");
System.out.println("a = " + a); // 10
System.out.println("b = " + b); // 20
자바에선 값을 복사해서 대입한다.
참조값의 경우에는 참조값을 복사해서 대입하기 때문에
a와 b의 참조값이 같다면 b에서 수정한 내용이 a에까지 영향을 끼친다.
Address a = new Address("빵");
Address b = a;
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); // 국수
b = a 를 했다고 해서 둘은 같은 변수가 된 것은 아니다.
둘이 Address 객체를 가리키는 참조값이 같을 뿐이다.
b만 바꾸고 싶은데 a까지 바뀌는 현상을 사이드 이펙트라고 불린다.
이런 사이드 이펙트 현상을 막고자 참조값을 공유하지 못하게 하는 "불변 객체" 가 필요하다.

객체 내부의 값, 필드, 맴버 변수 가 변하지 않는 객체를 불변 객체라고 한다.

불변 객체이지만 값을 변경하고 싶을 땐, 새 객체를 생성하면 된다.
public class Immutable {
	
    private final int value;
    
    public Immutable(int value) {
    	this.value = value;
    }
    
	public Immutable add(int addValue) {
        int result = value + addValue;
        return new Immutable(result);
	}
}
외부에서 생성자를 통해 value 값을 설정하였다.
value는 final이 붙었으니 초기 설정 값 이후에는 값을 변경하지 못한다.
value값을 변경하고 싶으면 add()메서드를 이용한다.
add()메서드는 변경하고 싶은 addValue 값을 받고 기존의 value값을 더한다.
더한 값인 result를 매개변수로 받는 새 Immutable 객체를 생성하였다.
불변 객체에서 값을 변경하고 싶으면 with()가 붙은 메서드를 관례적으로 사용한다.
profile
꼬질이

0개의 댓글