[Java] ์๋ฐ์์ '+' ์ฐ์ฐ์ ํตํ ๋ฌธ์์ด ํฉ์น๊ธฐ๋ฅผ ์ง์ํ๋ผ
์๋ก
์๋ฐ์์ '+' ์ฐ์ฐ์ ํตํ ๋ฌธ์์ด ํฉ์น๊ธฐ๋ฅผ ์ง์ํ๋ผ๋ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ฅผ ๋ณด๊ฒ ๋์ด ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
๊ทธ์ ์ ๋จผ์ String๊ณผ StringBuffer, ๊ทธ๋ฆฌ๊ณ StringBuilder์ ๋ํ ์ฌ์ ์ง์์ด ์์ผ๋ฉด ์ดํดํ๊ธฐ ์์ํฉ๋๋ค. ํด๋น ๋ด์ฉ์ ์๋ ๊ฒ์๊ธ์์ ์ ๋ฆฌํ ์ ์ด ์์ต๋๋ค.
๊ฐ๋จํ๊ฒ ๋ค์ ์์ฝํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
1. String ํด๋์ค๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ immutable ํด๋์ค์ด๋ค.
- ํ๋ฒ ์์ฑ๋ String ์ธ์คํด์ค๊ฐ ๊ฐ๊ณ ์๋ ๋ฌธ์์ด์ ์ฝ์ด ์ฌ ์๋ง ์๊ณ , ๋ณ๊ฒฝํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์๋์ ์ฝ๋์ ๊ฐ์ด '+'์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ ๋ฌธ์์ด์ ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ ์ธ์คํด์ค ๋ด์ ๋ฌธ์์ด์ด ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๋ฌธ์์ด("ab")์ด ๋ด๊ธด String ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
2. String๊ณผ ๋ฌ๋ฆฌ StringBuffer๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์๋ค.
- StringBuffer ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ์ ์ ํ ๊ธธ์ด์ charํ ๋ฐฐ์ด์ด ์์ฑ๋๊ณ , ์ด ๋ฐฐ์ด์ ๋ฌธ์์ด์ ์ ์ฅํ๊ณ ํธ์งํ๊ธฐ ์ํ ๊ณต๊ฐ(buffer)์ผ๋ก ์ฌ์ฉ๋๋ค.
- ๋ง์ฝ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์์ ํ๋ ค๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ณด๋ค ์์ ๋๋ ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ์์ ์ด ์ํ๋๋ฉฐ, ๋ฐฐ์ด์ ๊ธธ์ด๋ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ์๋ก์ด ๊ธธ์ด์ ๋ฐฐ์ด์ ์์ฑํ ํ์ ์ด์ ๋ฐฐ์ด์ ๊ฐ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ ์๋ฐ์์ '+' ์ฐ์ฐ์ ํตํ ๋ฌธ์์ด ํฉ์น๊ธฐ๋ฅผ ์ง์ํด์ผ ํ๋์ง ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
String '+' ์ฐ์ฐ์ด ์ผ์ด๋๋ ๊ณผ์
Java์์ Stirng '+' ์ฐ์ฐ์๋ Java ์ปดํ์ผ๋ฌ์์ ๊ตฌํ๋๋ฉฐ ์ปดํ์ผ ํ์์ ์ปดํ์ผ ์ ๋ด๋ถ์ ์ผ๋ก StringBuilder ํด๋์ค๋ฅผ ๋ง๋ ํ ๋ค์ ๋ฌธ์์ด๋ก ๋ฐํํฉ๋๋ค. ์ฆ ์๋์ ์ฝ๋์ฒ๋ผ ๋์ํฉ๋๋ค.
public class Test {
public static void main(String[] args) {
String banana = "๋ฐ๋๋";
banana += "์ฅฌ์ค";
// ์ ์๋ ๋์ผ
String bananaJuice = new StringBuilder("๋ฐ๋๋").append("์ฅฌ์ค").toString();
}
}
๋ฒ์จ๋ถํฐ ์ ์ฌ์ฉํ๋ฉด ์๋๋์ง ๊ฐ์ ์ก์ผ์ ๋ถ๋ ์์ผ์๊ฒ ์ง๋ง ์กฐ๊ธ ๋ ํ์คํ ๋น๊ต๋ฅผ ํด ๋ด
์๋ค.
๋ง์ฝ ์ ์ฝ๋์ฒ๋ผ ๋จ์ํ '+' ์ฐ์ฐ์ด ๋ฐ๋ณต๋ฌธ ์์ ๋ค์ด๊ฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
public class Test {
public static void main(String[] args) {
String number = "0";
for(int i=1; i<=10000; i++){
number += "i";
}
// ์ ์๋ ๋์ผ
String number2 = "0";
for(int i=1; i<=10000; i++){
number2 = new StringBuilder(number2).append(i).toString();
}
}
}
์ ์ฝ๋์ฒ๋ผ ๋ฐ๋ณต๋ฌธ ์์์ '+' ์ฐ์ฐ์ ์ํํ๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ ํ์๋งํผ StringBuilder ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ append()์ toString() ๋ฉ์๋์ ํธ์ถ์ด ๋งค๋ฒ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฑ๋ฅ์ด ์ ํ๋ ์๋ฐ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ๋ญ๋น๋ ์ปค์ง๊ฒ ๋ฉ๋๋ค.
public class Test {
public static void main(String[] args) {
final StringBuilder a = new StringBuilder();
for (int i = 0; i < 10000; i++) {
a.append(i);
}
final String b = a.toString();
}
}
๊ทธ๋ ๊ธฐ์ ์์ ๊ฐ์ด ๋ํ๊ธฐ ์ฐ์ฐ์ด ๋ง์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ์ฒ์๋ถํฐ StringBuilder ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ํฉ์น๋ ๊ฒ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
StringBuilder vs String ์ฑ๋ฅ ์ธก์
public class Test {
public static void main(String[] args) {
stringBuilderTest();
stringTest();
}
public static void stringTest(){
String result = "";
long start = System.currentTimeMillis();
for(int i = 0 ; i < 100000; i++){
result += "test";
}
long end = System.currentTimeMillis();
System.out.println("String exec time : " + (end - start));
}
public static void stringBuilderTest(){
StringBuilder result = new StringBuilder();
long start = System.currentTimeMillis();
for(int i = 0 ; i < 100000; i++){
result.append("test");
}
long end = System.currentTimeMillis();
System.out.println("String builder exec time : " + (end - start));
}
}
ํ๋ฒ ์ง์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ฒ์๋ถํฐ StringBuilder๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ String '+' ์ฐ์ฐ์ ์ํ ์๋๋ฅผ ๋น๊ตํด ๋ณด์์ต๋๋ค.
์์ ๊ฐ์ด String '+' ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด StringBuilder๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ํ์๋งํผ StringBuilder ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ '+' ์ฐ์ฐ ๋ด๋ถ์ ์ผ๋ก ๋ง์ ์ผ๋ค์ด ์ผ์ด๋์ ์์๋๋ก ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ฒฐ๋ก ์ ์ผ๋ก ๋ง์ ๋ฌธ์์ด ํฉ์น๊ธฐ ์ฐ์ฐ์ด ํ์ํ๋ค๋ฉด StringBuilder๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฑ๋ฅ๋ฉด์์ ์ข๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.