๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’กCS/Java

[Java] String, StringBuffer, StringBuilder

by hyeon-z 2023. 6. 9.

 

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

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

 

String 

 

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

์ฆ‰, ๋ถˆ๋ณ€์˜ ์†์„ฑ์„ ๊ฐ–๋Š”๋‹ค.(immutable)

 

์ฐธ๊ณ ) String ๋‚ด๋ถ€ ์ฝ”๋“œ

public final class String implements java.io.Serializable, Comparable {
	private final byte[] value;
}

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž.

public static void main(String[] args) {
    String str = "Hello";
    str += "World";

    System.out.println(str);
}

์ฒ˜์Œ "Hello"์— "World"๋ฅผ ๋”ํ•ด์„œ str์˜ ๊ฐ’์ด ์ˆ˜์ •๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค์€ ์ƒˆ๋กœ์šด ์˜์—ญ์„ ํ†ตํ•ด ๊ฐ’์„ ์ฐธ์กฐํ•œ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ‘† String str = "Hello";

 

๐Ÿ‘† str += "World";

str๋ณ€์ˆ˜๊ฐ€ ์ฒ˜์Œ ํ• ๋‹น๋ฐ›์•˜๋˜ ์˜์—ญ์˜ ๊ฐ’์„ "HelloWorld"๋กœ ์ˆ˜์ •ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "HelloWorld"๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ์˜์—ญ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

public static void main(String[] args) {
    String str = "Hello";
    str.toUpperCase();

    System.out.println(str);  // Hello
}

ํ•ด๋‹น ์˜ˆ์ œ ๋˜ํ•œ ์ž์ฒด ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ณด์—ฌ์ค€๋‹ค.

 

StringBuffer, StringBuilder

 

๊ฐ์ฒด์˜ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด์ง€๋Š” ๊ฒฝ์šฐ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋Š˜๋ ค์ฃผ์–ด ๊ฐ€๋ณ€(mutable)์ ์ด๋‹ค.

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

 

public static void main(String[] args) {
    StringBuffer sb = new StringBuffer("Hello");
    sb.append("World");

    System.out.println(sb);
}

 

 ๐Ÿ‘†StringBuffer sb = new StringBuffer("Hello")

 

๐Ÿ‘† sb.append("World")

๋™์ผ ๊ฐ์ฒด ๋‚ด์—์„œ ๋ฌธ์ž์—ด ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

โœ… ์ •๋ฆฌ

 

String: ๋ฌธ์ž์—ด์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์ถ”๊ฐ€๋˜๊ฒŒ ๋œ๋‹ค.

StringBuffer, StringBuilder: ์ƒˆ๋กญ๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

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

 

StringBuffer, StringBuilder ์ฐจ์ด

 

StringBuffer์™€ StringBuilder๋Š” ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค.

๋ฐ”๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Thread)์—์„œ ์•ˆ์ „(safe)ํ•œ ์ง€, ๊ทธ๋ ‡์ง€ ์•Š์€์ง€์˜ ์ฐจ์ด๋ฟ์ด๋‹ค.

 

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•ด๋ณด์ž๋ฉด

๐Ÿ‘† StringBuffer ํด๋ž˜์Šค๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๋‹ค. (thread safe)

๐Ÿ‘† StringBuilder ํด๋ž˜์Šค๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. (thread unsafe)

 

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

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

 

๐Ÿ’กJava์˜ synchronized

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

 

Reference

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

๋Œ“๊ธ€