์ถ์ฒ
ChatGPT
Java์์ String ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ๋ฆฌํฐ๋ด ๋ฐฉ์๊ณผ new ์์ฝ์ด๋ฅผ ์ฌ์ฉํ ์์ฑ์ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์์์ ์ค์ํ ์ฐจ์ด๊ฐ ์๋ค.
String ๊ฐ์ฒด ์์ฑ ๋ฐฉ์
1. ๋ฆฌํฐ๋ด๋ก ์์ฑ
String str1 = "Hello";
String str2 = "Hello";
๋ฉ๋ชจ๋ฆฌ ํ ๋น
๋ฆฌํฐ๋ด๋ก ์์ฑํ String ๊ฐ์ฒด๋ String Pool์ ์ ์ฅ๋๋ค. String Pool์ JVM์ Heap ๋ฉ๋ชจ๋ฆฌ ๋ด์ ํน๋ณํ ์์ญ์ผ๋ก, ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๋ค.
๋์ ์๋ฆฌ
- str1์ด ์์ฑ๋๋ฉด, JVM์ ๋จผ์ String Pool์ "Hello"๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ค.
- ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก์ด "Hello" ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด String Pool์ ์ ์ฅํ๋ค.
- str2๊ฐ ์์ฑ๋ ๋, String Pool์ ์ด๋ฏธ "Hello"๊ฐ ์กด์ฌํ๋ฏ๋ก, str2๋ ๋์ผํ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
ํน์ง
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ด ๋๊ณ , ๋์ผํ ๋ฌธ์์ด์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด๋ ํ ๋ฒ๋ง ์ ์ฅํ๋ค. ๋ฐ๋ผ์ "str1==str2"๋ true๋ฅผ ๋ฐํํ๋ค.
2. new ์์ฝ์ด๋ก ์์ฑ
String str3 = new String("Hello");
String str4 = new String("Hello");
๋ฉ๋ชจ๋ฆฌ ํ ๋น
new ํค์๋๋ฅผ ์ฌ์ฉํด ์์ฑํ String ๊ฐ์ฒด๋ Heap ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ String Pool์ ์ฌ์ฉํ์ง ์๊ณ , ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๋์ ์๋ฆฌ
- str3์ str4 ๊ฐ๊ฐ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ Heap ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๋ค.
- ์ด ๋ ๊ฐ์ฒด๋ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ๊ฐ์ง๋ฏ๋ก str3์ str4๋ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
ํน์ง
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๋จ์ด์ง ์ ์์ผ๋, String์ ๋ณํ์ด๋ ๋ณํ๋ ๊ฐ์ฒด๊ฐ ํ์ํ ๋ ์ ์ฉํ ์ ์๋ค. "str3==str4"๋ false๋ฅผ ๋ฐํํ๋ค.
์ฐจ์ด์ ์์ฝ
์ธก๋ฉด | ๋ฆฌํฐ๋ด ์์ฑ | new ์์ฝ์ด ์์ฑ |
๋ฉ๋ชจ๋ฆฌ ์์ญ | String Pool | Heap ๋ฉ๋ชจ๋ฆฌ |
๊ฐ์ฒด ์์ฑ ์ฌ๋ถ | ์ด๋ฏธ ์กด์ฌํ๋ฉด ์ฌ์ฌ์ฉ | ํญ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ |
์ฐธ์กฐ ๋น๊ต | ๋์ผํ ๋ฆฌํฐ๋ด์ ๋์ผ ๊ฐ์ฒด ์ฐธ์กฐ | ํญ์ ๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ |
ํจ์จ์ฑ | ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ , ๋น ๋ฆ | ๋ ํจ์จ์ , ๋๋ฆผ |
๊ฒฐ๋ก
- ๋ฆฌํฐ๋ด ๋ฐฉ์์ String Pool์ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๊ณ , ๋์ผํ ๋ฌธ์์ด์ ์ฌ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฌธ์์ด์ ๋ํด ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.
- new ์์ฝ์ด ๋ฐฉ์์ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ, ๋ณ๋์ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ค. ์ด ๋ฐฉ๋ฒ์ String์ ๋ณํ์ด ํ์ํ ๋ ์ ํฉํ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ
- ๊ณต์ ์๋ฐ ๋ฌธ์
- Java String Documentation
- ๋ด์ฉ: String ํด๋์ค์ ๋์ ์๋ฆฌ์ String Pool์ ๋ํ ์ค๋ช ์ ํฌํจํฉ๋๋ค.
- Java String Documentation
- ๊ถ์ ์๋ ์์
- "Effective Java" by Joshua Bloch
- ๋ด์ฉ: ์ด ์ฑ ์ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๋ฉฐ, ํนํ String ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
- ๋งํฌ: Effective Java
- "Java: The Complete Reference" by Herbert Schildt
- ๋ด์ฉ: ์๋ฐ ์ธ์ด์ ์ฌํ๋ ๊ฐ๋ ์ ๋ค๋ฃจ๋ฉฐ, String Pool๊ณผ Heap ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ๋ํ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค.
- ๋งํฌ: Java: The Complete Reference
- "Effective Java" by Joshua Bloch
- ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ฐ ์จ๋ผ์ธ ์๋ฃ
- Baeldung: Java String Pool
- ๋ด์ฉ: String Pool์ ๋์๊ณผ ์ฌ์ฉ ์์ ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ด์ ์ ์ค๋ช ํฉ๋๋ค.
- GeeksforGeeks: String Creation in Java
- ๋ด์ฉ: Java์์ String ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ๊ณผ ๊ทธ ์ฐจ์ด์ ์ ์ค๋ช ํฉ๋๋ค.
- Baeldung: Java String Pool
์ฐธ๊ณ ์๋ฃ์์์ ๋ด์ฉ์ ํ์ธํ๋ค.
๊ณต์ ์๋ฐ ๋ฌธ์ ์
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern--
intern() ํจ์์ ๋ํ ์ค๋ช ์ด๋ค.
public String intern()
Returns a canonical representation for the string object.
๋ฌธ์์ด ๊ฐ์ฒด์ ๋ํ ํ์ค ํํ์ ๋ฐํํฉ๋๋ค.
A pool of strings, initially empty, is maintained privately by the class String.
์ฒ์์๋ ๋น์ด ์๋ ๋ฌธ์์ด ํ์ String ํด๋์ค์ ์ํด ๋น๊ณต๊ฐ๋ก ์ ์ง๊ด๋ฆฌ๋ฉ๋๋ค.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
์ธํด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ํ์ ์ด๋ฏธ equals(Object) ๋ฉ์๋์ ์ํด ๊ฒฐ์ ๋ ์ด String ๊ฐ์ฒด์ ๋์ผํ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ ํ์ ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด ๋ฌธ์์ด ๊ฐ์ฒด๊ฐ ํ์ ์ถ๊ฐ๋๊ณ ์ด ๋ฌธ์์ด ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ฐํ๋ฉ๋๋ค.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
์์์ ๋ ๋ฌธ์์ด s์ t์ ๋ํด s.intern() == t.intern()์ s.equals(t)๊ฐ ์ฐธ์ธ ๊ฒฝ์ฐ์๋ง ์ฐธ์ ๋๋ค.
All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.
๋ชจ๋ ๋ฆฌํฐ๋ด ๋ฌธ์์ด๊ณผ ๋ฌธ์์ด ๊ฐ ์์ ํํ์์ ์ธํฐ๋๋ฉ๋๋ค. ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ Java™ ์ธ์ด ์ฌ์์ ์น์ 3.10.5์ ์ ์๋์ด ์์ต๋๋ค.
Returns:a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
๋ฐํ๊ฐ: ์ด ๋ฌธ์์ด๊ณผ ๋ด์ฉ์ด ๋์ผํ์ง๋ง ๊ณ ์ ํ ๋ฌธ์์ด ํ์์ ๋์จ ๊ฒ์ผ๋ก ๋ณด์ฅ๋๋ ๋ฌธ์์ด์ ๋๋ค.
intern ํจ์์ ๋ํ ์ค๋ช ์ ๋ณด๋, intern ํจ์๋ฅผ ํธ์ถํ๋ String ๊ฐ์ฒด๋ String Pool ์์ ์์ ์๋ ์๋ค๊ณ ํ๋ค. ๋ฆฌํฐ๋ด๋ก ์์ฑํ๋ String ๊ฐ์ฒด๋ String Pool ์์ ์กด์ฌํ๋ค. ์ด๋ฅผ ํตํด new String() ์์ฑ์๋ก ์์ฑํ๋ String ๊ฐ์ฒด์ ๋ฆฌํฐ๋ด๋ก ์์ฑํ๋ String ๊ฐ์ฒด๊ฐ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
"Effective Java" by Joshua Bloch
์ง์ ์ฑ ์ด ์๋ค.
์์ดํ 6์ "๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ" ์ฅ์์ String์ ๋ํด ๋์จ๋ค.
๋ค์ ์ฝ๋๋ ํ์ง ๋ง์์ผ ํ ๊ทน๋จ์ ์ธ ์์ด๋ ์ ์ฌํ ํ๋ฒ ์ดํด๋ณด์.
String s = new String("bikini); // ๋ฐ๋ผํ์ง ๋ง ๊ฒ!
์ด ๋ฌธ์ฅ์ ์คํ๋ ๋๋ง๋ค String ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ ๋ค. ์์ ํ ์ธ๋ฐ์๋ ํ์๋ค. ์์ฑ์์ ๋๊ฒจ์ง "bikini" ์์ฒด๊ฐ ์ด ์์ฑ์๋ก ๋ง๋ค์ด๋ด๋ ค๋ String๊ณผ ๊ธฐ๋ฅ์ ์ผ๋ก ์์ ํ ๋๊ฐ๋ค. ์ด ๋ฌธ์ฅ์ด ๋ฐ๋ณต๋ฌธ์ด๋ ๋น๋ฒํ ํธ์ถ๋๋ ๋ฉ์๋ ์์ ์๋ค๋ฉด ์ธ๋ฐ์๋ String ์ธ์คํด์ค๊ฐ ์๋ฐฑ๋ง ๊ฐ ๋ง๋ค์ด์ง ์๋ ์๋ค.
๊ฐ์ ๋ ๋ฒ์ ์ ๋ณด์.
String s = "bikini";
์ด ์ฝ๋๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋งค๋ฒ ๋ง๋๋ ๋์ ํ๋์ String ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค. ๋์๊ฐ ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ ๊ฐ์ ๋จธ์ง ์์์ ์ด์ ๋๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํจ์ด ๋ณด์ฅ๋๋ค.[JLS, 3.10.5]
์ฑ ์ ๋ด์ฉ์ ํตํด new String() ์์ฑ์๋ก String ์ธ์คํด์ค๊ฐ ๋งค๋ฒ ์์ฑ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์จ๋ผ์ธ ์๋ฃ
3. Strings Allocated Using the Constructor
3. ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น๋ ๋ฌธ์์ด
When we create a String via the new operator, the Java compiler will create a new object and store it in the heap space reserved for the JVM.
new ์ฐ์ฐ์๋ฅผ ํตํด ๋ฌธ์์ด์ ์์ฑํ๋ฉด Java ์ปดํ์ผ๋ฌ๋ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ JVM์ฉ์ผ๋ก ์์ฝ๋ ํ ๊ณต๊ฐ์ ์ ์ฅํฉ๋๋ค.
Every String created like this will point to a different memory region with its own address.
์ด๋ ๊ฒ ์์ฑ๋ ๋ชจ๋ ๋ฌธ์์ด์ ์์ฒด ์ฃผ์๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋ฆฌํต๋๋ค.
์ฌ๊ธฐ์ interning ๊ฐ๋
๋ ์๊ฐํ๋ค.
2. String Interning
Thanks to the immutability of Strings in Java, the JVM can optimize the amount of memory allocated for them by storing only one copy of each literal String in the pool. This process is called interning.
Java์์ ๋ฌธ์์ด์ ๋ถ๋ณ์ฑ ๋๋ถ์ JVM์ ํ์ ๊ฐ ๋ฆฌํฐ๋ด ๋ฌธ์์ด์ ์ฌ๋ณธ ํ๋๋ง ์ ์ฅํ์ฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ์ธํด์ด๋ผ๊ณ ํฉ๋๋ค.
String s = new String(“Welcome”);
In such a case, JVM will create a new string object in normal (non-pool) heap memory and the literal “Welcome” will be placed in the string constant pool. The variable s will refer to the object in the heap (non-pool)
์ด๋ฌํ ๊ฒฝ์ฐ JVM์ ์ผ๋ฐ(ํ์ด ์๋) ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฆฌํฐ๋ด "Welcome"์ด ๋ฌธ์์ด ์์ ํ์ ๋ฐฐ์น๋ฉ๋๋ค. ๋ณ์ s๋ ํ(ํ์ด ์๋)์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
์ฌ๊ธฐ์ ๋จธ๋ฆฌ๋ฅผ ์ธ๋งธ๋ค. s ์ธ์คํด์ค ์์ฑ์ String Pool ์ธ๋ถ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์๋๋ฐ, ์ด ๊ณผ์ ์์ String Pool์ "Welcome" String์ด ํ ๋น๋๋ค๋ ๊ฒ์ผ๋ก ์ดํดํ๋ค.