[간단정리] Java에서 불변 객체(Immutable Object)란?

2025. 4. 16. 23:39·개발메모/간단정리

🔎 개요

Java에서 불변 객체(Immutable Object)는 한 번 생성되면 상태(state)가 변하지 않는 객체를 말합니다.
대표적으로 String, Integer, LocalDate 등 많은 표준 클래스들이 불변 객체로 설계되어 있습니다.


🧩 내용

✅ 불변 객체의 특징

  • 객체의 모든 필드는 final로 선언
  • 생성자에서만 값을 설정하고 이후에는 변경 불가
  • Setter가 존재하지 않음
  • 외부에서 내부 상태를 변경할 수 없도록 방어적 복사(Defensive Copy) 사용

✅ 왜 불변 객체를 사용할까?

  1. 안정성(Thread-Safety)
    멀티스레드 환경에서 동시에 접근해도 안전합니다. 객체의 상태가 바뀌지 않으니 동기화 코드를 줄일 수 있습니다.
  2. 예측 가능하고 디버깅 쉬움
    값이 변하지 않기 때문에 프로그램 흐름을 추적하기 더 쉽습니다.
  3. 함수형 프로그래밍에 적합
    상태를 공유하지 않기 때문에 순수함수를 작성하는 데 유리합니다.

✅ 대표적인 불변 객체 예시

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만 존재 (Setter 없음)
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
  • 위 클래스는 final 필드와 생성자만으로 값을 초기화하며, 이후 값 변경이 불가능합니다.

✅ String은 왜 불변일까?

String a = "hello";
String b = a;

a = "world";

System.out.println(b); // hello
  • a를 "world"로 바꿔도 b는 여전히 "hello"를 유지합니다.
  • 이유: String은 내부적으로 final char[] 배열을 가지고 있어 값을 바꾸는 것이 아니라 새로운 객체를 생성합니다.

🧾 정리

개념 한 번 만들어지면 내부 상태가 바뀌지 않는 객체
장점 쓰레드 안정성, 예측 가능, 디버깅 쉬움
예시 String, Integer, LocalDate, 커스텀 클래스
주의 가변 객체를 필드로 가질 경우, 방어적 복사를 통해 불변성 유지 필요

💬 덧붙임

불변 객체는 성능상 약간의 비용(불변 객체는 한 번 생성되면 내부 상태를 바꿀 수 없기 때문에, 값이 바뀌어야 할 경우 기존 객체를 수정하는 대신 새로운 객체를 만들어야 합니다.)이 들 수 있지만, 복잡한 시스템의 안정성을 높이고, 유지보수를 쉽게 만들어주는 핵심 설계 요소입니다.
특히 멀티스레드 환경이나 함수형 스타일 코딩을 추구한다면 적극적으로 사용하는 걸 추천드립니다.

'개발메모 > 간단정리' 카테고리의 다른 글

[간단정리] Java에서 Stack, Queue 그리고 Deque  (1) 2025.03.29
[간단정리] RDBMS, NoSQL 특징 및 차이점  (1) 2024.08.06
[간단정리] 객체 지향 프로그래밍 SOLID 원칙  (0) 2024.07.19
[간단정리] {JSON}, <XML> 이란?  (0) 2024.07.18
[간단정리] 메세지 큐(Message Queue)란?  (1) 2024.07.13
'개발메모/간단정리' 카테고리의 다른 글
  • [간단정리] Java에서 Stack, Queue 그리고 Deque
  • [간단정리] RDBMS, NoSQL 특징 및 차이점
  • [간단정리] 객체 지향 프로그래밍 SOLID 원칙
  • [간단정리] {JSON}, <XML> 이란?
99C0RN
99C0RN
1990.09.17
  • 99C0RN
    넌 잘하고 있어
    99C0RN
  • 전체
    오늘
    어제
    • -
      • IT
        • 잔기술
        • 네트워크
        • 면접 예상 질문
      • JAVA
        • 알고리즘
        • 기타
      • PHP
        • 기초
      • C#
        • 기초
      • 개발메모
        • 간단정리
        • WEB
        • 면접준비
        • 기타
      • 블랙홀
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • forl
  • 공지사항

  • 인기 글

  • 태그

    graphQL
    docker
    sort
    Queue
    springboot + graphql
    php
    https status code
    HTTP
    php 배열관련 함수
    알고리즘
    c#
    자바
    선택정렬
    웹개발
    console.table()
    격리수준
    기본문법 정리
    git svn 차이
    JavaScript
    JsonVue
    Java
    JDK Dynamic Proxy
    OpenFeign
    http 상태
    문자열 대표 클래스
    web
    SERVER 환경변수
    Algorithm
    vParam
    stack
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
99C0RN
[간단정리] Java에서 불변 객체(Immutable Object)란?
상단으로

티스토리툴바