[Java] : Mutable 객체와 Immutable 객체의 차이점

dohyoungK·2024년 4월 30일
0

면접 스크립트

목록 보기
25/28

[Java] : Mutable 객체와 Immutable 객체의 차이점


자바 객체는 기본적으로 힙 영역에 할당되고 스택 영역에 참조값을 갖는 참조 타입 변수를 통해 데이터에 접근한다. 이러한 객체는 Mutable(가변) 객체와 Immutable(불변) 객체로 나눌 수 있다.

Mutable(가변) 객체

Mutable(가변) 객체는 힙 영역에 생성된 객체를 변경할 수 있다.

List, ArrayList, HashMap, StringBuilder, StringBuffer 등 우리가 사용하는 대부분의 객체는 가변 객체이다.

그리고 멀티스레드 환경에서 가변 객체를 사용하기 위해서는 동기화 처리가 필요하다.


Immutable(불변) 객체

Immutable(불변) 객체는 데이터 변경이 불가능한 객체를 말한다.

불변 객체는 객체의 데이터 수정이 아예 불가능 한 것이 아니라, 힙 영역에 저장된 값을 수정할 수 없는 것이다.

불변 객체의 종류로는 String, Boolean, Integer, Float, Long, Double 등이 있다.

Integer num = 1;

num = 3;

이렇게 불변 객체의 수정이 가능한 이유는 위에서 말했듯이 힙 영역에 저장된 값이 수정된 게 아니라, 힙 영역에 새로운 객체가 생성되었기 때문이다.

불변 객체를 만드는 방법

자바에서는 불변성을 확보할 수 있도록 final 키워드를 제공한다.

자바에서 변수들은 기본적으로 가변적인데, final 키워드를 사용해 참조값을 변경할 수 없도록 해 불변성을 확보할 수 있다.

final Integer num = 1;

num = 3;

불변 객체의 장단점

  • 장점
    Thread-safe 하여 멀티스레드 프로그래밍에 유용하며, 동기화를 고려할 필요가 없다.

멀티스레드 환경에서의 동기화 문제 발생 이유는 공유 자원에 대한 쓰기 때문이다. 하지만 만약 공유 자원이 불변이라면 항상 동일한 값을 반환하기 때문에 동기화를 고려할 필요가 없다.

따라서 이는 안정성을 보장하고, 동기화를 하지 않음으로 인해 성능상의 이점도 가질 수 있다.

  • 단점
    객체의 값이 할당될 때마다 새로운 객체가 필요하므로 메모리 누수와 성능저하가 발생할 수 있다.

0개의 댓글