불변 객체

Single Ko·2023년 4월 5일
0

java

목록 보기
18/28

불변 객체란?

불변 객체는 생성 이후 내부의 상태를 수정할 수 없는 객체. 인스턴스가 초기화 되면 해당 내용은 객체의 전체 라이프 사이클 동안 변경되지 않는 상태로 유지된다.

불변 객체의 장점

  1. 단순성 - 불변 객체는 생성 후 변하지 않으므로 코드의 복잡성이 줄어들고 유지관리가 더 쉬워지므로 추론하기가 더 쉽다.

  2. Thread safe하다 - 상태가 변할 수 없으므로 동기화의 위험없이 여러 사용자가 동시에 접근해도 괜찮다. 이는 다중 스레드 환경이나 동시 프로그래밍 환경에서 특히 유용하다.

  3. 실패 원자적인 메소드를 만들 수 있다 - 메소드 실행 중에 예외가 발생하면 객체의 상태가 변경되지 않고 유지됩니다. 이렇게 하면 객체가 일관된 상태로 유지되고 예외가 발생하기 전과 같은 상태로 다시 처리될 수 있습니다.

  4. 부수효과 방지해 오류 최소화 - 메서드가 실행될 때 발생할 수 있는 객체 또는 변수의 상태에 대한 의도하지 않은 변경을 방지. 버그 가능성을 줄이고 코드를 더 예측가능하고 추론하기 쉽게 만든다.

  5. 예측 가능한 동작 - 초기화후 상태가 변경되지 않기 때문에 쉽게 예측 가능. 객체의 라이프 사이클동안 일관된 동작 보장. 다른 컨텍스트에서 동작하는 방식을 쉽게 이해하고 디버깅 프로세스 단순화 가능.

  6. 다른 개체에 대한 부작용 없음 - 불변 객체는 내부 상태가 변경되지 않기 때문에 메서드에 대한 파라미터로 전달 될 때 개발자는 객체의 상태가 예기치 않게 수정되지 않을 거라고 확신할 수 있으므로 코드의 복잡성을 줄이고 의도치 않은 결과 방지.

  7. 보안 - 변경할 수 없는 객체는 신뢰할 수 없는 구성 요소간에 안전하게 공유하거나 의도하지 않은 수정의 위험 없이 메서드 간에 전달 할 수 있으므로 애플리케이션의 보안을 개선하는데 도움된다.

  • 요약하자면 "일관된 동작 유지"로 인해 "오류 최소화", "예측가능", "유지 관리의 용이" 등이 장점이다.

단점

  1. 객체 생성 증가 - 상태를 변경할 수 없으므로 수정하려면 새 객체를 생성해야 한다. 이로인해 생성되는 객체수가 증가할 수 있으며, 빈번한 객체 생성이 일어나는 프로그램에서는 성능 및 메모리에 영향을 줄 수 있다.
  2. 성능장단점 - 다중 스레드 환경에서는 성능 이점을 제공할 수 있지만 객체 생성 및 메모리 사용량 증가로 오버헤드가 발생 할 수도 있다. 트레이드 오프는 애플리케이션의 특정 요구 사항에 따라 신중하게 고려해야 한다.

java에서 불변객체의 예

JAVA에서는 final 키워드를 통해 불변객체 생성 가능

public final class ImmutablePerson {
    private final String name;
    private final int age;

    public ImmutablePerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
  • String Class는 Java의 대표적인 불변객체이다. :
    • 캐싱 기능에 의한 메모리 절약과 속도 향상.(String pool에 있는 객체 사용.) 특정 문자열 사용 빈도가 높을 수록 성능 향상의 기대.
    • 보안 기능: 중요한 데이터를 강제로 해당 참조에 대한 문자열 값을 바꾸는 것이 불가능하기 때문에 보안에 유리
    • 불변객체이므로 String을 수정할시 새로운 객체를 생성함 -> 문자열의 변경이 많이 일어나는 상황에서는 String을 사용하면 성능에 문제가 생길 수 있다.
  • 문자열의 변화가 많이 일어날때는 가변속성을 지닌 StringBuffer나 StringBuilder를 사용하자.
    • Buffer는 동기화를 지원. 멀티쓰레드환경 특화, Builder는 싱글 쓰레드 환경에서 주로 사용.
    • Buffer나 Builder는 동일 객체 내에서 문자열을 변경.
profile
공부 정리 블로그

0개의 댓글