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 idempotent

About G1 GC

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

sneak peek jitpack

Optimistic Concurrency Control VS Pessimistic Concurrency Control - What should i choose?

DDD(Domain Driven Design) - Aggregate (어그리게잇)

Strategy Pattern In Spring (feat. JPA)