[JAVA] 불변객체에 대하여

2025. 6. 24. 14:03·자바

자바에서 불변 객체(Immutable Object)란, 생성 이후 내부 상태가 변하지 않는 객체를 말한다. 대표적인 예로는 String 클래스가 있다. 한 번 만들어진 객체는 어떤 방식으로도 그 내부 값을 바꿀 수 없다. 값이 변경된 것처럼 보일 경우에도 실제로는 새로운 객체가 생성된다.

 

불변 객체가 필요한 가장 큰 이유 중 하나는 공유 변수로 인한 사이드 이펙트(side effect)를 방지하기 위해서다. 멀티스레드 환경에서 여러 스레드가 하나의 객체를 공유하며 값을 변경하면, 예측하지 못한 결과가 발생할 수 있다. 어떤 스레드가 먼저 실행될지, 어떤 시점에 값이 바뀔지 알 수 없기 때문이다. 이런 상황에서는 코드의 동작을 추적하기 어렵고, 버그 발생 가능성도 높아진다.

 

불변 객체를 사용하면 이러한 문제를 원천적으로 막을 수 있다. 객체의 상태가 절대 변하지 않기 때문에 여러 스레드가 동시에 접근하더라도 안전하다. 별도의 동기화 코드 없이도 안정성과 예측 가능성이 확보된다.

 

예를 들어보자. 다음은 내부 상태가 자유롭게 변경 가능한 클래스다.

public class MutableUser {
    public String name;

    public MutableUser(String name) {
        this.name = name;
    }
}

이 객체를 여러 스레드가 공유하게 되면 name 필드가 언제 어떻게 바뀔지 알 수 없다.

 

반면, 아래와 같이 불변 객체로 구현하면 다르다.

public final class ImmutableUser {
    private final String name;

    public ImmutableUser(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

이 객체는 생성 시점에 값이 고정되며, 이후 외부에서 변경할 수 있는 방법이 없다. 따라서 여러 스레드에서 동시에 사용하더라도 안정성을 보장할 수 있다.

 

불변 객체는 단지 멀티스레드를 위한 도구에 그치지 않는다. 설계 구조 자체를 단순하고 명확하게 만들어주며, 테스트와 유지보수를 쉽게 해주는 장점도 있다. 값이 변하지 않으므로 코드 흐름을 추적하기 쉬워지고, 예기치 못한 상태 변경으로 인한 버그를 줄일 수 있다.

 

 

그럼 객체의 상태를 수정하고 싶을때 어떻게 해야 할까?

정답은 같은 불변 객체는 상태 변경이 불가능하며, 값을 바꾸고 싶을 경우 아래와 같이 새로운 객체를 생성해야 한다.

    public ImmutableUser rename(String newName) {
        return new ImmutableUser(newName);
    }

 

이처럼 불변 객체는 내부 값을 수정하는 대신 새로운 객체를 반환한다. 예를 들어 user.rename("Bob")을 호출하면 기존 객체는 그대로 두고 "Bob"이라는 값을 가진 새로운 ImmutableUser 객체가 만들어진다. 원본 데이터는 변하지 않기 때문에 안전하게 공유할 수 있으며, 이전 상태를 보존할 수 있다는 점에서도 유리하다.

 

결론적으로 불변 객체는 단순히 멀티스레드 문제를 해결하기 위한 기술을 넘어, 코드 전체의 구조를 단순하고 예측 가능하게 만들어준다.

'자바' 카테고리의 다른 글

[JAVA] 날짜와 시간  (1) 2025.07.06
[JAVA] 열거형(ENUM)에 대하여  (1) 2025.06.29
[JAVA] 래퍼 클레스에 대하여  (3) 2025.06.24
[JAVA] String 클래스에 대하여  (0) 2025.06.24
[JAVA] Object Class에 대하여  (6) 2025.06.24
'자바' 카테고리의 다른 글
  • [JAVA] 열거형(ENUM)에 대하여
  • [JAVA] 래퍼 클레스에 대하여
  • [JAVA] String 클래스에 대하여
  • [JAVA] Object Class에 대하여
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BFS
    mvc
    spring
    SpringDataJpa
    스프링
    타임리프
    백준
    불변객체
    thymeleaf
    Java
    fetch join
    dfs
    다형성
    자바
    최적화
    스프링 컨테이너
    코딩 테스트
    예외처리
    QueryDSL
    쿼리
    JPA
    컬렉션
    쿼리dsl
    코딩테스트
    LocalDateTime
    SOLID
    스프링 데이터 JPA
    예외 처리
    재귀
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[JAVA] 불변객체에 대하여
상단으로

티스토리툴바