[Java] String Constant pool๊ณผ Heap ์์ญ์ ๋ํด
by rlaehddnd0422public class Person {
private String name = "KIM";
public String getName() {
return name;
}
private void introduce() {
System.out.println("My Name is " + this.name);
}
}
String์ ๋ถ๋ณ์ฑ์ ๋ํด ๊ณต๋ถํ๋ฉด์ ์๋ฌธ์ ์ด ๋ค์์ต๋๋ค.
๋ง์ฝ ์์ ํด๋์ค๋ก ์ธ์คํด์ค๊ฐ 100๊ฐ ์์ฑ๋๋ค๋ฉด ๋ฉค๋ฒ๋ณ์ name์ 100๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์๊น?
์๋๋ฉด 100๊ฐ์ ๊ฐ ์ธ์คํด์ค๋ ๋ฉค๋ฒ๋ณ์ name์ ๋ํด ํ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ ์์๊น?
Person ํด๋์ค์ ์ธ์คํด์ค๋ new ํค์๋๋ก ์์ฑ๋์ด Heap ์์ญ์์ ๊ด๋ฆฌ๋๋ฏ๋ก ์ธ์คํด์ค ๋ณ์ ๋ํ Heap ์์ญ์์ ๊ด๋ฆฌ๋๋ค๊ณ ์๊ฐํด์ 100๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ๊ฒ ๊ฐ์์ง๋ง, ์ค์์ ๊ทธ๋ ์ง ์๊ณ ์๋์ ๊ฐ์ด String Constant pool์์ ๊ด๋ฆฌ๋๊ณ ์์์ต๋๋ค.
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
Person p2 = new Person();
System.out.println(p.getName().equals(p2.getName())); // ๋๋ฑ์ฑ ๊ฒ์ฌ๊ฒฐ๊ณผ : true ( ๊ฐ์ด ๊ฐ์์ง )
System.out.println(p.getName() == p2.getName()); // ๋์ผ์ฑ ๊ฒ์ฌ๊ฒฐ๊ณผ : true ( ์ฃผ์๊น์ง ๊ฐ์์ง )
}
}
์ด ์๋ฌธ์ ์ ๋ํด ์ ํํ ์ดํดํ๊ณ ์ ํ๋ค๋ฉด String Constant Pool๊ณผ Heap ์์ญ์ ๋ํด ์ ํํ ์์์ผ ํฉ๋๋ค. ์ง๊ธ๋ถํฐ JVM์ String ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง ์์๋ด
์๋ค.
์ฐ์ Java์์ String ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ์ฒซ ๋ฒ์งธ. ๋ฆฌํฐ๋ด์ธ ์ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์
- EX) String str = "HI";
- ๋ ๋ฒ์งธ. new ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์
- EX) String str = new String("HI");
์ด ๋ ๊ฐ์ง ๋ฐฉ์์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณด๋ฉด ๊ฐ์ ๋ณด์ด์ง๋ง "์ด๋" ๊ณณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ ์ฅํ๋๋์ ๋ฐ๋ฅธ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฉ์(๋ฆฌํฐ๋ด)์ Heap์์ญ ๋ด๋ถ์ String constant pool์ด๋ผ๋ ์์ญ์, ๋ ๋ฒ์งธ ๋ฐฉ์(new)์ Heap ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ์๋ถํฐ ์ดํด๋ด
์๋ค.
String Constant Pool
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฆฌํฐ๋ด๋ก ๋ฌธ์์ด์ ์ ์ฅํ์ฌ ๋ String ๊ฐ์ฒด ๋ชจ๋ ๋ค ์คํธ๋ง ํ์ ์ฌ์ฉํ์์ต๋๋ค. ์ด ๋ ๋๋ฑ์ฑ ๋ฟ๋ง ์๋๋ผ ๋์ผ์ฑ ๊น์ง ๋ณด์ฅ๋๋๋ฐ ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊ฑธ๊น์?
public class ImmutableStringTest3 {
public static void main(String[] args) {
String s1 = "HELLO";
String s2 = "HELLO"; // String s2 = s1;
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // true
}
}
String pool์ String literal๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๊ฐ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ํด๋น ๊ฐ์ฒด๋ String pool์ reference๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด ๋์ผ์ฑ๊น์ง ๋ณด์ฅ๋ฐ๊ฒ ๋ฉ๋๋ค.
- String s1 = "HELLO" : literal๋ก ์์ฑ๋จ โก๏ธ String Constant Pool์ ํด๋น String ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์๋์ง ๊ฒ์ฌ โก๏ธ ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น
- String s2 = "HELLO" : literal๋ก ์์ฑ๋จ โก๏ธ String Contant Pool์ ํด๋น String ๊ฐ๊ณผ ๋์ผํ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์๋์ง ๊ฒ์ฌ โก๏ธ ์์ผ๋ฏ๋ก ์ฐธ์กฐ๋ฅผ ํตํ ๋์ (s2 = s1;)
+ Java 7 ๋ฒ์ ๋ถํฐ String Pool์ด Heap ์์ญ ๋ด๋ถ๋ก ๋ค์ด์ค๊ฒ ๋๋ฉด์ String pool์์๋ GC๊ฐ ์ํ๋๊ฒ ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ ์ํ ๋ํ ์ค์ด๋ค๊ฒ ๋์์ต๋๋ค. ์ด๋ก ์ธํด String Constant Pool์ Runtime์์ ๋ง์ ์์ String ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋๋ผ๋ ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.
Heap ์์ญ
๋ฐ๋ฉด new ํค์๋๋ก ์์ฑ๋ ์ธ์คํด์ค๋ Heap ์์ญ์ ์ ์ฅ๋ฉ๋๋ค. ๋ฐ๋ผ์ String pool๊ณผ ๋ฌ๋ฆฌ ๊ฐ์ ์ ์ผ๋ก ์๋ก์ด ์ธ์คํด์ค ์ฃผ์๊ฐ์ ๊ฐ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
public class ImmutableStringTest3 {
public static void main(String[] args) {
String s1 = new String("HELLO");
String s2 = new String("HELLO");
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // false
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด s1์ s2๊ฐ Heap ์์ญ์ ์์ฑ๋จ์ผ๋ก์จ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋๋ฑ์ฑ์ ๊นจ์ง์ง ์์ง๋ง, ๋์ผ์ฑ(๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํจ)์ด ๊นจ์ง๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- String s1 = new String("HELLO") : new๋ก ์์ฑ๋จ โก๏ธ ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- String s2 = new String("HELLO") : new๋ก ์์ฑ๋จ โก๏ธ ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
new ํค์๋๋ฅผ ํตํด ์์ฑ๋ ๋ชจ๋ ๊ฐ์ฒด๋ Heap ์์ญ์ ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๊ฒ ๋์ด ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋๋ฑ์ฑ์ ๋ณด์ฅํ ์ง ๋ชฐ๋ผ๋, ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๊ฐ๊ฐ์ Heap ์์ญ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ๋์ผํ์ง ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ ์์ String pool์ ์ด์ฉํ๋๋, new ํค์๋๋ก Heap์์ญ์ ์ด์ฉํ๋๋์ ์ฐจ์ด๋ฅผ ๋ณผ ์ ์์์ต๋๋ค.
- ๋ฆฌํฐ๋ด์ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๊ฐ์ฒด๋ String pool์ ์ ์ฅ ๋๊ณ , ์ด ๋ String pool์ ๊ฒ์ฌํ์ฌ ๊ฐ์ด ๋๋ฑํ ๊ฒฝ์ฐ ๊ฐ์ ๊ณณ์ ์ฐธ์กฐํ๋๋ก ์ค์ ๋์ด ์์ด ๋์ผ์ฑ๊น์ง ๋ณด์ฅ๋ฐ์ต๋๋ค.
- new ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ Heap ์์ญ์ ์๋ก ๋ค๋ฅธ ๊ณต๊ฐ์ ์ ์ฅ๋๊ณ , ์ด ๊ฒฝ์ฐ์๋ ๊ฐ์ด ๊ฐ๋๋ผ๋ ์ฐธ์กฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ผ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ ๋ค Heap ์์ญ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค๋ ์ ์ ๋์ผํฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋คํ์ฑ(Polymorphism)์ ๋ํด (0) | 2023.09.27 |
---|---|
[Java] ์์(Inheritance)์ ๋ํด (1) | 2023.09.27 |
[Java] ์ถ์ ํด๋์ค(abstract class)์ ๋ํด (2) | 2023.09.26 |
[Java] ์ ๊ทผ ์ ์ด์(public, protected, default, private)์ ๋ํด (0) | 2023.09.25 |
[Java] this์ this()์ ๋ํด (0) | 2023.09.25 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422