본문 바로가기
Spring

[2] 자바 중급 문법 2

by 민지기il 2025. 3. 21.

[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