Java/Grammar

[Java 문법] 불변 객체(Immutable Object)란? ft. 가변 객체

annovation 2025. 3. 18. 08:52

가변 객체(Mutable Object)

가변 객체는 상태를 변경할 수 있는 객체입니다.

✅ 가변 객체(Mutable Object) 예제

public class MutableUser {
    private String name;
    private int age;

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// 객체 생성 및 변경 가능
MutableUser user = new MutableUser("Alice", 25);
user.setName("Bob"); // 객체의 상태가 변경됨

📌 문제점

✔setName()setAge()를 통해 객체의 상태를 변경할 수 있기 때문에, 여러 스레드에서 동시에 접근하면 데이터가 의도치 않게 변경될 가능성이 있다.


불변 객체(Immutable Object)

불변 객체(Immutable Object)는 한 번 생성되면 그 상태를 변경할 수 없는 객체를 의미합니다.

즉, 객체의 필드 값을 변경할 수 없도록 설계된 객체입니다.

 

✅ 불변 객체(Immutable Object) 예제

불변 객체는 상태를 변경할 수 없으며, 필요한 경우 새로운 객체를 반환합니다.

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // 변경이 필요하면 새로운 객체를 반환
    public ImmutableUser withName(String newName) {
        return new ImmutableUser(newName, this.age);
    }

    public ImmutableUser withAge(int newAge) {
        return new ImmutableUser(this.name, newAge);
    }
}

// 객체 생성
ImmutableUser user = new ImmutableUser("Alice", 25);

// 기존 객체를 변경하지 않고 새로운 객체 생성
ImmutableUser newUser = user.withName("Bob");

System.out.println(user.getName()); // Alice (변경되지 않음)
System.out.println(newUser.getName()); // Bob (새로운 객체)

📌 특징

 final 키워드를 사용하여 필드를 변경할 수 없게 만듦

 setter 메서드가 없고, 필드 값을 변경하려면 새로운 객체를 생성하여 반환


✅ Lombok을 활용한 불변 객체 생성

Lombok의 @Value 또는 @Builder를 사용하면 불변 객체를 쉽게 만들 수 있습니다.

 

1️⃣ @Value 사용 (자동으로 final 적용)

import lombok.Value;

@Value
public class ImmutableUser {
    String name;
    int age;
}

// 객체 생성
ImmutableUser user = new ImmutableUser("Alice", 25);

@Value를 사용하면 자동으로 finalgetter가 적용되며, 객체가 불변성을 갖게 됩니다.

setter가 없으므로 값 변경이 불가능합니다.

 

2️⃣ @Builder를 사용한 불변 객체

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private final String name;
    private final int age;
}

// 객체 생성
User user = User.builder()
        .name("Alice")
        .age(25)
        .build();

@Builder를 사용하면 객체를 생성할 때만 값을 설정할 수 있고, 이후에는 변경할 수 없습니다.


요약

항목 불변 객체(Immutable Object) 가변 객체(Mutable Object)
값 변경 가능 여부 ❌ 불가능 (필드 값 변경 불가) ✅ 가능 (Setter로 값 변경 가능)
멀티스레드 안전성 ✅ 안전 ❌ 동기화 필요
코드 안정성 ✅ 유지보수가 쉬움 ❌ 예기치 않은 버그 발생 가능
성능 🔺 새 객체를 생성해야 하므로 메모리 사용 증가 가능 🔻 기존 객체를 수정하므로 메모리 사용 효율적

 

📌 결론
불변 객체는 멀티스레드 환경에서 안전하고, 코드 유지보수가 쉬우며, 예측 가능한 동작을 제공합니다.
하지만 매번 새로운 객체를 생성하므로 성능 최적화가 필요한 경우 가변 객체를 사용할 수도 있습니다. 🚀


출처

OpenAI ChatGPT (https://openai.com)

반응형

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

[Java] Checked, Unchecked Exception  (0) 2025.03.25
[Java 문법] @Builder  (0) 2025.03.19
[Java 문법] I/O Stream  (0) 2025.02.24
[Java 문법] Overloading VS Overriding  (1) 2025.02.23
[Java 문법] enum(enumerated type)  (0) 2025.02.14