본문 바로가기

공부 정리/Java

mutable vs immutable

728x90
반응형

개요

자바의 클래스는 mutable과 immutable 2가지가 존재합니다. 2개의 차이점을 알아보겠습니다.

 

 

mutable과 immutable


mutable 객체는 초기화 된 이후 변경이 가능합니다. 하지만, immutable 객체는 초기화된 이후 변경이 불가능합니다.

자바는 String을 제외하고 기본적으로 mutable합니다.

 

immutable

  • int, long, float, double과 같은 원시 객체들
  • legacy 클래스(HasTable, Stack, Dictionary, Properties, Vector)
  • Wrapper 클래스(BooleanCharactor, Byte...)
  • String 클래스

getter 메서드만 사용이 가능하고 setter는 제공되지 않습니다.

 

mutable 

  • Java.util.Date
  • StringBuilder
  • StringBuffer

mutable 객체를 변경하여도 새로운 객체가 생성되지 않습니다. 존재하는 객체의 값을 변경합니다.

 

 

 

자바는 mutable 하기 때문에 아래와 같이 IntegerPair 클래스의 변수 x에 p.x로 값을 변경 할 수 있습니다.

public class IntegerPair {
    int x;
    int y;

    IntegerPair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

IntegerPair p = new IntegerPair(5, 10);
// p.x = 5, p.y = 10

p.x = 50;
// p.x = 50, p.y =

 

 

다음과 같이 클래스를 final로 선언하더라도, 변수는 여전히 변경이 가능합니다.

public class IntegerPair {
    int x;
    int y;

    IntegerPair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

final IntegerPair p = new IntegerPair(5, 10);
// p.x = 5, p.y = 10

p.x = 50;
// p.x = 50, p.y = 10

 

만약에, immutable하게 만들고 싶다면, 모든 변수들을 private과 final로 선언하면 됩니다.

public class IntegerPair {
    private final int x;
    private final int y;

    IntegerPair(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

IntegerPair p = new IntegerPair(5, 10);

p.x = 50;
// Compilation error: cannot assign a value to a final variable

 

자바에서 String은 변경하는 것은 사실 새로운 String을 만들고 복사하는 것입니다. 아래와 같이 변수 first는 변경에 따라 주소값이 바뀝니다. 이는 새로운 String이 immutable해서 새로운 String이 만들어져서 복사 되었기 때문입니다.

String first = "first";

System.out.println(first.hashCode());
// prints something

first = first + "!";

System.out.println(first.hashCode());
// different string, different hash code

 

참고

https://www.javatpoint.com/mutable-and-immutable-in-java

728x90
반응형

'공부 정리 > Java' 카테고리의 다른 글

Entity vs Value Object 차이점  (0) 2023.06.30
스프링 AOP (1) - 동적 프록시  (0) 2023.01.11
StringBuffer vs StringBuilder  (0) 2022.11.01
Java 8에 등장한 Optional이란?  (0) 2022.10.29
자바 8에 추가된 Date Time API  (0) 2022.10.28