์๋ฐ์์ String์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํ์
์ค ํ๋์ด๋ค. ๋จ์ํ ๋ฌธ์์ด ํ์
์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง ์ฌ์ค String์ Java ์ธ์ด ์ ์ฒด์์ ํน๋ณํ๊ฒ ์ทจ๊ธ๋๋ ๊ฐ์ฒด์ด๋ค.
primitive ํ์
์ ์๋์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์ฒ๋ผ ๋์ํ์ง๋ ์๋๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ณ๋์ ๊ด๋ฆฌ ์ ๋ต์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. Java์ String์ด ์ ํน๋ณํ์ง ํต์ฌ ํน์ง์ ์ค์ฌ์ผ๋ก ์ดํด๋ณด์.
์ฒซ ๋ฒ์งธ ํน์ง์ String์ ๋ถ๋ณ์ด๋ผ๋ ์ ์ด๋ค. ์ฆ, ํ ๋ฒ ์์ฑ๋ ๋ฌธ์์ด ๊ฐ์ฒด๋ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค. โBlueโ๋ผ๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์ โCoolโ์ ๋ถ์ฌ โBlueCoolโ๋ก ๋ง๋ค ๋ ์ค์ ๋์์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์์ ํ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
String me = "Blue";
me += "Cool";
// ๊ฒฐ๊ณผ์ ์ผ๋ก "BlueCool"์ด๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
๋ถ๋ณ์ฑ์ ๋จ์ํ ์ธ์ด์ ํน์ฑ์ด ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก Java ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ์ค์ํ ์ญํ ์ ํ๋ค.
๋ ๋ฒ์งธ ํน์ง์ JVM์ด ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ํ์์ ๊ด๋ฆฌํ๋ค๋ ์ ์ด๋ค. ์ด๋ฅผ String Intern Pool ๋๋ ๋ฌธ์์ด ์์ ํ(String Constant Pool) ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฐ ์ฝ๋์์ โBlueCoolโ ๊ฐ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ๋๋ผ๋ JVM์ ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ ํ ๋ฒ ๋ง๋ ๋ฌธ์์ด์ ํ์ ์ ์ฅํด๋๊ณ ์ฌ์ฌ์ฉํ๋ค.
String blue = "BlueCool";
String cool = "BlueCool"; // ๋ฌธ์์ด ํ์์ ๊ฐ์ ๊ฐ์ฒด ์ฌ์ฉ
System.out.println(blue == cool); // true
์ ์ฝ๋์์ โBlueCoolโ ์ด๋ผ๋ ๋ฆฌํฐ๋ด์ ์ค์ ๋ก ํ์ ๋จ ํ๋๋ง ์์ฑ๋๋ฉฐ blue์ cool ๋ณ์๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ == ๋น๊ต๋ true๊ฐ ๋๋ค.
์ด ๋ฉ์ปค๋์ฆ ๋๋ถ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์๋ค.
์ด Intern Pool ๊ธฐ๋ฅ์ ์๋ฐ์ ๋ฌธ์์ด ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๋ ํต์ฌ ์์ ์ค ํ๋์ด๋ค.
์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ String์ ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ์๋ก์ด ๊ฐ์ ๋ํ๋ ์ฐ์ฐ์ ์ํํ ๋๋ง๋ค ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์์ ํ ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์๋์ ๊ฐ์ด + ์ฐ์ฐ์ด ๋ฐ๋ณต๋๋ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
String result = "";
for (int i = 0; i < 10000; i++) {
result += i; // ๋งค ๋ฐ๋ณต๋ง๋ค ์๋ก์ด String ๊ฐ์ฒด ์์ฑ
}
์ด๋ฐ ํจํด์ ๋ฃจํ๊ฐ ๊ธธ์ด์ง์๋ก ์์ฒญ๋ ์์ ์์ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ๋๊ณ ์ด๋ GC ๋ถํ ์ฆ๊ฐ์ ํจ๊ป ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์์๋ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ค.
๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ณ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ธ๋ค. ๋๊ธฐํ๊ฐ ํ์ ์๋ ํ๊ฒฝ์์ ๊ฐ์ฅ ๋น ๋ฅด๋ค.
StringBuilder์ ๊ฑฐ์ ๋์ผํ์ง๋ง ๋๊ธฐํ(synchronized) ์ฒ๋ฆฌ๊ฐ ๋์ด ์์ด ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฌธ์์ด ์กฐ์์ด ๋น๋ฒํ ๋ ์ฌ์ฉ๋๋ค.
ํต์ฌ ํน์ง 3๊ฐ์ง์ ํจ๊ป String์ ์ฌ์ฉํ ๋ ์์๋๋ฉด ์ข์ ๋ช ๊ฐ์ง ์ถ๊ฐ ํฌ์ธํธ๊ฐ ์๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ Intern Pool์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ == ๋น๊ต๋ก ๊ฐ์ ๊ฐ์ฒด์ธ์ง ํ์ธํ ์๋ ์์ง๋ง ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด ๋น๊ต๋ equals()๊ฐ ์ ์์ด๋ค.
์๋ํ๋ฉด new ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ๋ ๋ณ๊ฐ๋ก ํญ์ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
String blue = "BlueCool";
String cool = "BlueCool";
String blueCool = new String("BlueCool");
System.out.println(blue == cool); // true (String Intern Pool)
System.out.println(blue == blueCool); // false (new ํค์๋๋ก ์์ฑ๋ ์ ๊ฐ์ฒด)
System.out.println(blue.equals(blueCool)); // true (๋ด์ฉ ๋น๊ต)
๋ฌธ์์ด์ ์ค์ ๋ด์ฉ์ ๋น๊ตํ ๋๋ ํญ์ equals()๋ฅผ ์ฌ์ฉํ๊ณ ์ฐธ์กฐ ๋์ผ์ฑ(๊ฐ์ ๊ฐ์ฒด ์ฌ๋ถ)์ด ํ์คํ ํ์ํ ๋๋ง == ์ ์ฌ์ฉํ๋ค.
Java 9๋ถํฐ String์ ๋ด๋ถ ๊ตฌ์กฐ๋ ํฌ๊ฒ ๊ฐ์ ๋์๋ค.
Compact Strings๋ JVM ์์ค์์ ์๋์ผ๋ก ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ฉฐ ์ต์ Java์์ ๋ฌธ์์ด ์ฒ๋ฆฌ๊ฐ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
