본문 바로가기

programming/java, spring

Java의 constant pool

Constant Pool은 Java의 메모리 영역 중 하나로, String 리터럴들이 저장되는 풀이다. String 리터럴은 코드에 직접 작성된 문자열을 의미하며, 메모리 내에서 재사용될 수 있도록 관리된다. 따라서 같은 리터럴 값을 가지는 String 변수들은 Constant Pool 내에서 같은 객체를 참조하게 된다.

 

예를 들어, 다음과 같은 코드에서

 

String a = "hello world";
String b = "hello world";

 

위의 경우, "hello world"라는 리터럴은 Constant Pool에 저장되며, 변수 a와 b는 같은 String 객체를 참조하게 된다. 따라서 a == b는 true다.

그러나, 다음과 같이 String 객체를 연결하는 경우에는 새로운 String 객체가 생성되어 Constant Pool 공유하지 않게 된

 

String c = "hello";
c += " world";

 

c += " world" 연산은 새로운 String 객체를 생성하게 된다. 이는 연결된 문자열 "hello world"를 가지는 새로운 String 객체를 Heap 영역에 생성하고, 변수 c는 이 새로운 객체를 참조하게 된다. 따라서, a == c는 false가 된다.

 

따라서, 반복적인 문자열 연결이 필요한 경우에는 StringBuffer StringBuilder 클래스를 사용하는 것이 좋다. 이들 클래스는 내부 버퍼를 사용하여 문자열 연결 작업을 수행하므로, 새로운 객체를 생성하지 않고도 효율적으로 문자열을 처리할 있다.

 

StringBuffer와 StringBuilder는 둘 다 가변(mutable)한 문자열을 처리하기 위한 클래스다. 그러나 두 클래스 간에는 몇 가지 중요한 차이점이 있다.

 

 

  1. 동기화(Synchronization)
    •  StringBuffer: 동기화(synchronized)된 메서드를 제공하여 멀티스레드 환경에서 안전하게 사용할 수 있다. 즉, 여러 스레드가 동시에 StringBuffer 객체를 수정하려 할 때 동기화 메커니즘을 통해 스레드 안전성을 보장한다.
    •  StringBuilder: 동기화를 제공하지 않으므로, 단일 스레드 환경에서의 사용을 가정한다. 멀티스레드 환경에서는 동기화 처리를 개발자가 직접 해주어야 한다.
  2.  성능
    •  StringBuffer: 동기화 처리로 인해 추가적인 성능 오버헤드가 발생할 수 있다.
    •  StringBuilder: 동기화 처리가 없기 때문에 StringBuffer보다 더 빠른 성능을 제공한다. 단, 멀티스레드 환경에서의 안전성은 보장되지 않는다.

일반적으로 단일 스레드 환경에서 문자열 연결 작업을 수행할 때는 StringBuilder를 사용하는 것이 좋다. StringBuilder는 동기화를 고려하지 않기 때문에 더 빠른 성능을 제공하며, 단일 스레드 환경에서는 안전하다.

반면에 멀티스레드 환경에서 문자열 연결 작업을 수행해야 한다면 StringBuffer를 사용해야 한다. StringBuffer는 동기화된 메서드를 제공하여 여러 스레드가 동시에 객체를 수정해도 안전하게 처리할 수 있다.

 

요약하자면, 단일 스레드 환경에서는 StringBuilder 사용하고 멀티스레드 환경에서는 StringBuffer 사용하는 것이 좋다. 그러나 동기화 기능이 필요하지 않은 경우에는 StringBuilder 언제든 사용할 있다.