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. 와 같이 민감한 자료를 저장하는데 사용된다. 따라서 보안에 있어서 매우 중요하다.
이 때, 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
댓글
댓글 쓰기