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)한 문자열을 처리하기 위한 클래스다. 그러나 두 클래스 간에는 몇 가지 중요한 차이점이 있다.
- 동기화(Synchronization)
- StringBuffer: 동기화(synchronized)된 메서드를 제공하여 멀티스레드 환경에서 안전하게 사용할 수 있다. 즉, 여러 스레드가 동시에 StringBuffer 객체를 수정하려 할 때 동기화 메커니즘을 통해 스레드 안전성을 보장한다.
- StringBuilder: 동기화를 제공하지 않으므로, 단일 스레드 환경에서의 사용을 가정한다. 멀티스레드 환경에서는 동기화 처리를 개발자가 직접 해주어야 한다.
- 성능
- StringBuffer: 동기화 처리로 인해 추가적인 성능 오버헤드가 발생할 수 있다.
- StringBuilder: 동기화 처리가 없기 때문에 StringBuffer보다 더 빠른 성능을 제공한다. 단, 멀티스레드 환경에서의 안전성은 보장되지 않는다.
일반적으로 단일 스레드 환경에서 문자열 연결 작업을 수행할 때는 StringBuilder를 사용하는 것이 좋다. StringBuilder는 동기화를 고려하지 않기 때문에 더 빠른 성능을 제공하며, 단일 스레드 환경에서는 안전하다.
반면에 멀티스레드 환경에서 문자열 연결 작업을 수행해야 한다면 StringBuffer를 사용해야 한다. StringBuffer는 동기화된 메서드를 제공하여 여러 스레드가 동시에 객체를 수정해도 안전하게 처리할 수 있다.
요약하자면, 단일 스레드 환경에서는 StringBuilder를 사용하고 멀티스레드 환경에서는 StringBuffer를 사용하는 것이 좋다. 그러나 동기화 기능이 필요하지 않은 경우에는 StringBuilder를 언제든 사용할 수 있다.
'programming > java, spring' 카테고리의 다른 글
| 스프링 컨테이너와 IoC (1) | 2023.07.09 |
|---|---|
| 트랜잭션 격리수준과 JPA 낙관적 락을 통한 동시성 제어 (4) | 2023.03.11 |
| Hibernate 내부 클래스 PersistentBag (3) | 2023.03.03 |
| Spring Security 인증 내부를 파헤쳐보자 (2) | 2023.02.25 |
| jacoco를 적용해 테스트 커버리지를 높여보자 (2) | 2023.02.22 |