
커스텀 불변 클래스란?
자바에서 불변 클래스(Immutable Class)를 만드는 것은 객체의 상태를 한 번 설정하면 변경할 수 없도록 하는 것을 의미합니다. 불변 클래스는 여러 가지 이점을 제공합니다. 예를 들어, 멀티스레드 환경에서 안전하게 사용할 수 있으며, 객체의 불변성 때문에 예상치 못한 부작용을 방지할 수 있습니다.
불변 클래스의 특징
- 객체의 상태를 변경할 수 없다: 모든 필드는 final이어야 한다.
- 객체를 확장할 수 없다: 클래스를 final로 선언하여 상속을 방지한다.
- 모든 필드는 private이어야 한다: 직접 접근을 막기 위해.
- 필드에 대한 setter 메서드를 제공하지 않는다.
- 모든 가변 필드는 복사본을 제공한다: 깊은 복사(deep copy) 또는 불변성 확보를 위해.
불변 클래스 만들기
다음은 불변 클래스를 만드는 예입니다:
public final class ImmutableClass {
private final int value;
private final String name;
private final List<String> list;
public ImmutableClass(int value, String name, List<String> list) {
this.value = value;
this.name = name;
// 깊은 복사를 통해 리스트의 불변성을 확보
this.list = new ArrayList<>(list);
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
public List<String> getList() {
// 방어적 복사를 통해 리스트의 불변성을 유지
return new ArrayList<>(list);
}
}
자바에서의 불변 클래스 예
자바 표준 라이브러리에서 불변 클래스의 가장 대표적인 예는 String 클래스입니다. String 클래스는 한 번 생성된 문자열 객체의 내용을 변경할 수 없도록 설계되었습니다.
String 클래스 예시
public final class String {
private final char[] value;
public String(char[] value) {
this.value = Arrays.copyOf(value, value.length);
}
public char charAt(int index) {
return value[index];
}
// 기타 메서드들...
}
String 클래스는 다음과 같은 불변 클래스의 특성을 가집니다:
- final로 선언되어 상속을 방지.
- 내부 상태를 변경할 수 없도록 모든 필드가 final로 선언.
- 모든 메서드는 객체의 상태를 변경하지 않음.
불변 클래스의 이점
- 스레드 안전성: 불변 객체는 변경할 수 없기 때문에 여러 스레드가 동시에 접근해도 안전합니다.
- 단순성: 불변 객체는 상태 변화를 고려할 필요가 없어 설계와 구현이 단순해집니다.
- 캐싱 및 재사용 가능성: 불변 객체는 상태가 변하지 않기 때문에 캐싱하거나 재사용하기에 적합합니다.
결론
불변 클래스를 만드는 것은 객체 지향 프로그래밍에서 안전하고 예측 가능한 코드를 작성하는 데 큰 도움이 됩니다. 특히, 멀티스레드 환경에서 안전성을 보장하고, 코드의 복잡성을 줄일 수 있는 유용한 방법입니다. 자바의 String 클래스와 같은 불변 클래스의 예를 참고하여, 자체적으로 불변 클래스를 구현할 때 이러한 원칙을 따르는 것이 중요합니다.
'Programming > Java, Kotlin' 카테고리의 다른 글
[JPA] Entity 간의 관계를 매핑하는 방법, 애너테이션, 속성 (2) | 2024.06.30 |
---|---|
[Java] 얕은 복사, 깊은 복사 차이, 예시 (0) | 2024.06.22 |
[Java] ThreadPoolExecutor란? 주요 기능, 사용예시, 장점, 동작 방식 (0) | 2024.06.22 |
[Java] 가비지 컬렉션이란? (가비지가 객체를 수집하는 방법, 사용하는 알고리즘) (0) | 2024.06.22 |
[Java] JVM 이란? 자바 메모리(메모리 각 영역에 객체, 메소드 및 변수를 저장하는 법) (0) | 2024.06.22 |

커스텀 불변 클래스란?
자바에서 불변 클래스(Immutable Class)를 만드는 것은 객체의 상태를 한 번 설정하면 변경할 수 없도록 하는 것을 의미합니다. 불변 클래스는 여러 가지 이점을 제공합니다. 예를 들어, 멀티스레드 환경에서 안전하게 사용할 수 있으며, 객체의 불변성 때문에 예상치 못한 부작용을 방지할 수 있습니다.
불변 클래스의 특징
- 객체의 상태를 변경할 수 없다: 모든 필드는 final이어야 한다.
- 객체를 확장할 수 없다: 클래스를 final로 선언하여 상속을 방지한다.
- 모든 필드는 private이어야 한다: 직접 접근을 막기 위해.
- 필드에 대한 setter 메서드를 제공하지 않는다.
- 모든 가변 필드는 복사본을 제공한다: 깊은 복사(deep copy) 또는 불변성 확보를 위해.
불변 클래스 만들기
다음은 불변 클래스를 만드는 예입니다:
public final class ImmutableClass {
private final int value;
private final String name;
private final List<String> list;
public ImmutableClass(int value, String name, List<String> list) {
this.value = value;
this.name = name;
// 깊은 복사를 통해 리스트의 불변성을 확보
this.list = new ArrayList<>(list);
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
public List<String> getList() {
// 방어적 복사를 통해 리스트의 불변성을 유지
return new ArrayList<>(list);
}
}
자바에서의 불변 클래스 예
자바 표준 라이브러리에서 불변 클래스의 가장 대표적인 예는 String 클래스입니다. String 클래스는 한 번 생성된 문자열 객체의 내용을 변경할 수 없도록 설계되었습니다.
String 클래스 예시
public final class String {
private final char[] value;
public String(char[] value) {
this.value = Arrays.copyOf(value, value.length);
}
public char charAt(int index) {
return value[index];
}
// 기타 메서드들...
}
String 클래스는 다음과 같은 불변 클래스의 특성을 가집니다:
- final로 선언되어 상속을 방지.
- 내부 상태를 변경할 수 없도록 모든 필드가 final로 선언.
- 모든 메서드는 객체의 상태를 변경하지 않음.
불변 클래스의 이점
- 스레드 안전성: 불변 객체는 변경할 수 없기 때문에 여러 스레드가 동시에 접근해도 안전합니다.
- 단순성: 불변 객체는 상태 변화를 고려할 필요가 없어 설계와 구현이 단순해집니다.
- 캐싱 및 재사용 가능성: 불변 객체는 상태가 변하지 않기 때문에 캐싱하거나 재사용하기에 적합합니다.
결론
불변 클래스를 만드는 것은 객체 지향 프로그래밍에서 안전하고 예측 가능한 코드를 작성하는 데 큰 도움이 됩니다. 특히, 멀티스레드 환경에서 안전성을 보장하고, 코드의 복잡성을 줄일 수 있는 유용한 방법입니다. 자바의 String 클래스와 같은 불변 클래스의 예를 참고하여, 자체적으로 불변 클래스를 구현할 때 이러한 원칙을 따르는 것이 중요합니다.
'Programming > Java, Kotlin' 카테고리의 다른 글
[JPA] Entity 간의 관계를 매핑하는 방법, 애너테이션, 속성 (2) | 2024.06.30 |
---|---|
[Java] 얕은 복사, 깊은 복사 차이, 예시 (0) | 2024.06.22 |
[Java] ThreadPoolExecutor란? 주요 기능, 사용예시, 장점, 동작 방식 (0) | 2024.06.22 |
[Java] 가비지 컬렉션이란? (가비지가 객체를 수집하는 방법, 사용하는 알고리즘) (0) | 2024.06.22 |
[Java] JVM 이란? 자바 메모리(메모리 각 영역에 객체, 메소드 및 변수를 저장하는 법) (0) | 2024.06.22 |