[Java] String ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ(Immutablity)์ ๋ํด
by rlaehddnd0422Java์์ String์ ๋ถ๋ณ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋, ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ดํ ์ํ๊ฐ ๋ณํ์ง ์๊ณ ๊ณ์ ์ ์ง๋๋ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค. ์ฆ String ์ธ์คํด์ค๋ ํ ๋ฒ ์์ฑ๋๋ฉด ๊ทธ ๊ฐ์ ์ฝ๊ธฐ๋ง ํ ์ ์๊ณ , ๋ณ๊ฒฝ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด
String a = "hi";
a = "hi~";
System.out.println("a = " + a);
์คํ ๊ฒฐ๊ณผ๊ฐ "a = hi~"๋ก ๋์ค๋๋ฐ, ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ ์๋๊ฐ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
์ค์์ String ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด ์๋๋ผ 2๋ฒ์งธ ๋ผ์ธ์์ ์๋ก์ด String ๊ฐ์ฒด(="hi~")๊ฐ ์์ฑ๋๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ a๋ณ์์ ํ ๋น๋ ๊ฒ์ ๋๋ค. ๋ถ๋ณ์ฑ์ ์ด๊ฑธ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. String ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ "hi"๋ผ๋ String ์ธ์คํด์ค์ ๊ฐ๊ณผ , "hi~"๋ผ๋ String ์ธ์คํด์ค์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ ๋งํ๋ฉฐ ์ด๊ฒ์ด ๋ถ๋ณ ๊ฐ์ฒด์ ํต์ฌ ๊ฐ๋ ์ ๋๋ค.
String์ ์ฐธ์กฐ ํ์ ์ ์๋ฃํ์ด์ง๋ง ํน์ดํ๊ฒ new ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅํฉ๋๋ค.
๋ถ๋ณ์ฑ์ ํ์ธํ ์ ์๋ ์์๋ฅผ ํ๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class ImmutableStringTest {
public static void main(String[] args) {
String str1 = "Hello"; // ์๋ก์ด String ๊ฐ์ฒด ์์ฑ
String str2 = str1; // str2๋ str1๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
System.out.println("Before Modification:");
System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
// ๋ฌธ์์ด ์ฐ์ฐ ์ํ (์๋ก์ด String ๊ฐ์ฒด ์์ฑ)
str1 = str1 + ", World";
System.out.println("\nAfter Modification:");
System.out.println("str1: " + str1); // "Hello, World"
System.out.println("str2: " + str2); // "Hello"
// str1์ด ๋ณ๊ฒฝ๋์์ง๋ง str2๋ ๋ณ๊ฒฝ๋์ง ์์์ ํ์ธํ ์ ์์ต๋๋ค.
}
}
์คํ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด str2๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
str1= str1 + ", World"์์ ๋ฌธ์์ด ์ฐ์ฐ์ ์ํํ๋ฉด ์๋ก์ด String ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ ์๋์ String ์ธ์คํด์ค์ ๊ฐ์ธ "Hello"๋ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒ์ ํตํด String ๊ฐ์ฒด๋ ๋ถ๋ณ์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
String์ ๋ถ๋ณ์ฑ์ผ๋ก ์ป๋ ์ด์
1. ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
public class ImmutableStringTest2 {
public static void main(String[] args) {
String a = "1";
String b = "1";
String c = "1";
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
}
- Java๋ String ๊ฐ์ฒด๋ฅผ String constant pool์ด๋ผ๋ ๊ณณ์์ ๊ด๋ฆฌ๋ฅผ ํฉ๋๋ค. String pool์ ํตํด String์ ๊ด๋ฆฌํจ์ผ๋ก์จ ๊ฐ์ ๊ฐ์ ๊ฐ๋ String์ ๋ํด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ฒ ํ ์ ์๊ธฐ ๋๋ฌธ์ Java๋ Runtime์์ Heap ์์ญ์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
2. ๋ณด์์ ์ด์
- String์ด ๋ถ๋ณ๊ฐ์ฒด์ธ ๋๋ถ์ ๋ณด์์์ ์ด์ ์ ์ป์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ String ๊ฐ์ฒด๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, String์ด ๋ถ๋ณ์ด์ฌ์ผ ํด์ปค์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋ฐฉํ ์ ์์ต๋๋ค.
3. ๋ฉํฐ ์ฐ๋ ๋ฉ ํ๊ฒฝ์์์ ์์ ํจ
- ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ฐ๋ ๋ฉ ํ๊ฒฝ์์ Synchronization ๋ฌธ์ ๋ฅผ ๊ฑฑ์ ํ์ง ์์๋ ๋ฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ํ์ค ์ ์ถ๋ ฅ ํด๋์ค System์ ๋ํด (0) | 2023.09.21 |
---|---|
[Java] JVM(Java Virtual Machine)์ ๊ตฌ์กฐ์ ๋์๋ฐฉ์์ ๋ํด (0) | 2023.09.21 |
[Java] ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ๋ค - ์๋ฃํ, ์์, ๋ฆฌํฐ๋ด์ ๋ํด (0) | 2023.09.20 |
[Java] Java ์ธ์ด์ ํน์ง, ์ฅ์ ์ ๋ํด (0) | 2023.09.20 |
[Java] ๋๋ค์ - 2. ํจ์ํ ์ธํฐํ์ด์ค์ ๋ํด (0) | 2023.08.13 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422