[1] 참조값
public class Address {
private String value;
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
public Address(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class PrimitiveMain {
public static void main(String[] args) {
//참조형 변수는 하나의 인스턴스를 공유할 수 있음
Address a = new Address("서울");
Address b = a;
System.out.println(a);
System.out.println(b);
b.setValue("부산");
System.out.println(a);
System.out.println(b);
}
}
- 참조형 변수들은 값은 참조값을 통해 같은 인스턴스를 참조할 수 있다.
b=a일때 a의 참조값인 x001을 복사해서 b에 전달함 -> a와 b는 같은 x001 인스턴스를 참조한다.
- 기본형 변수는 항상 값을 복사해서 대입하기 때문에 같은 값을 공유하지 않는다. 다른 메모리, 다른 공간에 있다.
[2] 공유 참조와 사이트 이펙트
: 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것
ex) 상단의 코드에서 b.setValue("부산")을 통해 a,b 값 모두 부산으로 바뀐 것
해결)
Address a = new Address("서울");
Address b = new Address("부산"); 이렇게 바꾼다. -> 서로 다른 인스턴스를 참조한다.
[3] 불변 객체 - 도입
불변 객체: (객체 내부의 값, 필그, 멤버 변수)가 변하지 않는 객체임
해결) final 사용 -- 애초에 setValue를 사용할 수 없으므로 새로운 instance를 만들게 된다.
public class ImmutableAddress {
private final String value; //final 만들고 set 없애산
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public class PrimitiveMain {
public static void main(String[] args) {
//참조형 변수는 하나의 인스턴스를 공유할 수 있음
ImmutableAddress a = new ImmutableAddress("서울");
ImmutableAddress b = a;
System.out.println(a);
System.out.println(b);
b = new ImmutableAddress("부산");
System.out.println(a);
System.out.println(b);
}
}
2) 불변 객체 - 값 변경
public class MutableObj {
private final int value;
public MutableObj(int value) {
this.value = value;
}
public MutableObj add(int addValue){
int result = value + addValue;
return new MutableObj(result);
}
public int getValue() {
return value;
}
}
불변 객체는 기존 값을 변경하지 않고 계산 결과를 바탕으로 새로운 객체를 만들어서 반환한다.
public class MutableMain {
public static void main(String[] args) {
MutableObj obj = new MutableObj(10);
MutableObj obj2 = obj.add(20);
System.out.println(obj.getValue());
System.out.println(obj2.getValue());
}
}
[4] 예제 문제
public class ImmutableMyDate {
private final int year;
private final int month;
private final int day;
public ImmutableMyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public ImmutableMyDate changeYear(int newYear){
return new ImmutableMyDate(newYear, month, day);
}
@Override
public String toString(){
return year +"-"+month+"-"+day;
}
}
public class ImmutableMyDateMain {
public static void main(String[] args) {
ImmutableMyDate date1 = new ImmutableMyDate(2025,03,21);
ImmutableMyDate date2 = date1;
System.out.println("date1= " +date1);
System.out.println("date2= " +date2);
System.out.println("2026->date1");
date1 = date1.changeYear(2026);
System.out.println("date1= " + date1);
System.out.println("date2= " + date2);
}
}
나는 changeYear로 했지만 불변 객체에서 값을 변경하는 경우 withYear()처럼 with로 시작하는 경우가 많으니 알아 두자
'Spring' 카테고리의 다른 글
[4] 자바 중급 문법 - Generic (0) | 2025.03.26 |
---|---|
[3] 자바 중급 문법 3 -- 날짜와 시간 (0) | 2025.03.21 |
[1] 자바 중급 문법 1 (0) | 2025.03.19 |
[8] 소셜 로그인 구현 2 (0) | 2025.03.18 |
[9] 상품 생성 (0) | 2025.03.18 |