본문 바로가기

Spring boot

Java - 불변 객체

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