기본형: 하나의 값을 여러변수에 절대 공유하지 않는다
참조형: 하나의 객체를 참조값을 통해 여러 변수에 공유할 수 있다.(참조값을 복사하기 때문에 같은 인스턴스를 바라보게 된다.)
공유하는 객체 값을 변경하지 않게 하는 방법
불변 객체:
객체의 상태가 변하지 않는 객체를 불변 객체라 한다.
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 |