늦은 프로그래밍 이야기
Mutable, Immutable 본문
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 |