Language/Java

โ˜• ์ž๋ฐ” String / StringBuffer / StringBuilder ์ฐจ์ด์  & ์„ฑ๋Šฅ ๋น„๊ต

์ธํŒŒ_ 2022. 11. 2. 10:02

String-StringBuffer-StringBuilder

์ž๋ฐ”์—์„œ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ์ž๋ฃŒํ˜• ํด๋ž˜์Šค๋กœ String, StringBuffer, StringBuilder ๋ผ๋Š” 3๊ฐ€์ง€ ์ž๋ฃŒํ˜•์„ ์ง€์›ํ•œ๋‹ค.

์œ„ 3๊ฐ€์ง€ ํด๋ž˜์Šค ์ž๋ฃŒํ˜•์€ ๋ชจ๋‘ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ ์“ฐ์ž„์ƒˆ๊ฐ€ ๋งŽ์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š”  String, StringBuffer, StringBuilder ํด๋ž˜์Šค ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๊ณ , ์ด 3๊ฐ€์ง€ ์ค‘ ์–ด๋Š ์ƒํ™ฉ์—์„œ ์–ด๋Š ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๊ณ  ์„ฑ๋Šฅ์ ์œผ๋กœ๋Š” ์–ด๋Š๊ฒƒ์ด ๋” ์ข‹์€์ง€ ์ด์ •๋ฆฌ ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด์ž.

 

 

StringBuffer / StringBuilder ํด๋ž˜์Šค

StringBuffer / StringBuilder ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์„ ์—ฐ์‚ฐ(์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ) ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒํ˜•์ด๋‹ค.

๋ฌผ๋ก  String ์ž๋ฃŒํ˜•๋งŒ ์œผ๋กœ๋„, + ์—ฐ์‚ฐ์ด๋‚˜ concat() ๋ฉ”์†Œ๋“œ๋กœ ๋ฌธ์ž์—ด์„ ์ด์–ด๋ถ™์ผ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ง์…ˆ(+) ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด String ์ธ์Šคํ„ด์Šค์˜ ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•˜๋ฉด, ๋‚ด์šฉ์ด ํ•ฉ์ณ์ง„ ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜์–ด, ๋”ฐ๋ผ์„œ ๋ฌธ์ž์—ด์„ ๋งŽ์ด ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฒฐํ•ฉํ• ์ˆ˜๋ก ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†๋„ ๋˜ํ•œ ๋งค์šฐ ๋Š๋ ค์ง€๊ฒŒ ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

String result = "";
result += "hello";
result += " ";
result += "jump to java";
System.out.println(result); // hello jump to java
// → ์‹ฌํ”Œํ•˜์ง€๋งŒ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค

๊ทธ๋ž˜์„œ ์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์„ ์ „์šฉ์œผ๋กœ ํ•˜๋Š” ์ž๋ฃŒํ˜•์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, StringBuffer ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฒ„ํผ(buffer)๋ผ๊ณ  ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด, ๋ฌธ์ž์—ด์„ ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋„ ์—†์œผ๋ฉฐ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ ์†๋„๋„ ๋งค์šฐ ๋น ๋ฅด๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

StringBuffer sb = new StringBuffer();  // StringBuffer ๊ฐ์ฒด sb ์ƒ์„ฑ
sb.append("hello");
sb.append(" ");
sb.append("jump to java");
String result = sb.toString();
System.out.println(result); // hello jump to java
// → + ์—ฐ์‚ฐ๋ณด๋‹ค๋Š” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์—ฐ์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค
StringBuffer์™€ ๋น„์Šทํ•œ ์ž๋ฃŒํ˜•์œผ๋กœ StringBuilder ์ž๋ฃŒํ˜•์ด ์žˆ๋‹ค.
StringBuilder ์‚ฌ์šฉ๋ฒ•์€ StringBuffer์™€ ๋™์ผํ•˜๋‹ค.
๋’ค์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ StringBuffer์™€ StringBuilder์˜ ์ฐจ์ด๋Š”, StringBuffer๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์™„๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ณ , StringBuilder๋Š” ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ StringBuffer์˜ ๋ฒ„ํผ(๋ฐ์ดํ„ฐ ๊ณต๊ฐ„) ํฌ๊ธฐ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 16๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ์ด๋ฉฐ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ทธ ํฌ๊ธฐ๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋งŒ์ผ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ค‘์— ํ• ๋‹น๋œ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๋„˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ฒ„ํผ๋ฅผ ์ฆ๊ฐ• ์‹œํ‚ค๋‹ˆ ๊ฑฑ์ • ์•ˆํ•ด๋„ ๋œ๋‹ค. ๋‹ค๋งŒ, ํšจ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋Š” ๋„‰๋„‰ํ•˜๊ฒŒ ์žก๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

StringBuffer sb = new StringBuffer(); // ๊ธฐ๋ณธ 16 ๋ฒ„ํผ ํฌ๊ธฐ๋กœ ์ƒ์„ฑ

// sb.capacity() - StringBuffer ๋ณ€์ˆ˜์˜ ๋ฐฐ์—ด ์šฉ๋Ÿ‰์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜
System.out.println(sb.capacity()); // 16 
 
sb.append("1111111111111111111111111111111111111111"); // 40๊ธธ์ด์˜ ๋ฌธ์ž์—ด์„ append
System.out.println(sb.capacity()); // 40 (์ถ”๊ฐ€๋œ ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๋Š˜์–ด๋‚จ)

 

StringBuffer ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ

String str = "abcdefg";
StringBuffer sb = new StringBuffer(str); // String -> StringBuffer

System.out.println("์ฒ˜์Œ ์ƒํƒœ : " + sb); // ์ฒ˜์Œ์ƒํƒœ : abcdefg

System.out.println("๋ฌธ์ž์—ด String ๋ณ€ํ™˜ : " + sb.toString()); // StringBuffer๋ฅผ String์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

System.out.println("๋ฌธ์ž์—ด ์ถ”์ถœ : " + sb.substring(2,4)); // ๋ฌธ์ž์—ด ์ถ”์ถœํ•˜๊ธฐ

System.out.println("๋ฌธ์ž์—ด ์ถ”๊ฐ€ : " + sb.insert(2,"์ถ”๊ฐ€")); // ๋ฌธ์ž์—ด ์ถ”๊ฐ€ํ•˜๊ธฐ

System.out.println("๋ฌธ์ž์—ด ์‚ญ์ œ : " + sb.delete(2,4)); // ๋ฌธ์ž์—ด ์‚ญ์ œํ•˜๊ธฐ

System.out.println("๋ฌธ์ž์—ด ์—ฐ๊ฒฐ : " + sb.append("hijk")); // ๋ฌธ์ž์—ด ๋ถ™์ด๊ธฐ

System.out.println("๋ฌธ์ž์—ด์˜ ๊ธธ์ด : " + sb.length()); // ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ตฌํ•˜๊ธฐ

System.out.println("์šฉ๋Ÿ‰์˜ ํฌ๊ธฐ : " + sb.capacity()); // ์šฉ๋Ÿ‰์˜ ํฌ๊ธฐ ๊ตฌํ•˜๊ธฐ

System.out.println("๋ฌธ์ž์—ด ์—ญ์ˆœ ๋ณ€๊ฒฝ : " + sb.reverse()); // ๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ

System.out.println("๋งˆ์ง€๋ง‰ ์ƒํƒœ : " + sb); // ๋งˆ์ง€๋ง‰์ƒํƒœ : kjihgfedcba
๋ฉ”์„œ๋“œ ์„ค  ๋ช…
StringBuffer( ) ๋ฒ„ํผ์˜ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํฌ๊ธฐ๊ฐ€  16 ์ธ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ
StringBuffer(int length) length ๊ธธ์ด๋ฅผ ๊ฐ€์ง„  StringBuffer ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(buffer)๋ฅผ ์ƒ์„ฑ
StringBuffer(String str) ์ง€์ •ํ•œ ๋ฌธ์ž์—ด( str )์˜ ๊ธธ์ด๋ณด๋‹ค  16 ๋งŒํผ ๋” ํฐ ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑ
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[ ] str)
StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long l)
StringBuffer append(Object obj)
StringBuffer append(String str)
๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ๋œ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ  StringBuffer ์ธ์Šคํ„ด์Šค๊ฐ€ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ๋’ค์— ๋ง๋ถ™์ž„
int capacity( )  StringBuffer ์ธ์Šคํ„ด์Šค์˜ ๋ฒ„ํผํฌ๊ธฐ ๋ฐ˜ํ™˜ (์ž๋ฃŒํ˜•์˜ ํ• ๋‹น๋œ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜)
int length( )  StringBuffer ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋ฐ˜ํ™˜ (๋ฒ„ํผ์— ๋‹ด๊ธด ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜)
char charAt(int index) ์ง€์ •๋œ ์œ„์น˜( index )์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜
StringBuffer delete(int start, int end) ์‹œ์ž‘์œ„์น˜( start )๋ถ€ํ„ฐ ๋ ์œ„์น˜( end )์‚ฌ์ด์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐ
๋‹จ,  end ์œ„์น˜์˜ ๋ฌธ์ž๋Š” ์ œ์™ธ(start <= x < end)
StringBuffer deleteCharAt(int index) ์ง€์ •๋œ ์œ„์น˜( index )์˜ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐ
StringBuffer insert(int pos, boolean b)
StringBuffer insert(int pos, char c)
StringBuffer insert(int pos, char[ ] str)
StringBuffer insert(int pos, doule d)
StringBuffer insert(int pos, float f)
StringBuffer insert(int pos, int i)
StringBuffer insert(int pos, long l)
StringBuffer insert(int pos, Object obj)
StringBuffer insert(int pos, String str)
๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ง€์ •๋œ ์œ„์น˜( pos )์— ์ถ”๊ฐ€
( pos ๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘)
StringBuffer replace(int start, int end, String str) ์ง€์ •๋œ ๋ฒ”์œ„( start  ~  end )์˜ ๋ฌธ์ž๋“ค์„ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ๋‹ค.
๋‹จ,  end ์˜ ์œ„์น˜๋Š” ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ X (start <= x < end)
StringBuffer reverse( )  StringBuffer ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์˜ ์ˆœ์„œ๋ฅผ ๊ฑฐ๊พธ๋กœ ๋‚˜์—ด
void setCharAt(int index, char ch) ์ง€์ •๋œ ์œ„์น˜( index )์˜ ๋ฌธ์ž๋ฅผ ์ฃผ์–ด์ง„ ๋ฌธ์ž( ch )๋กœ ๋ฐ”๊พผ๋‹ค.
void setLength(int newLength) ์ง€์ •๋œ ๊ธธ์ด๋กœ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ณ€๊ฒฝ
๊ธธ์ด๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‚˜๋จธ์ง€ ๋นˆ๊ณต๊ฐ„๋“ค์„ ๋„๋ฌธ์ž( \u0000 )๋กœ ์ฑ„์šด๋‹ค.
String toString( )  StringBuffer ์ธ์Šคํ„ด์Šค์˜ ๋ฌธ์ž์—ด์„  String ์œผ๋กœ ๋ณ€ํ™˜
String substring(int start)
String substring(int start, int end)
์ง€์ •๋œ ๋ฒ”์œ„ ๋‚ด์˜ ๋ฌธ์ž์—ด์„  String ์œผ๋กœ ๋ฝ‘์•„์„œ ๋ฐ˜ํ™˜
(์‹œ์ž‘์œ„์น˜( start )๋งŒ ์ง€์ •ํ•˜๋ฉด ์‹œ์ž‘์œ„์น˜๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฝ‘์•„์„œ ๋ฐ˜ํ™˜)
StringBuffer ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ StringBuilder ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋ฒ•์€ ๋™์ผํ•˜๋‹ค.

String vs (StringBuffer, StringBuilder) ๋น„๊ต

 

๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•์˜ ๋ถˆ๋ณ€๊ณผ ๊ฐ€๋ณ€

 

String์€ ๋ถˆ๋ณ€

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์—์„œ๋Š” String ๊ฐ์ฒด์˜ ๊ฐ’์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋Š” ํ•œ๋ฒˆ ํ• ๋‹น๋œ ๊ณต๊ฐ„์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ '๋ถˆ๋ณ€(immutable)' ์ž๋ฃŒํ˜• ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šด๋‹ค. ๊ทธ๋ž˜์„œ ์ดˆ๊ธฐ๊ณต๊ฐ„๊ณผ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์—์„œ ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

์‹ค์ œ๋กœ String ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜์–ด ์žˆ๋‹ค.

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๋ฌธ์ž์—ด์€ ์ด value ๋ผ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋ฌธ์žํ˜• ๋ฐฐ์—ด๋กœ ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค. ์ด value ๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜(final)ํ˜•์ด๋‹ˆ ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

public final class String implements java.io.Serializable, Comparable {
	private final byte[] value;
}
jdk 8 ๊นŒ์ง€๋Š” String ๊ฐ์ฒด์˜ ๊ฐ’์€ char[] ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด์ ธ ์žˆ์ง€๋งŒ, jdk 9๋ถ€ํ„ฐ ๊ธฐ์กด char[]์—์„œ byte[]์„ ์‚ฌ์šฉํ•˜์—ฌ String Compacting์„ ํ†ตํ•œ ์„ฑ๋Šฅ ๋ฐ heap ๊ณต๊ฐ„ ํšจ์œจ(2byte -> 1byte)์„ ๋†’์ด๋„๋ก ์ˆ˜์ •๋˜์—ˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜ a ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ "Hello" ๋ผ๋Š” ๊ฐ’์— "World" ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋”ํ•ด์„œ String ๊ฐ์ฒด์˜ ์ž์ฒด์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ์‹œํ‚จ ๊ฒƒ์œผ๋กœ ๋ณด์ผ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ "Hello World" ๊ฐ’์„ ์ €์žฅํ•œ ์˜์—ญ์„ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ๋ณ€์ˆ˜ a ๋ฅผ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๋Š” ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

String str = "hello";
str = str + " world";

System.out.println(str); // hello world

java-string

์ด์™ธ์—๋„ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” trim ์ด๋‚˜ toUpperCase ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ ํ˜•ํƒœ๋ฅผ ๋ณด๋ฉด, ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ƒ๊ฐ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ˆ˜ํ–‰ ์‹œ ๋˜ ๋‹ค๋ฅธ String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฆฌํ„ดํ•  ๋ฟ์ด๋‹ค.

String sql = "abc";  // "abc"
sql.toUpperCase();  // "ABC"

System.out.println(sql); // "abc" - toUpperCase๋ฅผ ํ•ด๋„ ์ž์ฒด ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค (๋ถˆ๋ณ€)
[ ์ž๋ฐ” ์–ธ์–ด์—์„œ String์„ ๋ถˆ๋ณ€์œผ๋กœ ์„ค์ •ํ•œ ์ด์œ  ]
String ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ์„ค๊ณ„ํ•œ ์ด์œ ๋Š” ์บ์‹ฑ, ๋ณด์•ˆ, ๋™๊ธฐํ™”, ์„ฑ๋Šฅ์ธก๋ฉด ์ด์ ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

1. ์บ์‹ฑ : String์„ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ String pool์— ๊ฐ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์˜ ํ•˜๋‚˜๋งŒ ์ €์žฅํ•˜๋ฉฐ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์บ์‹ฑ์— ์ด์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด๋กœ ์ธํ•ด ํž™ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 

2. ๋ณด์•ˆ : ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์•”ํ˜ธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋˜๋Š”๋ฐ, ๋งŒ์ผ ๋ฒˆ์ง€์ˆ˜์˜ ๋ฌธ์ž์—ด ๊ฐ’์ด ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ•ด์ปค๊ฐ€ ์ฐธ์กฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

3. ๋™๊ธฐํ™” : ๋ถˆ๋ณ€ํ•จ์œผ๋กœ์จ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ •์ ์ด๊ฒŒ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

StringBuffer / StringBuilder ๋Š” ๊ฐ€๋ณ€

StringBuffer๋‚˜ StringBuilder์˜ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์—์„œ String ๊ฐ์ฒด์™€ ๊ฐ™์ง€๋งŒ, ๊ฐ์ฒด์˜ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด์ง€๋Š” ๊ฒฝ์šฐ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋Š˜๋ ค์ฃผ์–ด ๊ฐ€๋ณ€(mutable)์ ์ด๋ผ๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

๋‘ ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ Buffer(๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ)์— ๋ฌธ์ž์—ด์„ ์ €์žฅํ•ด๋‘๊ณ  ๊ทธ ์•ˆ์—์„œ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

 

String ๊ฐ์ฒด๋Š” ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๋ถˆ๋ณ€์ ์ธ ํŠน์ง• ๋•Œ๋ฌธ์— ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด, ๋งค ์—ฐ์‚ฐ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜์ง€๋งŒ,

StringBuffer / StringBuilder ๋Š” ๊ฐ€๋ณ€์„ฑ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— .append() .delete() ๋“ฑ์˜ API๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ผ ๊ฐ์ฒด๋‚ด์—์„œ ๋ฌธ์ž์—ด ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

java-StringBuffer-StringBuilder

 

๋”ฐ๋ผ์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” String ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌธ์ž์—ด์˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ๋ผ๋ฉด String ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ StringBuffer / StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

StringBuilder ๋‚˜ StringBuffer ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ ๋ฌธ๋ฒ•์€ ๋‘˜์ด ๋˜‘๊ฐ™๋‹ค.
๋‹ค๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ž‘ ์ฐจ์ด์  ์กด์žฌํ•˜๋Š”๋ฐ ์ด์— ๋Œ€ํ•ด์„  ๋ฐ”๋กœ ๋’ค์—์„œ ๋‹ค๋ฃฌ๋‹ค. ์ง€๊ธˆ์€ ๋‘˜์ด ๋™์ผ์‹œ๋กœ ๋ด๋„ ๋œ๋‹ค.

StringBuffer์˜ ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์ƒ์ˆ˜(final) ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

public final class StringBuffer implements java.io.Serializable {
	private byte[] value;
}
StringBuffer sb = new StringBuffer(); // new StringBuffer() ์ธ์ˆ˜์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ 16์œผ๋กœ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ์žก์Œ

// sb.capacity() - StringBuffer ๋ณ€์ˆ˜์˜ ๋ฐฐ์—ด ์šฉ๋Ÿ‰์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜
System.out.println(sb.capacity()); // 16 

sb.append("1111111111111111111111111111111111111111"); // 40๊ธธ์ด์˜ ๋ฌธ์ž์—ด์„ append
System.out.println(sb.capacity()); // 40 (์ถ”๊ฐ€๋œ ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๋Š˜์–ด๋‚จ)

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ณ„* ๋ฌธ์ž๋ฅผ ๋ฃจํ”„๋ฌธ์„ ์ˆœํšŒํ• ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€ํ•ด ๊ธธ๋‹ค๋ž€ ๋ณ„ ๋ฌธ์ž์—ด์„ ๋งŒ๋“œ๋Š” ์˜ˆ์ œ๋กœ, ๊ฐ๊ฐ String ๊ฐ์ฒด์™€ StringBuffer ๊ฐ์ฒด๋ฅผ ์ด์šฉํ–ˆ์„์‹œ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

String star = "*";
		
for ( int i = 1; i < 10; i++ ) {
	star += "*";
}
StringBuffer sb= new StringBuffer("*");
sb.append("*********");

java-StringBuffer-StringBuilderjava-StringBuffer-StringBuilder

String ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ ๋งค๋ฒˆ ๋ณ„ ๋ฌธ์ž์—ด์ด ์—…๋ฐ์ดํŠธ ๋ ๋•Œ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์ด ์ถ”๊ฐ€๋˜๊ฒŒ ๋˜๊ณ , ์ผํšŒ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋œ ์ด ๋ฉ”๋ชจ๋ฆฌ๋“ค์€ ํ›„์— Garbage Collector(GC)์˜ ์ œ๊ฑฐ ๋Œ€์ƒ์ด ๋˜์–ด ๋นˆ๋ฒˆํ•˜๊ฒŒ Minor GC๋ฅผ ์ผ์œผ์ผœ Full GC(Major Gc)๋ฅผ ์ผ์œผํ‚ฌ์ˆ˜ ์žˆ๋Š” ์›์ธ์ด ๋œ๋‹ค. (์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ GC ๊ด€๋ฆฌ ์ฐธ๊ณ  ๊ธ€)

๋ฐ˜๋ฉด StringBuffer๋Š” ์œ„ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ์ž์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์—์„œ ๋Š˜์ด๊ณ  ์ค„์ด๊ณ ๋ฅผ ํ• ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ๋” ํšจ์œจ์ ์œผ๋กœ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•์˜ ๊ฐ’ ๋น„๊ต

 

String ๊ฐ’ ๋™๋“ฑ ๋น„๊ต

String ๊ฐ์ฒด๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ equals() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ๋™๋“ฑ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

String str1 = "Hello"; // ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•œ ๋ฐฉ์‹
String str3 = new String("Hello"); // new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹
 
// ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๊ฐ์ฒด ๋ฌธ์ž์—ด ๋น„๊ต
System.out.println(str1 == str3); // false
System.out.println(str3.equals(str1)); // true

 

StringBuffer / StringBuilder ๊ฐ’ ๋™๋“ฑ ๋น„๊ต 

ํ•˜์ง€๋งŒ StringBuffer/StringBuilder ํด๋ž˜์Šค๋Š” String ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์•„ '==' ๋กœ ๋น„๊ตํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋˜ ๋ฒ„๋ฆฐ๋‹ค.

StringBuffer sb = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("hello");

System.out.println(sb == sb2); // false
System.out.println(sb2.equals(sb)); // false

๋”ฐ๋ผ์„œ toString() ์œผ๋กœ StringBuffer/StringBuilder ๊ฐ์ฒด๋ฅผ String ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋‚œ ๋’ค์— equals ๋กœ ๋น„๊ต๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. (์•ฝ๊ฐ„ ๋ฒˆ๊ฑฐ๋กญ๋‹ค)

// StringBuffer๊ฐ์ฒด๋ฅผ toString()์„ ํ†ตํ•ด String๊ฐ์ฒดํ™”๋ฅผ ํ•˜๊ณ  equals ๋น„๊ต
String sb_tmp = sb.toString();
String sb2_tmp = sb2.toString();
System.out.println(sb_tmp.equals(sb2_tmp)); // true

๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•์˜ ์„ฑ๋Šฅ ๋น„๊ต

 

๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ ์„ฑ๋Šฅ

์ž๋ฐ”๋ฅผ ๊ฐœ๋ฐœ ํ•˜๋‹ค๋ณด๋ฉด ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด, ๋ณ„๋‹ค๋ฅธ ๊ณ ๋ฏผ์—†์ด "Hello" + " World" ์™€ ๊ฐ™์ด + ๊ธฐํ˜ธ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์„ ์ด์–ด ๋ถ™์ด๊ณค ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ฐธ๋œ Java ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ณ ๋ฏผ์„ ๋” ํ•ด๋ณด๊ณ  ๋ฌธ์ž์—ด ๊ด€๋ จ Class๋ฅผ ์„ ํƒํ•ด์•ผํ•œ๋‹ค.

์œ„์—์„œ ์•Œ์•„๋ดค๋“ฏ์ด, String ๋ฐ์ดํ„ฐ๋ฅผ + ์—ฐ์‚ฐํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์ด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ถ”๊ฐ€๋˜์–ด ์•ˆ์ข‹๊ธฐ ๋•Œ๋ฌธ์—  String์„ ์ง์ ‘ + ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ๋ฅผ ์ง€์–‘ํ•˜๊ณ  StringBuffer๋‚˜ StringBuilder์˜ append() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฐ˜์€ ๋งž๊ณ  ๋ฐ˜์€ ํ‹€๋ฆฐ ๋ง์ด๋‹ค.

 

์‚ฌ์‹ค ์ž๋ฐ”๋Š” ๋ฌธ์ž์—ด์— + ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ปดํŒŒ์ผ ์ „ ๋‚ด๋ถ€์ ์œผ๋กœ StringBuilder ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ํ›„ ๋‹ค์‹œ ๋ฌธ์ž์—ด๋กœ ๋Œ๋ ค์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

java-StringBuffer-StringBuilder

์ฆ‰, "hello" + "world" ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ์žˆ๋‹ค๋ฉด ์ด๋Š” new StringBuilder("hello").append("world").toString() ๊ณผ ๊ฐ™๋‹ค๋Š” ๋ง์ด๋‹ค.

String a = "hello" + "world";
/* ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. */
String a = new StringBuilder("hello").append("world").toString(); 
// StringBuilder๋ฅผ ํ†ตํ•ด "hello" ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ  "world"๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  toString()์„ ํ†ตํ•ด String ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜

์ด์ฒ˜๋Ÿผ ๊ฒ‰์œผ๋กœ๋Š” ๋ณด๊ธฐ์—๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ + ์—ฐ์‚ฐํ•˜๊ฑฐ๋‚˜, StringBuilder ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์–ด์ฐจํ”ผ ์ž๋™ ๋ณ€ํ™˜ํ•ด์ค˜์„œ ์ฐจ์ด๊ฐ€ ์—†์–ด ๋ณด์ผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด์„ ํ•ฉ์น˜๋Š” ์ผ์ด ๋งŽ์„ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ + ์—ฐ์‚ฐ์„ ์“ฐ๋ฉด ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

String a = "";

for(int i = 0; i < 10000; i++) {
    a = a + i;
}

/* ์œ„์˜ ๋ฌธ์ž์—ด + ์—ฐ์‚ฐ ์‹์€ ๊ฒฐ๊ตญ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. */
/* ์ฆ‰, ๋งค๋ฒˆ new StringBuilder() ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์‹œ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š” ๋ฉ์ฒญํ•œ ์ง“๊ฑฐ๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. */

String a = "";

for(int i = 0; i < 10000; i++) {
    a = new StringBuilder(b).append(i).toString();
}

์œ„์˜ ์˜ˆ์‹œ ์ฒ˜๋Ÿผ ๋งค๋ฒˆ new StringBuilder() ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์‹œ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š” ๋ฉ์ฒญํ•œ ์ง“์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ•œ๋ˆˆ์— ๋ด๋„ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ผ์ด ์žฆ์„ ๊ฒฝ์šฐ + ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ๋ชปํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋งŒ์ผ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ๋งŽ์„ ๊ฒฝ์šฐ ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ StringBuilder() ๊ฐ์ฒด๋กœ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ด์„œ ๋‹ค๋ฃจ๋Š”๊ฒŒ ํ›จ์”ฌ ๋‚ซ๋‹ค.

StringBuilder a = new StringBuilder();

for(int i = 0; i < 10000; i++) {
    a.append(i);
}

final String b = a.toString();

 

String.concat ๊ณผ์˜ ๋น„๊ต

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฌธ์ž์—ด์„ ํ•ฉ์น˜๋Š”๋ฐ ์žˆ์–ด ์ด 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

+ ์—ฐ์‚ฐ์ž ๋˜๋Š” String.concat ๋ฉ”์†Œ๋“œ ์ด์šฉ ๋˜๋Š” StringBuffer ๋˜๋Š” StringBuilder ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

String str = "hello ";

String a = str + "world"; // ์•ž์„œ + ์—ฐ์‚ฐ์€ ์ž๋™์œผ๋กœ StringBuilder๋กœ ๋ณ€ํ™˜๋œ๋‹ค๊ณ  ๋งํ–ˆ๋‹ค.
String b = str.concat("world");
String c = new StringBuffer("hello").append("world").toString();
String d = new StringBuilder("hello").append("world").toString();

์ด์ฒ˜๋Ÿผ String ๊ฐ์ฒด ์ž์ฒด์—๋„ String.concat ๋ฉ”์†Œ๋“œ๋กœ ์ž์ฒด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿผ ์ด์ค‘์— ์–ด๋Š ๊ฒƒ์ด ์„ฑ๋Šฅ์ด ์ข‹์„๊นŒ? ๋‹น์—ฐํžˆ ์Šน์ž๋Š” StringBuffer ์™€ StringBuilder ๊ฐ์ฒด์ด๋‹ค.

 

String.concat ๊ฐ™์€ ๊ฒฝ์šฐ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์›๋ณธ ๋ฌธ์ž์—ด์˜ ๋งค๋ฒˆ ๋ฐฐ์—ด์„ ์žฌ๊ตฌ์„ฑ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ๋Š๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๋ฐ˜๋ฉด StringBuilder๋‚˜ StringBuffer๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์žก๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ์น˜๋Š” ๊ณผ์ •์ด String.concat ๋ณด๋‹ค ์›”๋“ฑํžˆ ๋น ๋ฅด๋‹ค.

String.concat-stringbuilder-stringbuffer

 

์„ฑ๋Šฅ์ƒ์—์„œ ๋ฌธ์ž์—ด ์ž๋ฃŒํ˜• ์„ ํƒ ๊ฒฐ๋ก 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด StringBuffer / StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๋‹ค๊ณ  ๋งน์‹ ํ• ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ๊ฑด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

StringBuffer๋‚˜ StringBuilder์„ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ buffer์˜ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ธฐ์— ์„ค์ •ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฌด๊ฑฐ์šด ํŽธ์— ์†ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  StringBuffer๋‚˜ StringBuilder์—์„œ ๋ฌธ์ž์—ด ์ˆ˜์ •์„ ํ•  ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ค„์ด๊ณ  ๋ช…์นญ์„ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๋‚ด๋ถ€์ ์ธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋งŽ์€ ์–‘์˜ ๋ฌธ์ž์—ด ์ˆ˜์ •์ด ์•„๋‹ˆ๋ผ๋ฉด String ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์˜คํžˆ๋ ค ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.

String ํด๋ž˜์Šค๋Š” ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์ฝ๋Š” ์กฐํšŒ ์—ฐ์‚ฐ์—์„œ๋Š” StringBuffer๋‚˜ StringBuilder ํด๋ž˜์Šค๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ •๋ฆฌํ•˜์ž๋ฉด, ๋ฌธ์ž์—ด ์ถ”๊ฐ€๋‚˜ ๋ณ€๊ฒฝ๋“ฑ์˜ ์ž‘์—…์ด ๋งŽ์„ ๊ฒฝ์šฐ์—๋Š” StringBuffer๋ฅผ, ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ์ž‘์—…์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ String์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.


StringBuffer vs StringBuilder ์ฐจ์ด์ 

StringBuffer์™€ StringBuilder ํด๋ž˜์Šค๋Š” ๋‘˜ ๋‹ค ํฌ๊ธฐ๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๊ฐ€๋ณ€์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ๋˜‘๊ฐ™๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋™์ผํ•˜๋‹ค.

๊ทธ๋Ÿผ ์ด ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•  ํ•„์š”์—†์ด, ์‚ฌ์‹ค ๋‘˜์˜ ์ฐจ์ด๋Š” ๋”ฑ ํ•œ๊ฐ€์ง€์ด๋‹ค.
๋ฐ”๋กœ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ(Thread)์—์„œ ์•ˆ์ „(safe)ํ•˜๋ƒ ์•„๋‹ˆ๋ƒ ์ด ์ฐจ์ด ๋ฟ์ด๋‹ค.

 

์“ฐ๋ ˆ๋“œ์˜ ์•ˆ์ •์„ฑ

java-StringBuffer-StringBuilder

  • StringBuffer ํด๋ž˜์Šค๋Š” ์“ฐ๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๋‹ค. (thread safe)
  • StringBuilder ํด๋ž˜์Šค๋Š” ์“ฐ๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.(thread unsafe) 

๋‘ ํด๋ž˜์Šค๋Š” ๋ฌธ๋ฒ•์ด๋‚˜ ๋ฐฐ์—ด๊ตฌ์„ฑ๋„ ๋ชจ๋‘ ๊ฐ™์ง€๋งŒ, ๋™๊ธฐํ™”(Synchronization)์—์„œ์˜ ์ง€์›์˜ ์œ ๋ฌด๊ฐ€ ๋‹ค๋ฅด๋‹ค. 

StringBuilder๋Š” ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด, StringBuffer๋Š” ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” StringBuffer๋Š” ๋ฉ”์„œ๋“œ์—์„œ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

java์—์„œ synchronized ํ‚ค์›Œ๋“œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ž์›์— ์ ‘๊ทผํ• ๋ ค๊ณ  ํ•  ๋•Œ, ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์Šค๋ ˆ๋“œ๋“ค์ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๊ธ€๋กœ๋งŒ ๋ณด๋ฉด ์ด๊ฒŒ ์ •ํ™•ํžˆ ์–ด๋–ค ํ˜„์ƒ์ธ์ง€ ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. ์ง์ ‘ StringBuilder์™€ StringBuffer๋ฅผ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.

์•„๋ž˜์˜ ์˜ˆ์ œ๋Š” StringBuilder์™€ StringBuffer ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ , ๋‘๊ฐœ์˜ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ๋ ค StringBuilder์™€ StringBuffer ๊ฐ์ฒด์— ๊ฐ๊ฐ 1 ์š”์†Œ๋ฅผ 1๋งŒ๋ฒˆ ์ถ”๊ฐ€ํ•˜๋Š”(append) ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ ์ฝ”๋“œ์ด๋‹ค.

๋‘๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๊ณ  ํ•œ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ฐฐ์—ด์š”์†Œ๋ฅผ 1๋งŒ๋ฒˆ ์ถ”๊ฐ€ํ•˜๋‹ˆ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” 20000์ด ๋œ๋‹ค๊ณ  ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.util.*;

public class Main extends Thread{
  public static void main(String[] args) {
    StringBuffer stringBuffer = new StringBuffer();
    StringBuilder stringBuilder = new StringBuilder();

    new Thread(() -> {
        for(int i=0; i<10000; i++) {
            stringBuffer.append(1);
            stringBuilder.append(1);
        }
    }).start();

    new Thread(() -> {
        for(int i=0; i<10000; i++) {
            stringBuffer.append(1);
            stringBuilder.append(1);
        }
    }).start();

    new Thread(() -> {
        try {
            Thread.sleep(2000);

            System.out.println("StringBuffer.length: "+ stringBuffer.length()); // thread safe ํ•จ
            System.out.println("StringBuilder.length: "+ stringBuilder.length()); // thread unsafe ํ•จ
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
  }
}
StringBuffer.length: 20000
StringBuilder.length: 19628

ํ•˜์ง€๋งŒ ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

StringBuilder์˜ ๊ฐ’์ด ๋” ์ž‘์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์ด ๋™์‹œ์— StringBuilder ํด๋ž˜์Šค์— ์ ‘๊ทผํ•˜์—ฌ ๋™์‹œ์— append() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋‹ค ๋ช‡๋ฒˆ ์”นํ˜€์„œ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰์ด ์•ˆ๋˜์–ด ์ผ์–ด๋‚œ ๊ฒฐ๊ณผ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

StringBuilder๋Š” Thread safe ํ•˜์ง€ ์•Š์•„์„œ ๊ฐ๊ธฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ๋ณ€๊ฒฝ์„ ํ•˜๋ฉด ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

 

์ด์™€ ๋‹ฌ๋ฆฌ StringBuffer๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ(multi thread)ํ™˜๊ฒฝ์—์„œ, ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ append() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์„๊ฒฝ์šฐ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ append() ๋ฅผ ์ˆ˜ํ–‰์„ ๋™์‹œ์— ํ•˜์ง€๋ชปํ•˜๋„๋ก ์ž ์‹œ ๋Œ€๊ธฐ๋ฅผ ์‹œ์ผœ์ฃผ๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋™์‹œ์— ์ ‘๊ทผํ•ด ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ฏ€๋กœ Thread Safe๋กœ์„œ ์ •์ƒ์ ์œผ๋กœ 2๋งŒ๊ฐœ์˜ ๋ฐฐ์—ด์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ web์ด๋‚˜ ์†Œ์ผ“ํ™˜๊ฒฝ๊ณผ ๊ฐ™์ด ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๋•Œ๋Š” StringBuffer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ˆ˜๊ฐ€ ์žˆ๋‹ค.


์ˆœ์ˆ˜ ์„ฑ๋Šฅ ๋น„๊ต

๊ทธ๋Ÿผ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ด ๋‘ ํด๋ž˜์Šค์˜ ์„ฑ๋Šฅ์€ ๋ˆ„๊ฐ€ ์šฐ์›”ํ• ๊นŒ?

๋‹ค์Œ์€ String ๊ฐ์ฒด ๊ทธ๋ฆฌ๊ณ  StringBuffer์™€ StringBuilder ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ  5๋งŒ๋ฒˆ์„ ๋ฃจํ”„ํ•ด ๋ณ„๋ฌธ์ž * ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์„ duration1, duration2, duration3 ๋ณ€์ˆ˜์— ๊ณ„์‚ฐํ•ด ์ €์žฅํ•œ๋‹ค.

final int lengths = 50000;

// ------------- (1) String์˜ +์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ 50,000๊ฐœ์˜ *๋ฅผ ์ด์–ด ๋ถ™์ธ๋‹ค.
long startTime1 = System.currentTimeMillis(); // ์‹œ์ž‘์‹œ๊ฐ„์„ ๊ธฐ๋ก (millisecond๋‹จ์œ„)

String str="";
for(int i=0;i<lengths;i++){
    str=str+"*";
}

long endTime1 = System.currentTimeMillis(); // ์ข…๋ฃŒ์‹œ๊ฐ„์„ ๊ธฐ๋ก(millisecond๋‹จ์œ„)


// ------------- (2) StringBuffer๋ฅผ ์ด์šฉํ•ด์„œ 50,000๊ฐœ์˜ *๋ฅผ ์ด์–ด๋ถ™์ธ๋‹ค.              
long startTime2 = System.currentTimeMillis(); 

StringBuffer sb = new StringBuffer();
for(int i=0;i<lengths;i++){
    sb.append("*");
}

long endTime2 = System.currentTimeMillis(); 


// ------------- (3) StringBuilder๋ฅผ ์ด์šฉํ•ด์„œ 50,000๊ฐœ์˜ *๋ฅผ ์ด์–ด๋ถ™์ธ๋‹ค.              
long startTime3 = System.currentTimeMillis(); 

StringBuilder sb2 = new StringBuilder();
for(int i=0;i<lengths;i++){
    sb2.append("*");
}

long endTime3 = System.currentTimeMillis(); 


// ------------- ๋ฐฉ๋ฒ•(1), ๋ฐฉ๋ฒ•(2), ๋ฐฉ๋ฒ•(3)๊ฐ€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋น„๊ต
long duration1 = endTime1 - startTime1;
long duration2 = endTime2 - startTime2;
long duration3 = endTime3 - startTime3;

System.out.println("String์˜ +์—ฐ์‚ฐ์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : "+ duration1); // 559
System.out.println("StringBuffer์˜ append()์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : "+ duration2); // 10
System.out.println("StringBuilder์˜ append()์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : "+ duration3); // 3
String์˜ +์—ฐ์‚ฐ์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : 559
StringBuffer์˜ append()์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : 10
StringBuilder์˜ append()์„ ์ด์šฉํ•œ ๊ฒฝ์šฐ : 3

๋ฌธ์ž์—ด ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๊ธฐ๋ณธ ์„ฑ๋Šฅ์€ StringBuilder ํด๋ž˜์Šค๊ฐ€ ์šฐ์›”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ + ์—ฐ์‚ฐ ์‹œ, ์ปดํŒŒ์ผ ์ „์— StringBuilder ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค.

 

์ด๋Š” ์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

StringBuffer์™€ StringBuilder ์˜ ์ฐจ์ด๋Š” ์“ฐ๋ ˆ๋“œ ์•ˆ์ •์„ฑ์— ์žˆ๋‹ค๊ณ  ํ•™์Šตํ–ˆ๋Š”๋ฐ, ์•„๋ฌด๋ž˜๋„ ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ฒ„๋ฆฐ StringBuilder๊ฐ€ ์ข€๋” ๋œ ๋”ฐ์ง€๊ณ  ์—ฐ์‚ฐ์„ ํ•˜๋‹ˆ ๋‹น์—ฐํžˆ ์ข€ ๋” ๋น ๋ฅผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

java-StringBuffer-StringBuilder

์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด 10๋งŒ๋ฒˆ ์ด์ƒ์˜ ์—ฐ์‚ฐ์‹œ String ๊ฐ์ฒด๋Š” ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜์ง€๋งŒ, StringBuilder์™€ StringBuffer๋Š” 1000๋งŒ๋ฒˆ๊นŒ์ง€ ๋ฒ„ํ‹ฐ๋ฉฐ, ๊ทธ ์ด์ƒ์€ StringBuilder๊ฐ€ ์šฐ์›”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋‚˜ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์—†์œผ๋ฉด, StringBuilder๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์—…์—์„œ๋Š” ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋Œ€๋ถ€๋ถ„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ด์ƒ์˜ ํ™˜๊ฒฝ์—์„œ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์™ ๋งŒํ•˜๋ฉด ์•ˆ์ •์ ์ธ StringBuffer๋กœ ํ†ต์ผํ•˜์—ฌ ์ฝ”๋”ฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. (์†”์งํžˆ StringBuffer ์™€ StringBuilder ์†๋„ ์ฐจ์ด๋Š” ๊ฑฐ์˜ ๋ฏธ๋ฏธํ•˜๋‹ค)


๋ฌธ์ž์—ด ์ž๋ฃŒํ˜• ๋น„๊ต ์ด์ •๋ฆฌ

  String StringBuffer StringBuilder
๊ฐ€๋ณ€ ์—ฌ๋ถ€ ๋ถˆ๋ณ€ ๊ฐ€๋ณ€ ๊ฐ€๋ณ€
์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ O O X
์—ฐ์‚ฐ ์†๋„ ๋Š๋ฆผ ๋น ๋ฆ„ ์•„์ฃผ ๋น ๋ฆ„
์‚ฌ์šฉ ์‹œ์  ๋ฌธ์ž์—ด ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ์ ๊ณ , ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ž์—ด ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ๋งŽ๊ณ , ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ž์—ด ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ๋งŽ๊ณ , ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ผ๊ฒฝ์šฐ
  • String ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ :
    • String์€ ๋ถˆ๋ณ€์„ฑ
    • ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ์ ๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์„ ์ž์ฃผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
    • ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์ผ ๊ฒฝ์šฐ 
  • StringBuilder ๋ฅผ ์‚ฌ์šฉ ํ•ด์•ผ ํ•  ๋•Œ :
    • StringBuilder๋Š” ๊ฐ€๋ณ€์„ฑ
    • ๋ฌธ์ž์—ด์˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์ด ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„, ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ์ด๊ฑฐ๋‚˜ ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ
    • ์†๋„๋ฉด์—์„  StringBuffer ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
  • StringBuffer ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ :
    • StringBuffer๋Š” ๊ฐ€๋ณ€์„ฑ
    • ๋ฌธ์ž์—ด์˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์ด ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์—ฌ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘

# ์ฐธ๊ณ ์ž๋ฃŒ

https://stackoverflow.com/questions/32714194/where-is-implemented-for-strings-in-the-java-source-code

https://dejavuhyo.github.io/posts/string-stringbuffer-stringbuilder/

https://venishjoe.net/post/java-string-concatenation-and-performance/

https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java

https://wikidocs.net/276

https://velog.io/@minnseong/String