JAVA

[Java] 불변객체

songsua 2025. 1. 9. 11:53

기본형: 하나의 값을 여러변수에 절대 공유하지 않는다

참조형: 하나의 객체를 참조값을 통해 여러 변수에 공유할 수 있다.(참조값을 복사하기 때문에 같은 인스턴스를 바라보게 된다.)

공유하는 객체 값을 변경하지 않게 하는 방법

 

불변 객체:

객체의 상태가 변하지 않는 객체를 불변 객체라 한다.

package immutable;

    public class ImmutableAddress {
        private final String value;  //final를 사용하기 때문에 ImmutableAddress 에 있는 "value"  값은 한번 생성하면 변경이 불가능
        public ImmutableAddress(String value) {
            this.value = value;
        }
        public String getValue() {
            return value;
        }
        @Override
        public String toString() {
            return "Address{" +
                    "value='" + value + '\'' +
                    '}';
        }
}

 

내부 값이 생성되고 후에는 변경되면 안되기 때문에 final함수를 선언하여 변경을 불가능하게 지정한다.

이 클래스는 생성자를 통해서만 값을 설정할 수 있다.

 

불변 객체 - 예제

package immutable.change;

public class MutableObj {
    private  int value;

    public MutableObj(int value) {
        this.value = value;
    }

    public  void add(int addvValue) {
        value = value + addvValue;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}
package immutable.change;

public class MutableMain {
    public static void main(String[] args) {
        MutableObj m = new MutableObj(10);
        m.add(20);
        System.out.println(m.getValue());
        m.setValue(10);

    }
}

value = 10 에서

10 +20 = 30 이 되어 변경이 된다

 

그렇다면 불변 객체에서 메서드를 어떻게 구현하는지 알아보자.

package immutable.change;

import immutable.ImmutableAddress;

public class immutableObj {
    private final int value;
    //value는 불변이기 때문에 절대 변경되면 안된다.
    
    
    public immutableObj(int value) {
        this.value = value;
    }
    
    public immutableObj add(int addvalue) {
        int result = value + addvalue;
        return new immutableObj(result);
        //return new immutableObj(value + addValue); 변수를 없애고 합칠 수도 있다.
        //불변객체인 value 는 변경하지 않고 새로운 객체를 생성하여 반환하도록 하는 것
    }
    
    public int getValue() {
        return value;
    }
}

 

아예 새로운 객체를 가지고와서 return하여 반환하게 한다.

package immutable.test;

public class MyDateMaim {
    public static void main(String[] args) {
        ImmutableMydata date = new ImmutableMydata(2024, 1, 1);
        ImmutableMydata date2 = date;

        System.out.println("date1=" + date);
        System.out.println(date.equals(date2));



        System.out.println("2025 --> date1");
        date = date.WithsetYear(2025);
        System.out.println("date = " + date);
        System.out.println("date2 = " + date2);



    }
}
package immutable.test;

public class ImmutableMydata {
        private final int year;
        private final int month;
        private final int day;

        public ImmutableMydata(int year, int month, int day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }

        public ImmutableMydata WithsetYear(int newyear) {
            return new ImmutableMydata(newyear, month, day);

        }

        public ImmutableMydata setMonth(int newmonth) {
            return new ImmutableMydata(year, newmonth, day);
        }

        @Override
        public String toString() {
            return year + "-" + month + "-" + day;
        }
    }

새로운 객체 newyear,newmonth,newday 로 인해 변환되지 않는 다는 것을 알 수 있다.

date.WithsetYear(2025);

처음에 이렇게 썼는데, 2025가 적용안되서 왜그런가 봤더니..

date = date.WithsetYear(2025);

 

 

반환값을 생성해줘야한다.
불변 객체에서 변경과 관견된 메서드들은 보통 객체를 새로 만들어서 반환하는 것이기 때문에
꼭! 반환값을 받아야한다.

 

'JAVA' 카테고리의 다른 글

[Java] 다시 기본 복습(1)  (0) 2025.01.26
[Java] 래퍼 클래스  (0) 2025.01.16
[JAVA] Object 다형성  (0) 2025.01.08
[Java] 클래스와 인터페이스의 활용  (0) 2024.12.07
[Java] 인터페이스  (1) 2024.12.06