Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 가변 객체(Mutable)와 불변 객체(Immutable)의 차이점 완벽 정리

자바에서 불변 객체(Immutable Object)란 한 번 생성되면 내부 상태를 변경할 수 없는 객체를 의미합니다. 단, 다른 객체를 참조하는 것 자체는 가능합니다. 불변 객체는 여러 스레드가 객체의 상태를 변경할 수 없기 때문에 멀티스레드 환경에서 특히 유용하며, 덕분에 기본적으로 스레드 세이프(thread-safe)가 보장됩니다. 또한 불변 객체는 시간적 결합(temporal coupling)을 방지하는 데 도움이 되며, 항상 실패 원자성(failure atomicity)을 갖는다는 장점도 있습니다.

반면 가변 객체(Mutable Object)는 객체가 생성된 이후에도 필드 값을 자유롭게 변경할 수 있는 객체입니다. 즉, 가변 객체는 변경 가능한 필드를 가지고 있고, 불변 객체는 생성 후 변경할 수 있는 필드가 전혀 없다는 것이 핵심적인 차이입니다.

가변 객체 vs 불변 객체 비교표

번호구분가변 객체(Mutable)불변 객체(Immutable)
1기본 개념객체 생성 후에도 상태를 수정할 수 있습니다.객체 생성 후에는 상태를 수정할 수 없습니다.
2스레드 안전성가변 객체는 스레드 세이프하지 않습니다.불변 객체는 스레드 세이프합니다.
3final 키워드가변 클래스는 final로 선언하지 않습니다.불변 객체를 만들려면 클래스를 final로 선언해야 합니다.
4예시기본적으로 모든 클래스와 그 객체는 본질적으로 가변적입니다.String과 Integer 등 모든 래퍼 클래스가 불변 클래스의 대표적인 예입니다.

불변 클래스(Immutable Class) 예제

아래 예제처럼 클래스를 final로 선언하고, setter 메서드 없이 생성자를 통해서만 값을 초기화하면 불변 클래스를 만들 수 있습니다.

public final class ImmutableClass {
    private String laptop;

    public String getLaptop() {
        return laptop;
    }

    public ImmutableClass(String laptop) {
        super();
        this.laptop = laptop;
    }
}

public class Main {
    public static void main(String args[]) {
        ImmutableClass immutableClass = new ImmutableClass("Dell");
        System.out.println(immutableClass.getLaptop());
    }
}

가변 클래스(Mutable Class) 예제

반면 아래 예제는 setter 메서드(setLaptop)를 제공하기 때문에 객체 생성 후에도 필드 값을 변경할 수 있는 가변 클래스입니다.

public class MutableClass {
    private String laptop;

    public String getLaptop() {
        return laptop;
    }

    public void setLaptop(String laptop) {
        this.laptop = laptop;
    }

    public MutableClass(String laptop) {
        super();
        this.laptop = laptop;
    }
}

public class Main {
    public static void main(String args[]) {
        MutableClass mutableClass = new MutableClass("Dell");
        System.out.println(mutableClass.getLaptop()); // Dell 출력
        mutableClass.setLaptop("IBM");
        System.out.println(mutableClass.getLaptop()); // IBM 출력
    }
}

정리

불변 객체는 상태 변경이 불가능하여 스레드 안전성이 보장되고 예측 가능한 동작을 제공하는 반면, 가변 객체는 유연한 상태 변경이 가능하지만 멀티스레드 환경에서 별도의 동기화 처리가 필요합니다. 따라서 값이 변경될 필요가 없는 데이터라면 불변 객체로 설계하는 것이 더 안전하고 권장되는 방식입니다.