Java

[Java] final 불변 객체를 사용해야하는 이유

누구세연 2024. 8. 10. 15:55

불변 객체는 소프트웨어 설계에서 중요한 개념이라고 생각합니다.

실수를 예방하고 로직 구현에 집중할 수 있는 장점을 가지고 있는 불변 객체에 대해 알아보겠습니다. 🤓

 

 

불변 객체(Immutable Object)란?

불변 객체는 생성된 이후에는 상태가 변경되지 않는 객체를 의미합니다.

즉, 객체의 상태가 한번 설정되면 수정할 수 없으며, 객체의 필드 값이 불변으로 유지됩니다.

불변 객체는 설계와 구현에 있어서 중요한 원칙으로 다양한 장점으로 인해 많이 사용됩니다.

불변 객체의 특징

  1.  상태 변경 불가능
    객체가 생성된 이후에는 내부 상태를 변경할 수 없습니다.
  2. 스레드 안전성
    여러 스레드에서 동시에 접근해도 안전합니다.
  3. 복잡성 감소
    상태를 변경하지 않기 때문에 코드가 단순해지고, 디버깅과 유지보수가 용이합니다.

불변 객체를 사용하는 이유

  1. 스레드 안전성
    불변 객체는 상태가 변경되지 않기 때문에, 여러 스레드에서 동시에 접근해도 문제를 일으키지 않습니다. 이는 멀티스레드 환경에서의 동기화 문제를 크게 줄여줍니다.
  2. 디버깅과 유지보수 용이성
    불변 객체는 상태가 변경되지 않기 때문에, 객체의 상태를 추적하기 쉽고 버그가 발생할 확률이 줄어듭니다. 또한, 코드의 이해와 유지보수가 쉬워집니다.
  3. 불변성으로 인한 성능 향상
    불변 객체는 메모리 캐시에서 유리하게 작용할 수 있습니다. 같은 객체를 재사용할 수 있기 때문에 객체 생성과 파괴로 인한 성능 오버헤드를 줄일 수 있습니다.
  4. 함수형 프로그래밍과의 호환성
    함수형 프로그래밍에서는 불변 객체를 많이 사용합니다. 불변 객체는 함수형 프로그래밍의 중요한 원칙인 '부작용이 없는 함수'를 구현하는 데 도움이 됩니다.
불변 객체는 간단하고 신뢰성이 있는 코드를 만들기 위한 전략이다.
- 오라클 자바 튜토리얼
불변 객체는 가변 객체보다 설계하고 구현하고 사용하기 쉬우며 오류가 생길 여지도 적고 훨씬 안전하다.
- 이펙티브 자바

 

 

 

불변 객체 구현하기

Java에서 불변 객체를 구현하는 방법에는 몇 가지 중요한 규칙이 있습니다. 👀

  1. 클래스를 final로 선언
    클래스가 상속되지 않도록 final로 선언합니다.
  2. 모든 필드를 final로 선언
    객체의 상태가 변경되지 않도록 모든 필드를 final로 선언합니다.
  3. 필드를 private으로 선언
    외부에서 직접 접근할 수 없도록 필드를 private으로 선언합니다.
  4. 변경 불가능한 값을 제공
    객체의 상태를 변경할 수 없도록 생성자와 getter 메서드를 통해 값을 제공합니다.
    setter메서드는 제공하지 않습니다.
  5. 객체를 안전하게 반환
    객체의 내부 상태를 반환할 때는 복사본을 제공하거나, 직접적인 참조를 반환하지 않습니다.

예제와 함께 확인해보겠습니다!

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 메서드를 통해 필드 값을 읽을 수 있습니다.

 

 

💡 불변 객체는 소프트웨어 설계에서 신뢰성이 있고 안정적인 코드를 작성하기 위한 강력한 도구입니다.
개념과 장점을 알고 유용하게 사용하는 것이 중요할 것 같습니다.