개발 알다가도 모르겠네요

[Java] Immutable Object(불변객체)를 알아보자 본문

웹/Java

[Java] Immutable Object(불변객체)를 알아보자

이재빵 2024. 5. 2. 16:11
728x90

Immutable 객체란 무엇인가?

자바에서 객체가 Immutable이라는 것은 해당 객체가 생성된 후 그 상태가 변하지 않는다는 것을 의미한다.

즉, 객체의 상태(데이터)를 변경할 수 없다는 것이다. 이는 데이터의 무결성을 유지하고, 멀티스레딩 환경에서의 동기화 문제를 해결하는데 도움이 된다고 한다.

 

Immutable 객체의 이점

1. 데이터 무결성 보장: Immutable 객체는 생성 후 상태가 변경되지 않으므로, 예기치 않은 side effect로부터 데이터를 보호할 수 있다.

2. 스레드 안전: 여러 스레드에서 동시에 해당 객체를 참조해도 객체가 변경될 수 없으므로 동기화를 신경 쓸 필요가 없다.

3. 캐싱과 재사용 용이: Immutable 객체는 그 자체로 고유한 식별자 역할을 할 수 있으며, 캐시에 저장하고 재사용하기에 안전하다.

4. 디버깅 용이: 객체의 상태가 변경되지 않기 때문에, 디버깅 시 객체의 상태를 추적하기가 용이하다.

 

 

자바에서의 Immutable 객체 사용 예

가장 대표적인 예는 한 번 생성되면 그 값을 변경할 수 없는 String 객체이다.

String 객체의 불변성 때문에 문자열을 변경할 때마다 실제로는 새로운 String 객체가 생성되기 때문에, 반복적인 문자열 연산에서 비효율적일 수 있다. 예를 들어, s가 "abc"라고 할 때, 여기에 "de"를 더하려면

  1. 새로운 문자열 객체가 생성된다.
  2. 기존 문자열 "abc"의 각 문자 'a', 'b', 'c'가 새로운 문자열 객체로 복사된다.
  3. 새로 추가할 문자열 "de"의 각 문자 'd', 'e'가 복사된 후에 이어서 추가된다.

이렇게 전체 문자열 "abcde"가 새로운 문자열 객체에 저장되며, 이 과정에서 각 문자가 개별적으로 복사된다.

따라서 문자열의 길이가 길어질수록 이 복사하는 작업도 더 많은 시간과 메모리를 요구하게 되며, 큰 반복문 내에서 문자열을 결합하는 작업은 시간 복잡도 를 가지게 된다.

 

이를 해결하기 위해 StringBuffer와 StringBuilder 클래스를 사용하게 되는데, 두 클래스 모두 내부적으로 가변적인 문자 배열을 사용하여 문자열을 조작한다.

StringBuffer는 스레드 안전(thread-safe)을 보장하는 반면, StringBuilder는 단일 스레드 환경에서 더 빠른 성능을 제공한다.

 

직접 Immutable 클래스 만들기

직접 Immutable 클래스를 만드는 방법은 간단한데, 모든 필드를 final로 선언하고 setter 메소드를 제외, 생성자에서만 수정 가능하도록 구현한다.

public final class ImmutablePerson {
    private final String name;
    private final int age;

    public ImmutablePerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

' > Java' 카테고리의 다른 글

[Java] compareTo와 compare 메서드의 차이  (0) 2023.12.28