docs.oracle.com/javase/7/docs/api/java/lang/String.html
์๋ก
String์ ๋ํด์ ์ ์๊ณ ์์๋ค๊ณ ์๊ฐํ์ง๋ง, ์๊ฐ๋ณด๋ค ๋๋ฌด ๋ชจ๋ฅด๋๊ฒ ๋ง์๋ค. ๊ทธ๋์ ์ด๋ ๊ฒ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ๋ชฐ๋๋ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด๋ ค ํ๋ค.
JAVA ๋ฌธ์์ด
String ์ธ์คํด์ค๋ ํ ๋ฒ ์์ฑ๋๋ฉด ํด๋น ๊ฐ์ ์ฝ๊ธฐ๋ง ํ ์ ์๊ณ , ๋ณ๊ฒฝํ ์๋ ์๋ค.
์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์๋ฐ์์๋ ๋ถ๋ณ ๊ฐ์ฒด(immutable object )๋ผ๊ณ ํฉ๋๋ค.
String ์ ๋ถ๋ณ ๊ฐ์ฒด(immutable object ) ์ ๋ํ์ ์ธ ์์ด๋ค.
์ฆ, ์๋ฐ์์ + ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด ๊ฒฐํฉ์ ์ํํ๋ฉด, ๊ธฐ์กด ๋ฌธ์์ด์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ๋ด์ฉ์ด ํฉ์ณ์ง ์๋ก์ด String ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋๋ค.
๋ฌธ์์ด์ ์์ฑํ ๋ ์ด๋ป๊ฒ ํ๋๊ฐ
String ์์ฑ์ ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
String name = "name1";
String name2 = "name1";
String name3 = new String("name1");
String name4 = name + name2;
String ์์ฑ์ new ์ฐ์ฐ์๋ก ์์ฑ ํ ์์๊ณ , " " ์ฒ๋ผ ๋ฆฌํฐ๋ด(์์์ ๊ฐ์ด ๋ณํ์ง ์๋ ๊ฐ)๋ก ์์ฑํ ์ ์๋ค.
** ๋ฆฌํฐ๋ด์ด๋? ์์์ ๊ฐ์ด ๋ณํ์ง ์๋ ๊ฐ์ด๋ค. -> ๋ณ๊ฒฝํ ์ ์๊ณ , ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๋ค.
์์ ๋ ๋ฐฉ์์ String๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ ์ ์ ๊ฐ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์์์๋ ์์ ํ ๋ค๋ฅด๋ค. (์๋์ ์์ธํ ์์๋ณด๊ฒ ๋ค.)
String์ ๋ ํผ๋ฐ์ค ํ์ ์ ์๋ฃํ์ด๊ธฐ ๋๋ฌธ์, Heap ๋ฉ๋ชจ๋ฆฌ(๋ฆฌํฐ๋ด์ String pool (๋ฌธ์์ด ํ) )์ ์ ์ฅ์ด ๋๋ค.
๋ฌธ์
์ ์ฝ๋์์ String๊ฐ์ฒด๊ฐ ๋ช๊ฐ๊ฐ ์์ฑ์ด ๋ ๊น? ์์ฑํ ๊ฐ์ฒด๋ง๋ค ๊ฐ๊ฐ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ํ๋ ธ๋ค. ๋๋ ๋ฐ๋ณด์๋ค
์ ๋ต์ 3๊ฐ๊ฐ ์์ฑ์ด ๋๋ค.
์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ์คํ๊ฒ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
- name : "" ๋ก ์์ฑํ์ฌ, String pool์ "name1" ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- name2 : String pool์ "name1" ์ด๋ผ๋ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ name๊ณผ ๋์ผํ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ๋ค.
- name3 : new์์ฑ์๋ก ์์ฑํ์ฌ, Heap ๋ฉ๋ชจ๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ค.
- name4 : new ์์ฑ์๋ฅผ ์ด์ฉํด์ Heap ๋ฉ๋ชจ๋ฆฌ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ค. (name3 == name4 ? false)
- name5 : + ์ฐ์ฐ์ ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ธ๋ค. (๋ฉ๋ชจ๋ฆฌ์ ๋นํจ์จ ์ ์ด๋ค.)
๋ง์ฝ ๋ฌธ์์ด ๊ฐ์ ๋ณ๊ฒฝ์ ํ๋ฉด?
๊ธฐ์กด์ ์์ฑ๋ ๋ฌธ์์ด ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
String ๊ฐ์ฒด๋ ๋ฆฌํฐ๋ด์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ๋ณํ์ง ์๋ ๊ฐ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ์๋ก์ด ์ธ์คํด์ค ๊ฐ์ฒด๊ฐ ์์ฑ์ด ๋๋ค. ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๊ฐ์ ์ฐ๋ ๊ธฐ ๊ฐ์ด ๋๋ฒ๋ฆฌ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ ๋นํจ์จ์ ์ด๊ฒ ๋๋ค.