불변 객체는 소프트웨어 설계에서 중요한 개념이라고 생각합니다.
실수를 예방하고 로직 구현에 집중할 수 있는 장점을 가지고 있는 불변 객체에 대해 알아보겠습니다. 🤓
불변 객체(Immutable Object)란?
불변 객체는 생성된 이후에는 상태가 변경되지 않는 객체를 의미합니다.
즉, 객체의 상태가 한번 설정되면 수정할 수 없으며, 객체의 필드 값이 불변으로 유지됩니다.
불변 객체는 설계와 구현에 있어서 중요한 원칙으로 다양한 장점으로 인해 많이 사용됩니다.
불변 객체의 특징
- 상태 변경 불가능
객체가 생성된 이후에는 내부 상태를 변경할 수 없습니다. - 스레드 안전성
여러 스레드에서 동시에 접근해도 안전합니다. - 복잡성 감소
상태를 변경하지 않기 때문에 코드가 단순해지고, 디버깅과 유지보수가 용이합니다.
불변 객체를 사용하는 이유
- 스레드 안전성
불변 객체는 상태가 변경되지 않기 때문에, 여러 스레드에서 동시에 접근해도 문제를 일으키지 않습니다. 이는 멀티스레드 환경에서의 동기화 문제를 크게 줄여줍니다. - 디버깅과 유지보수 용이성
불변 객체는 상태가 변경되지 않기 때문에, 객체의 상태를 추적하기 쉽고 버그가 발생할 확률이 줄어듭니다. 또한, 코드의 이해와 유지보수가 쉬워집니다. - 불변성으로 인한 성능 향상
불변 객체는 메모리 캐시에서 유리하게 작용할 수 있습니다. 같은 객체를 재사용할 수 있기 때문에 객체 생성과 파괴로 인한 성능 오버헤드를 줄일 수 있습니다. - 함수형 프로그래밍과의 호환성
함수형 프로그래밍에서는 불변 객체를 많이 사용합니다. 불변 객체는 함수형 프로그래밍의 중요한 원칙인 '부작용이 없는 함수'를 구현하는 데 도움이 됩니다.
불변 객체는 간단하고 신뢰성이 있는 코드를 만들기 위한 전략이다.
- 오라클 자바 튜토리얼
불변 객체는 가변 객체보다 설계하고 구현하고 사용하기 쉬우며 오류가 생길 여지도 적고 훨씬 안전하다.
- 이펙티브 자바
불변 객체 구현하기
Java에서 불변 객체를 구현하는 방법에는 몇 가지 중요한 규칙이 있습니다. 👀
- 클래스를 final로 선언
클래스가 상속되지 않도록 final로 선언합니다. - 모든 필드를 final로 선언
객체의 상태가 변경되지 않도록 모든 필드를 final로 선언합니다. - 필드를 private으로 선언
외부에서 직접 접근할 수 없도록 필드를 private으로 선언합니다. - 변경 불가능한 값을 제공
객체의 상태를 변경할 수 없도록 생성자와 getter 메서드를 통해 값을 제공합니다.
setter메서드는 제공하지 않습니다. - 객체를 안전하게 반환
객체의 내부 상태를 반환할 때는 복사본을 제공하거나, 직접적인 참조를 반환하지 않습니다.
예제와 함께 확인해보겠습니다!
public final class Person {
private final String name;
private final int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 메서드
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter 메서드는 제공하지 않음
}
이 클래스는 final로 선언되어 상속될 수 없고, 모든 필드가 final로 선언되어 한 번 설정된 이후에는 변경할 수 없습니다.
또한 setter 메서드가 없으며, getter 메서드를 통해 필드 값을 읽을 수 있습니다.
💡 불변 객체는 소프트웨어 설계에서 신뢰성이 있고 안정적인 코드를 작성하기 위한 강력한 도구입니다.
개념과 장점을 알고 유용하게 사용하는 것이 중요할 것 같습니다.
'Java' 카테고리의 다른 글
[Java] JPA의 @Lock 동시성 제어 (0) | 2024.08.12 |
---|---|
[Java] for 루프와 Stream API (0) | 2024.08.10 |
[Java] 일급 컬렉션(First-Class Collection)이란? (0) | 2024.07.31 |
[Java] 객체 지향 설계(Object-Oriented Design, OOD) (0) | 2024.07.28 |
[Java] ConcurrentHashMap 멀티스레드 환경에서 안전한 해시맵 (0) | 2024.07.28 |