오랜만에 자바를 다시 보려고 하니 여러가지 까먹은게 많다.
그래서 정리를 해보려고 한다.
메모리 측면 관리와 성능 최적화 측면을 보겠다.
1. 인스턴스화 (Instantiating a String)
인스턴스화는 new 키워드를 사용하여 새로운 문자열 객체를 생성하는 방법입니다.
String a = new String("Hello");
String b = new String("Hello");
위 코드는 'a','b'라는 각각 새로운 'string' 객체를 힙 메모리에 생성한다.
비록 같은 "Hello" 라는 문자열을 가지지만, 두 객체는 서로 다른 메모리 주소를 가지고있다.
'a'와 'b'는 각각 독립적인 객체를 가리키고 있으며, 하나가 변경되거나 가비지 컬렉션의 대상이 되더라도 다른 하나에는 영향을 미치지 않는다.
String Pool의 경우
만약 다음과 같이 String Pool을 사용하는 경우:
String a = "Hello";
String b = "Hello";
이 경우, a와 b는 둘 다 같은 "Hello"라는 문자열 리터럴을 가리킵니다. 자바 컴파일러는 "Hello"라는 동일한 문자열 리터럴이 여러 번 사용될 경우, 이를 String Pool에서 재사용합니다. 따라서 a와 b는 같은 메모리 주소를 참조하게 됩니다.
String Pool의 특징:
- 중복 방지: 동일한 문자열 리터럴에 대해 메모리를 재사용함으로써 메모리 효율을 높입니다.
- 불변성: String Pool에 저장된 문자열은 불변(immutable)입니다. 따라서 문자열 리터럴이 한 번 생성되면 변경할 수 없습니다.
3. 차이점 요약
- 메모리 관리: new String()을 사용하면 항상 새로운 객체가 생성되며, 힙 메모리에 저장됩니다. 반면에, String Pool을 사용하는 리터럴 방식에서는 동일한 문자열에 대해 메모리를 재사용합니다.
- 참조: 인스턴스화된 문자열은 서로 다른 객체를 참조하지만, String Pool을 사용하는 리터럴은 같은 객체를 참조합니다.
- 가비지 컬렉션: 인스턴스화된 객체는 더 이상 참조되지 않을 경우 가비지 컬렉션의 대상이 될 수 있습니다. 그러나 String Pool에 있는 리터럴은 가비지 컬렉션의 대상이 되지 않습니다. 왜냐하면 이들은 JVM이 종료될 때까지 메모리에 남아있기 때문입니다.
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b); // false
String c = "Hello";
String d = "Hello";
System.out.println(c == d); // true
결론
자바에서 문자열을 다룰 때, new 키워드를 사용하여 문자열 객체를 인스턴스화하면 항상 새로운 객체가 생성됩니다. 반면에, 문자열 리터럴을 사용하면 자바의 String Pool에서 동일한 문자열 리터럴을 공유하게 됩니다. 이러한 차이를 이해하면 메모리 사용과 성능 최적화 측면에서 효율적인 코드를 작성하는 데 도움이 됩니다.
'BE,FE(개발) > Java,Python (server)' 카테고리의 다른 글
| 참조 카운팅과 순환 참조의 이해 강화 (0) | 2024.08.16 |
|---|---|
| 이제 와서 정리해보는 파이썬과 자바의 GC(garbage Collector) (0) | 2024.08.16 |
| 파이썬에서 SQL 쿼리 관리: .py 파일 vs YAML 파일 (0) | 2024.07.30 |
| Minimal APIs vs. Controllers: 무엇이 더 나을까요? (0) | 2024.07.29 |
| 면접 공부를 하다 DI를 공부하다.(Spring) (0) | 2023.01.14 |