기본형: 하나의 값을 여러 변수에서 공유하지 않음
참조형 : 하나의 객체를 여러 변수에서 참조값을 통해 공유가 가능.
int a = 10;
int b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
b = 20;
System.out.println("20 -> b");
System.out.println("a = " + a);
System.out.println("b = " + b);
자바에선 값을 복사해서 대입한다.
참조값의 경우에는 참조값을 복사해서 대입하기 때문에
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()가 붙은 메서드를 관례적으로 사용한다.