본문 바로가기
Java

Java 중급 1 - 불변객체

by KongJiHoon 2025. 2. 14.

1. 기본형과 참조형의 공유

  • 기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
    • ex) int a = 10; , int b = a 이경우 a는 복사하여 b에 대입한다.
  • 참조형 : 하나의 객체를 참조값을 통해 여러 변수에서 공유 할 수 있다.

 

2. 공유 참조와 사이드 이펙트

  • 사이드 이펙트(Side effect) : 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다.

 

소스 코드

 

package lang.immutable.address;

public class Address {

    private String value;

    public Address(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Address{" +
                "value='" + value + '\'' +
                '}';
    }
}
package lang.immutable.address;

public class RefMain_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("부산");
        System.out.println("부산 -> b");

        System.out.println("a = " + a);
        System.out.println("b = " + b);

    }
}

 

  • 위 코드에서 b를 부산으로 바꿀경우 a의 주소역시 부산으로 바뀐다. 두 객체는 같은 참조값을 가지고 있기 때문이다.
  • 사이드 이펙트가 발생한다.
  • 물론 서로 영향을 안받는 방법은 존재한다. 두 객체가 참조값을 공유하지 않게 각자의 객체를 생성하면된다.

 

3. 불변 객체

  • 불변(Immutable) 객체
    • 이름 그대로 처음 만든 이후 상태가 변하지 않는다는 뜻이다.
  • 가변(Mutable) 객체
    • 처음 만든 이후 상태가 변할 수 있다.
  • 객체의 공유참조는 막을 수 없지만, 사이드 이펙트 발생하면 안되는 상황이라면 불변객체를 만들어서 사용하면 해결할 수 있다.

 

4. 불변 객체의 값 변경

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

 

  • 불변객체의 값은 변경할 수 없는데 다음과 같은 방법을 사용하면 변경할 수 있다.
  • 위 코드를 보면 add()메서드에서 불변객체의 변수에 addValue를 더해준다.
  • return값을 잘 보면 새로운 객체를 생성하여 반환한다.
  • 이러한 방식으로 값을 변경해줄수있다.

'Java' 카테고리의 다른 글

Java 중급 1 - Wrapper Class  (0) 2025.02.24
Java 중급 1 - String  (0) 2025.02.14
JAVA 중급 1 - Object 클래스  (0) 2025.02.14
Java 기본 - 다형성과 설계  (0) 2025.01.30
Java 기본 - 다형성 1  (2) 2025.01.22