String is Immutable In Java

개요

 Java 에서 String 을 어떻게 다루고 있는지 정리해보겠다. Java 에서 String 은 Immutable 로 즉 불변이다. Java 의 아버지 제임스 고슬링은 "I would use an immutable whenever i can." 이라고도 말했다. 어떠한 이유에서 이러한 말을 했는지 알아보자.

Immutable

먼저 Immutable 이란 무엇일까? 불변이란 생성 후에 내부 상태를 변경할 수 없다는 것을 나타낸다. 다시 말해, 생성 후 객체를 변수에 할당하고 나면 해당 객체 참조를 변경하거나 내부 상태를 변경할 수 없고 다시 생성해야지 해당 참조를 변경할 수 있다.

Why String is Immutable?

바로 caching, security, synchronization and performance 이다. 차례대로 확인해보자.

String pool

String pool 은 JVM 에 의해서 String 들이 저장되는 특수한 메모리 영역이다. literals 로 String 변수를 할당하게 되면 다른 변수일지라도 같은 내용일 경우 String pool 에 있는 같은 객체를 참조하게 된다. 이를 통해서 heap 영역을 절약할 수 있고 재사용성을 높인다.




s1 과 s2 는 literals 로 String 을 생성했기에 s1 변수가 할당 될 때 String pool 에 "hello world" 가 생성되고 s2 변수가 할당될 때 기존에 s1 이 가르키고 있는 String pool 의 "hello world" 를 참조하게 된다. 반대로 new String() 을 통해서 생성한 String 은 같은 참조를 가르키지 않는다. 항상 새로운 객체를 생성하게 된다.

Security

Java Application 에서 String 은 username, password, connection URLs, network connections, etc. 와 같이 민감한 자료를 저장하는데 사용된다. 따라서 보안에 있어서 매우 중요하다.


해당 메서드에서 username 이라는 믿을 수 없는 String 을 파라메터로 받는다. String 이 alpha numberic 으로 구성되어 있는지 보안 확인을 한다. 그리고 이후 다른 operation 들을 진행한다. 여기서 기억해야 할 점은 해당 method caller 는 아직 해당 userName 객체의 참조를 가지고 있다는것이다.

이 때, String 이 만약 Mutable 이라면 security check 를 수행하고 나서 update 가 실행될 때 method 에서 받은 String 이 변경되지 않았음을 보장할 수 없다. 다시 말해서, method caller 는 userName String 을 변경하게 된다면 해당 데이터에 대한 security check 는 아무 소용이 없어진다. 해당 경우에서 SQL Injection 에 매우 취약해진다.

Synchronization

Immutable 은 자동으로 String 을 thread safe 하게 해준다. multi thread 가 같은 String 객체에 접근해도 변경이 불가능하기 때문이다. 오직 String pool 에 새로운 객체를 생성할 뿐이다.

Hashcode Caching


HashMap, HashTable, HashSet, etc. 과 같이 많이 사용된다. 이에 따라 hashCode() 메서드 가 빈번하게 호출된다. Immutability 는 String 의 값이 변경되지 않는 것을 보장하고 이에 따라 hash code 값도 첫 번째 hashCode() 메서드 호출에서 계산되고 이후 부터는 계산된 값을 반환하도록 caching 된다. 이에 따라 collections 의 성능이 향상된다. 만약 String 이 Mutable 이였다면 String 이 변경될 때 마다 hash code 값도 변경 되기때문에 항상 계산을 다시 해주어야 할 것이다.

참조

https://www.artima.com/articles/james-gosling-on-java-may-2001#part13

https://www.baeldung.com/java-immutable-object

https://www.baeldung.com/java-string-pool


댓글

이 블로그의 인기 게시물

About Kafka Basic

About JVM Warm up

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

About G1 GC

sneak peek jitpack

About idempotent

C 언어 구조체의 포인터 멤버 변수

Synology NAS에 MariaDB 10에 Mysql workbench로 원격접속하기

About Websocket minimize data size and data transfer cost on cloud