JAVA

[Java] Mutable & Immutable

lakelight 2022. 11. 23. 14:34
728x90
반응형

Mutable과 Immutable

mutable

변할 수 있는, 잘 변하는 / Java: 가변 객체

immutable

변할 수 없는, 불변의 / Java: 불변 객체

 

Java Object

자바 객체는 기본적으로 Heap 영역에 할당되고, Stack 영역에 참조값을 갖는 참조 타입 변수를 통해 데이터에 접근합니다. 이러한 객체는 Mutable Object, Immutable Object로 나눌 수 있습니다.

 

[Java] 메모리 관리 - 스택, 힙, Garbage Collection

Stack 영역 Heap 영역에 생성된 객체 타입의 데이터들에 대한 참조를 위한 값들이 할당됩니다. 원시타입(Primitive Types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당됩니다. 원시

lakelight.tistory.com

 

Mutable Object

Heap  영역에 생성되어 객체의 값을 변경할 수 있습니다. 대표적인 가변 객체로는 List, ArrayList, HashMap, StringBuilder, StringBuffer가 있습니다. 가변 객체를 멀티스레드 환경에서 사용하려면 동기화 처리가 필요합니다. 가변 객체 중 StringBuffer는 동기화 처리가 되어있는 객체 입니다.

public class Test {
    public static void main(String[] args) {
   
        // StringBuilder 객체가 저장되는 메모리 위치 확인
        StringBuilder stringBuilder = new StringBuilder();
        System.out.println("stringBuilder memory: " + System.identityHashCode(stringBuilder));
        
        stringBuilder.append("Lake");
        System.out.println("stringBuilder memory: " + System.identityHashCode(stringBuilder));
        
        stringBuilder.append("Light");
        System.out.println("stringBuilder memory: " + System.identityHashCode(stringBuilder));

    }
}

// Output
// stringBuilder memory: 1143839598
// stringBuilder memory: 1143839598
// stringBuilder memory: 1143839598
값이 변경되어도 메모리 주소 값은 변경되지 않는 것을 확인할 수 있습니다.

 

Immutable Object

불변 객체는 데이터 변경이 불가능한 객체를 말합니다. 이는 데이터 수정이 불가능하다는 의미보다는 힙 영역에 저장된 값을 수정할 수 없다는 의미입니다. 즉, 객체를 생성하고 그 값을 수정하게 되면 다른 주소 값에 객체가 새로 생성되는 방식으로 수정됩니다. 그리고 기존 객체는 GC(Galbage Collection)에 의해 사라지게 됩니다. 불변 객체의 종류는 String, Boolean, Integer, Float, Long, Double 등이 있습니다.

public class Test {
    public static void main(String[] args) {

        String result = "Lake";
        System.out.println("result memory: " + System.identityHashCode(result));

        result = result.concat("Light");
        System.out.println("result memory: " + System.identityHashCode(result));
    }
}

// Output
// result memory: 1289696681
// result memory: 1919892312
String 객체 수정 시 메모리 주소 값이 다른 것을 확인할 수 있습니다. 

 

Create Immutable Object

불변 객체를 생성하기 위해서는 5가지 방법이 있습니다.

  1. 클래스를 final로 선언하기
  2. 모든 클래스 변수를 private와 final로 선언하기
  3. 객체를 생성하기 위한 생성자 또는 정적 팩토리 메소드를 추가하기
  4. 참조에 의해 변경 가능성이 있는 경우 방어적 복사를 이용하여 전달하기
  5. Setter 메서드 구현 하지 않기

 

Immutable Object Avantages

  • Thread-Safe 하여 멀티스레드 환경에 유용하며, 동기화를 고려하지 않아도 됩니다.
    • 멀티 스레드 환경에서 동기화 문제는 공유 자원에 동시에 접속하기 때문인데, 공유 자원이 불변의 자원이라면 동기화를 고려하지 않아도 됩니다.
  • 실패 원자적인 메소드를 만들 수 있습니다.
    • 불변 객체를 사용하는 작업에서 예외가 발생해도 메소드 호출 전의 상태를 유지하기 때문에 예외가 발생해도 오류가 발생하지 않은 것처럼 다음 로직을 처리할 수 있습니다.

 

Immutable Object Disavantages

  • 객체의 값이 할당될 때마다 새로운 객체가 필요합니다. 따라서 메모리 누수와 성능저하를 발생 시킬 수 있습니다.

 

 

[참고]

1. [Java] Mutable과 Immutable

2. Java의 Mutable과 Immutable

3. Immutable, Mutable 객체

 

728x90
반응형