늦은 프로그래밍 이야기

Mutable, Immutable 본문

내일배움캠프/Java 심화

Mutable, Immutable

한정규 2022. 12. 1. 19:31

Mutable

 - 생성된 이후 수정 가능

 - 이미 존재하는 객체(변수)에 재할당 (값 변경)

 - 값을 변경할 수 있는 메소드 제공

 - Mutable class인 경우 Getter와 Setter 존재

 - thread safe하지 않을 수 있음. (병렬처리시 값 보장할 수 없음)

 - StringBuffer, StringBuilder, java.util.Date 등이 해당

 

주소 값 확인

StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("Hello");
    System.out.println(stringBuilder);
    System.out.println(stringBuilder.hashCode());  
    // Hello
    // 1971489295
    stringBuilder.append("World");
    System.out.println(stringBuilder);
    System.out.println(stringBuilder.hashCode());
    // HelloWorld
    // 1971489295

 - .hashCode() 메소드를 사용하여 해당 객체의 메모리 주소값을 출력해보면 1971489295로 둘의 값이 같다.

 - 동일한 메모리 주소 1971489295의 값이 Hello에서 HelloWorld로 변했다.

 - 따라서 StringBuilder는 Mutable하게 동작한다.


Immutable

 - 생성된 이후 수정 불가

 - 이미 존재하는 객체(변수)여도 새로운 객체(변수)를 생성하여 재할당

 - 값을 변경할 수 있는 메소드 없음.

 - Immutable class일 경우 Getter와 Setter 미존재

 - thread safe (병렬처리시 문제 없음)

 - Legacy class, Wrapper class, String class 등이 해당.

 

주소 값 확인

String result = "Hello";
System.out.println(result);
System.out.println(result.hashCode());
// Hello
// 69609650
result = result.concat("World");
System.out.println(result);
System.out.println(result.hashCode());
// HelloWorld
// 439329280

 - .hashCode() 메소드를 사용하여 해당 변수의 메모리 주소값을 출력해보면 위 69609650, 아래 439329280로 둘의 값이 다르다.

 - 69609650의 주소값에 Hello를 담고, result라는 변수로 69609650 주소를 호출해 오다가

 - 439329280의 새로운 주소값에 HelloWorld를 담고, result 변수로 439329280의 주소값을 호출해 온다.

 - 따라서 String class는 Immutable하게 동작한다.


'내일배움캠프 > Java 심화' 카테고리의 다른 글

Thread  (0) 2022.12.02
추상클래스 vs 인터페이스  (0) 2022.12.01
Wrapper 클래스  (0) 2022.11.30
필드, 메소드의 구분 / Block / Scope  (0) 2022.11.30
JVM 구조  (0) 2022.11.30
Comments