
불변 객체의 주요 특징은 다음과 같습니다:
자바에서 불변 객체를 구현하는 방법은 다음과 같습니다:
final로 선언: 필드가 변경되지 않도록 final 키워드를 사용하여 선언합니다.private로 선언: 외부에서 필드에 접근하여 변경할 수 없도록 private 접근 제한자를 사용합니다.아래는 Person 클래스를 불변 객체로 구현한 예시입니다:
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Person 클래스는 불변 객체로 구현되었습니다. name과 age 필드는 final로 선언되었으며, 클래스 외부에서 수정할 수 없습니다. 또한, 생성자를 통해서만 필드가 초기화됩니다.public final class Company {
private final String name;
private final List<String> employees;
public Company(String name, List<String> employees) {
this.name = name;
this.employees = new ArrayList<>(employees); // 방어적 복사
}
public String getName() {
return name;
}
public List<String> getEmployees() {
return new ArrayList<>(employees); // 방어적 복사
}
}
Company 클래스는 List<String> 타입의 employees 필드를 가지고 있습니다. employees 리스트를 복사하여 반환합니다. Company 객체의 상태는 변경되지 않습니다.String: 자바의 String 클래스는 불변 객체로, 문자열이 한 번 생성되면 변경할 수 없습니다.Wrapper Classes: Integer, Boolean, Double 등 기본 타입의 래퍼 클래스들도 불변 객체입니다.Collections: Collections.unmodifiableList(), Collections.unmodifiableMap() 등을 사용하여 불변 컬렉션을 생성할 수 있습니다.String s1 = "Hello";
String s2 = s1;
s1 = s1 + " World";
System.out.println(s1); // Hello World
System.out.println(s2); // Hello
s1이 "Hello"에서 "Hello World"로 변경되었지만, 실제로는 s1이 새로운 문자열 객체를 참조하게 된 것입니다. s2는 여전히 원래의 "Hello" 문자열을 참조하고 있음을 알 수 있습니다.