Java ๋ฌธ์์ด ์ฐ๊ฒฐ: String vs StringBuilder์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ๋ถ์
Android ์ฑ ๊ฐ๋ฐ์ค ๋ฌธ์์ด์ ์ง์์ ์ผ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ์๊ณ , ๋จ์ํ String์ ์ฌ์ฉํ์ง๋ง ์ด๊ฒ์ด ์๊ฐ๋ณด๋ค ํฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
String๊ณผ StringBuilder์ ์ฐจ์ด์ ์ ์ดํด๋ณด๊ณ , ์ ๋ฐ๋ณต์ ์ธ ๋ฌธ์์ด ์ฐ๊ฒฐ ์์ ์์ StringBuilder๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ์์๋ณด๋ ค๊ณ ํ๋ค.
String์ ํน์ฑ => Immutable(๋ถ๋ณ)
Java์์ String์ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ค. ์ฆ, ํ๋ฒ ์์ฑ๋ String ๊ฐ์ฒด์ ๋ด์ฉ์ ์ ๋ ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. String์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฌธ์์ด ์ฐ๊ฒฐ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด์.
String str = "hello";
str = str + "world";
์์ ๊ฐ๋จํ ์ฝ๋์์ ์ค์ ๋ก ๋ฐ์ํ๋ ์ผ์ ์๋์ ๊ฐ๋ค.
- "hello"๋ผ๋ String ๊ฐ์ฒด๊ฐ ์์ฑ๋จ
- "world"๋ผ๋ String ๊ฐ์ฒด๊ฐ ์์ฑ๋จ
- "hello"์ "world"๋ฅผ ์ฐ๊ฒฐํ ์๋ก์ด String ๊ฐ์ฒด "helloworld"๊ฐ ์์ฑ๋จ
- str ๋ณ์๊ฐ ์๋ก์ด "helloworld" ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ณ๊ฒฝ๋จ
- ์๋์ "hello" ๊ฐ์ฒด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋จ
์ฌ๊ธฐ์ ์ฃผ๋ชฉํ ์ ์ ๋ฌธ์์ด์ ์์ ํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค๋ ๊ฒ์ด๋ค.
static ๋ณ์๋ฅผ ์ฌ์ฉํด๋ ๋ฌ๋ผ์ง์ง ์๋ ๋ถ๋ณ์ฑ
ํน์ static ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅผ๊น?
public class StringTest {
private static String str;
public static void main(String[] args) {
System.out.println(String.format("%-20s : %d", "Before ()", System.identityHashCode(str)));
str = "apple";
System.out.println(String.format("%-20s : %d", "After (apple)", System.identityHashCode(str)));
str +="";
System.out.println(String.format("%-20s : %d", "After2 (apple)", System.identityHashCode(str)));
str +="";
System.out.println(String.format("%-20s : %d", "After3 (apple)", System.identityHashCode(str)));
str +="pizza";
System.out.println(String.format("%-20s : %d", "After4 (applepizza)", System.identityHashCode(str)));
}
}
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํด์์ฝ๋๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. static ํค์๋๋ ๋ณ์์ ์๋ช ๊ณผ ์ ๊ทผ ๋ฒ์๋ง ๋ณ๊ฒฝํ ๋ฟ, String์ ๋ถ๋ณ ํน์ฑ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
StringBuilder๋ฅผ ํตํ ๊ฐ๋ณ์ ์ธ ๋ฌธ์์ด ์ฒ๋ฆฌ
StringBuilder๋ ์ด๋ฌํ String์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ํด๊ฒฐ์ฑ ์ด๋ค. StringBuilder์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ณ(mutable) ๊ฐ์ฒด
- ๋ด๋ถ ๋ฒํผ๋ฅผ ์ฌ์ฉํ ๋ฌธ์์ด ์์
- ๋ฌธ์์ด ์ถ๊ฐ ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ์ด ๋ถํ์
- ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์๋์ ๊ฐ์ด StringBuilder๋ฅผ ํตํด ๋ฌธ์์ด์ ์ฐ๊ฒฐํ ์ ์๋ค.
StringBuilder sb = new StringBuilder("hello");
sb.append("world");
์ด ๊ฒฝ์ฐ ์๋ก์ด ๊ฐ์ฒด ์์ฑ์์ด ๊ธฐ์กด ๋ฒํผ์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ํด์์ฝ๋ ๋ํ ๋์ผํ๊ฒ ์ ์ง๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
StringBuilder sb = new StringBuilder("apple");
System.out.println(String.format("%-20s : %d", "Before (apple)", System.identityHashCode(sb)));
sb.append("");
System.out.println(String.format("%-20s : %d", "After1 (apple)", System.identityHashCode(sb)));
sb.append("");
System.out.println(String.format("%-20s : %d", "After1 (apple)", System.identityHashCode(sb)));
sb.append("pizza");
System.out.println(String.format("%-20s : %d", "After2 (applepizza)", System.identityHashCode(sb)));
์ฑ๋ฅ ์ฐจ์ด
String๊ณผ StringBuilder์ ์ฑ๋ฅ ์ฐจ์ด๋ ๋ฐ๋ณต ํ์๊ฐ ๋์ด๋ ์๋ก ๋์ฑ ๊ทน๋ช ํ๊ฒ ๋์ด๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ง์ํ ์ ์๋ค.
๋ง์ฝ 1000๋ฒ์ ๋ฌธ์์ด ์ฐ๊ฒฐ ์์ ์ ์ํํ ๊ฒฝ์ฐ
- String: 1000๊ฐ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ
- StringBuilder: 1๊ฐ์ ๊ฐ์ฒด๋ง ์ฌ์ฉ
๋ฐ๋ณตํ์๊ฐ ๋์ด๋ ์๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์คํ ์๊ฐ์๋ ํฐ ์ฐจ์ด๊ฐ ์๊ธด๋ค.
์ธ์ StringBuilder๋ฅผ ์ฌ์ฉํด์ผ ๋ ๊น?
StringBuilder๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ ์ฉํ ์ฐ์ผ ์ ์๋ค.
- ๋ฐ๋ณต์ ์ธ ๋ฌธ์์ด ์ฐ๊ฒฐ ์์ ์ด ํ์ํ ๋
- ๊ธด ๋ฌธ์์ด์ ๋์ ์ผ๋ก ์์ฑํ ๋
- ๋ฌธ์์ด ์กฐ์์ด ๋น๋ฒํ ๊ฒฝ์ฐ
- ๋์ฉ๋์ ๋ฌธ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋
๋ฐ๋ฉด, ๋จ์ํ ํ ๋ฒ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ํ๋ค๊ฑฐ๋ ์งง์ ๋ฌธ์์ด ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ String์ ์ฌ์ฉํด๋ ์ถฉ๋ถํ ๊ฒ์ด๋ค.
String์ ๋ถ๋ณ์ฑ์ ๊ผญ ํ์ํ ํน์ฑ์ด์ง๋ง, ์ด๊ฒ์ด ๋๋ก๋ ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์๋ค. ํนํ ๋ฌธ์์ด์ ๋น๋ฒํ๊ฒ ์์ ํ๊ฑฐ๋ ์ฐ๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ, StringBuilder๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
์์ผ๋ก๋ String๊ณผ StringBuilder์ ํน์ฑ์ ์์งํ๊ณ ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ์ฌ์ฉํ๊ธฐ ์ํด ๋ ์ ๊ฒฝ์จ์ผ๊ฒ ๋ค.