본문 바로가기
개발

Java에서 불변 객체의 중요성과 생성 방법 이해하기

by new-fp 2024. 11. 16.
728x90

안녕하세요! 오늘은 Java 언어에서 불변 객체의 중요성과 이를 어떻게 효과적으로 생성할 수 있는지에 대해 이야기해보려고 합니다. 많은 프로그래머들이 불변 객체에 대해 알고 있지만, 실제로 이를 구현하고 활용하는 과정에서 고민이 생기기 마련입니다. 그럼 지금부터 불변 객체의 개념과 자바에서의 적용 방법을 살펴보도록 하겠습니다.

들어가며
불변 객체는 객체의 상태가 생성 이후 변경되지 않는 객체를 의미합니다. 이는 코드를 작성하고 유지보수하는 과정에서 많은 이점을 제공합니다. 특히, 멀티스레드 환경에서의 동기화를 간소화할 수 있어 안정성을 높이는 데 큰 역할을 합니다. 그러나 불변 객체를 제대로 구현하지 않으면 오히려 문제를 일으킬 수 있습니다.

간편한 예로, 금융 애플리케이션에서 계좌 잔액이 음수가 될 수 없도록 하는 불변식을 고려해 보겠습니다. 만약 불변 객체가 아니라면, 계좌 잔액을 잘못 수정할 수 있는 상황이 발생할 수 있습니다. 이는 데이터 무결성을 심각하게 훼손할 수 있습니다.

코드 작성하기
아래의 코드는 자바에서 불변 객체를 작성하는 기본적인 방법을 보여줍니다.

public final class Period {
    private final Date start;
    private final Date end;

    public Period(Date start, Date end) {
        if (start.compareTo(end) > 0) 
            throw new IllegalArgumentException("시작일이 종료일보다 늦습니다.");
        this.start = new Date(start.getTime());
        this.end = new Date(end.getTime());
    }

    public Date start() {
        return new Date(start.getTime());
    }
    
    public Date end() {
        return new Date(end.getTime());
    }

    public String toString() {
        return start + " - " + end;
    }
}

위 코드의 중요한 점은 Date 객체를 직접적으로 외부에 노출하지 않고, 불변성을 유지하기 위해 방어적 복사를 수행하는 것입니다. 생성자에서 입력된 Date 객체의 상태를 변경할 수 있는 여지를 차단함으로써, 클래스의 무결성을 보장합니다.

코드 설명하기

  1. 생성자: Period 클래스의 생성자는 시작일과 종료일을 받아들이고, 올바른 날짜 비교를 수행하여 유효성을 검사합니다. 이 때, new Date(start.getTime())을 통해 불변 객체로 만들기 위해 방어적 복사를 사용합니다.
  2. 접근자: start()end() 메소드는 Date 객체를 반환할 때 또 다시 방어적 복사를 수행하여 외부에서 수정할 수 없도록 합니다. 이렇게 함으로써 클래스가 의도된 대로 동작하도록 합니다.
  3. 오류 처리: 생성자에서 발생할 수 있는 예외를 명확히 정의하여 사용자가 잘못된 입력을 제공할 경우 어떻게 반응할 수 있는지를 설명합니다.

마무리하며
오늘 포스트에서는 Java에서 불변 객체를 생성하는 방법과 그 중요성에 대해 이야기했습니다. 잘못된 불변 객체 구현은 여러 문제를 초래할 수 있다는 점에서 주의가 필요합니다. 불변 객체를 통해 더욱 안전하고, 유지보수하기 쉬운 코드를 작성하는 데 도움이 되었길 바랍니다.

여러분도 직접 불변 객체를 적용해 보시고, 만약 질문이 있다면 언제든지 댓글로 남겨 주세요! 프로그래밍을 통해 세상을 더 좋은 방향으로 변화시킬 수 있기를 바랍니다. 그럼 다음 포스트에서 만나요!

728x90