본문 바로가기

Backend/JAVA

[JAVA] 불변 객체

#JAVA

기본형과 참조형

자바의 데이터 타입은 기본형(Primitive Type), 참조형 (Reference Type)으로 나눌 수 있다.

  • 기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
  • 참조형 : 하나의 객체를 참조값을 통해 여려 변수에서 공유

참조형 변수는 참조값으로 변수에 접근 하기 때문에, 객체의 공유를 막을 수 없다.

-> 불변 객체를 도입

불변 객체

객체의 상태가 변하지 않는 객체 (Imutable Object)

public class ImmutableAddress {

    private final String value;

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

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Address{" +
                "value='" + value + '\'' +
                '}';
    }
}
  • 값을 변경할 수 있는 setValue 메서드가 제거됨
    => 값을 변경할 수 있는 방법이 없음
    => 새로운 인스턴스 생성으로 값을 변경할 수 밖에 없음

효과

  • 불변 객체의 도입으로 사이드 이펙트를 막을 수 있다.

String

String은 참조형이다. 즉, String 인스턴스의 참조값만 들어갈 수 있다.

public final class String {
    private final char[] value;// 자바 9 이전
    private final byte[] value;// 자바 9 이후//여러 메서드

    public String concat(String str) {...}
    public int length() {...}
    // 메서드와 기능들
}
  • 동등성과 동일성 / 같은 문자열을 선언 했다고 가정
    • == 연산 : false (동일성) - 참조값을 비교하기 떄문
    • .equals 연산 : true (논리적 동등성)

단, 리터럴 사용시 ex) String a = "hello";
메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용
-> 같은 문자열 선언시 같은 참조값을 가지게 됨
-> 동등성, 동일성 비교 모두 True

불변의 단점 극복

불변의 단점

  • 문자열을 수정할 때마다 계속 새로운 객체를 생성해야한다.
    -> 문제 해결을 위해 불변이 아닌 가변의 String을 만들게 되는 계기StringBuilder
public final class StringBuilder {

    char[] value;// 자바 9 이전
    byte[] value;// 자바 9 이후

    //여러 메서드
    public StringBuilder append(String str) {...}
    public int length() {...}
}

StringBuilder를 이용해 문자열을 변경하는 로직 수행 이후, 마지막에는 불변 String으로 변환하는 것이 좋다.

출처
인프런 '김영한의 실전 자바 - 중급 1편'

'Backend > JAVA' 카테고리의 다른 글

[JAVA] 제네릭  (1) 2025.01.25
[JAVA] 예외 처리  (0) 2025.01.24
[JAVA] 클래스 (중첩, 내부)  (1) 2025.01.22
[JAVA] 열거형 (Enum Type)  (1) 2025.01.22
[JAVA] 날짜와 시간  (0) 2025.01.19