가변 객체(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를 사용하면 자동으로 final과 getter가 적용되며, 객체가 불변성을 갖게 됩니다.
✔ 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 |