์๋ฐ(Java)์ ๋ฌธ์์ด(String)์ ๋ถ๋ณ(immutable)ํ๋ค. String์ ํจ์๋ฅผ ํธ์ถ์ ํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์ง์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์์ ๊ฒฐ๊ณผ๋ก ํด๋น ๊ฐ์ฒด๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฌ๋ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ค. ์๋ ์๋ฅผ ๋ณด์.
public void func() {
String haribo1st = new String("HARIBO");
String copiedHaribo1st = haribo1st.toUpperCase();
System.out.println(haribo1st == copiedHaribo1st);
}
"HARIBO"
๋ผ๋ ๋ฌธ์์ด์ ์ ์ธํ ํ, toUpperCase()
๋ฅผ ํธ์ถํ๊ณ ์๋ค.
์์ ๋ง๋๋ก ๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ toUpperCase()
๋ฅผ ํธ์ถํ๋ฉด ๊ธฐ์กด ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋์์ผ ํ๋ค.
๊ทธ๋ฌ๋ ==
์ผ๋ก ๋น๊ต๋ฅผ ํด๋ณด๋ฉด true
๋ก ์๋ก ๊ฐ์ ๊ฐ์ด๋ค.
๊ทธ ์ด์ ๋ toUpperCase()
ํจ์์ ๋ก์ง ๋๋ฌธ์ด๋ค. ํด๋น ํจ์๋ lower case์ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ฑ์(new String("HARIBO")
)๋ฅผ ์ด์ฉํด์ ๋ฌธ์์ด์ ์์ฑํ๋ฉด "HARIBO"
์ผ๋ก ์ ์ธํ ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ฒด์ผ๊น?
์๋๋ค. ์์ฑ์๋ฅผ ํตํด ์ ์ธํ๊ฒ ๋๋ฉด ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ง ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ์ฆ, ํ(heap)์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ฒ์ด๋ค.
public void func() {
String haribo1st = new String("HARIBO");
String haribo3rd = "HARIBO";
System.out.println(haribo1st == haribo3rd);
System.out.println(haribo1st.equals(haribo3rd));
}
์์ ์์ ๋ฅผ ๋ณด๋ฉด ==
๋น๊ต์ ๊ฒฐ๊ณผ๋ false
์ด์ง๋ง equals()
์ ๊ฒฐ๊ณผ๋ true
์ด๋ค.
๋ ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง์ง๋ง ์ค์ ๋ก๋ ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ค.
๋ ๊ฐ์ฒด์ hash ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด ํ์คํ๊ฒ ์ ์ ์๋ค.
public void func() {
String haribo3rd = "HARIBO";
String haribo4th = String.valueOf("HARIBO");
System.out.println(haribo3rd == haribo4th);
System.out.println(haribo3rd.equals(haribo4th));
}
์ด๋ฒ์๋ ๋ฆฌํฐ๋ด(literal)๋ก ์ ์ธํ ๊ฐ์ฒด์ String.valueOf()
๋ก ๊ฐ์ ธ์จ ๊ฐ์ฒด๋ฅผ ํ๋ฒ ์ดํด๋ณด์.
valueOf()
ํจ์๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ฃผ์ด์ง ๋งค๊ฐ ๋ณ์๊ฐ null์ธ์ง ํ์ธํ ํ null์ด ์๋๋ฉด ๋งค๊ฐ ๋ณ์์ toString()
์ ํธ์ถํ๋ค.
์ฌ๊ธฐ์ String.toString()
์ this
๋ฅผ ๋ฐํํ๋ค. ์ฆ, ๋ ๊ตฌ๋ฌธ ๋ชจ๋ "HARIBO"
์ฒ๋ผ ๋ฆฌํฐ๋ด ์ ์ธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก ์ ์ธํ ๊ฐ์ฒด๋ ์ ๊ฐ์ ๊ฐ์ฒด์ผ๊น?
๋ฐ๋ก JVM์์ constant pool์ ํตํด ๋ฌธ์์ด์ ๊ด๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฆฌํฐ๋ด๋ก ์ ์ธํ ๋ฌธ์์ด์ด constant pool์ ์์ผ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๊ฐ์ ธ์จ๋ค.
๋ง์ฝ pool์ ์๋ค๋ฉด ์๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, pool์ ๋ฑ๋กํ๊ณ ๊ฐ์ ธ์จ๋ค.
์ด๋ฌํ ํ๋ก์ฐ๋ฅผ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ "HARIBO"
๋ก ์ ์ธํ ๋ฌธ์์ด์ ๊ฐ์ ๊ฐ์ฒด๋ก ๋์ค๋ ๊ฒ์ด๋ค.
String.intern()
ํจ์๋ฅผ ์ฐธ๊ณ ํด๋ณด์.