728x90
기본형과 참조형
기본형 : 하나의 값을 여러 변수에서 공유하지 않는다.
참조형 : 하나의 객체를 참조값을 통해 여러 변수에서 공유한다.
예를들어 아래와 같이 기본형 변수는 값을 공유하지 않는다.
package lang.immutable.address;
public class PrimitiveMain {
public static void main(String[] args) {
//기본형은 절대로 같은 값을 공유하지 않는다.
int a = 10;
int b = a; // a -> b, 값 복사 후 대입
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 = 10
b = 10
20 -> b
a = 10
b = 20
즉 위와 같이 b에 a를 대입하더라도, 메모리 상에서 10의 값을 가지는 a, b가 따로 존재하는 것이다.
하지만 아래 참조형은 다르게 작동한다.
package lang.immutable.address;
public class RefMain1_1 {
public static void main(String[] args) {
//참조형 변수는 하나의 인스턴스를 공유할 수 있다.
Address a = new Address("서울");
Address b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
b.setValue("부산"); //b의 값을 부산으로 변경해야함
System.out.println("부산 -> b");
System.out.println("a = " + a); //사이드 이펙트 발생
System.out.println("b = " + b);
}
}
결과
a = Address{value='서울'}
b = Address{value='서울'}
부산 -> b
a = Address{value='부산'}
b = Address{value='부산'}
참조형 변수들은 위와 같이 참조값을 복사해서 전달하기 때문에 같은 인스턴스를 참조할 수 있다.
참고사항
- 클래스는 객체를 생성하기 위한 청사진(템플릿)
- 객체는 클래스에서 생성된 실체
- 인스턴스는 생성된 객체가 특정 클래스에 속한다는 관계를 나타냄
그런데 위와 같이 참조하는 것은 에러가 아니기 때문에 실제로 사이드이펙트가 발생한 곳을 발견하기 어렵다.
불변 객체
package lang.immutable.address;
public class ImmutableAddress {
private final String value;
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
}
위 코드를 보면
1. value를 final로 정의했다. 따라서 내부 값이 변경될 수 없다.
2. 값을 변경하는 setValue가 없다.

만약 불변 객체에서 값을 변경하고 싶다면 아래와 같이 할 수 있다.
package lang.immutable.change;
public class ImmutableObj {
private final int value;
public ImmutableObj(int value) {
this.value = value;
}
public ImmutableObj add(int addValue) {
int result = value + addValue;
return new ImmutableObj(result);
}
public int getValue() {
return value;
}
}
위와 같이 새로운 불변 객체를 만들어서 객체를 반환하는 방법이 있다.
ImmutableObj 타입으로 새로 반환해야 하는 것에 주의하자.
728x90
'Spring boot' 카테고리의 다른 글
| [Spring boot] - 서킷브레이커 도입하기 (0) | 2026.02.01 |
|---|---|
| Java - Object 클래스 (0) | 2024.12.24 |