Java

Java ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ: String vs StringBuilder์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ๋ถ„์„

9taetae9 2024. 10. 26. 16:17
728x90

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

String๊ณผ StringBuilder์˜ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๊ณ , ์™œ ๋ฐ˜๋ณต์ ์ธ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์ž‘์—…์—์„œ StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

String์˜ ํŠน์„ฑ => Immutable(๋ถˆ๋ณ€)

Java์—์„œ String์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋‹ค. ์ฆ‰, ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด์˜ ๋‚ด์šฉ์€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. String์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

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

์œ„์˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์—์„œ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. "hello"๋ผ๋Š” String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
  2. "world"๋ผ๋Š” String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
  3. "hello"์™€ "world"๋ฅผ ์—ฐ๊ฒฐํ•œ ์ƒˆ๋กœ์šด String ๊ฐ์ฒด "helloworld"๊ฐ€ ์ƒ์„ฑ๋จ
  4. str ๋ณ€์ˆ˜๊ฐ€ ์ƒˆ๋กœ์šด "helloworld" ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋ณ€๊ฒฝ๋จ
  5. ์›๋ž˜์˜ "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)));
    }
}

string : ์‹คํ–‰ ๊ฒฐ๊ณผ

์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. static ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…๊ณผ ์ ‘๊ทผ ๋ฒ”์œ„๋งŒ ๋ณ€๊ฒฝํ•  ๋ฟ, String์˜ ๋ถˆ๋ณ€ ํŠน์„ฑ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

StringBuilder๋ฅผ ํ†ตํ•œ ๊ฐ€๋ณ€์ ์ธ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ

StringBuilder๋Š” ์ด๋Ÿฌํ•œ String์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋‹ค. StringBuilder์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐ€๋ณ€(mutable) ๊ฐ์ฒด
  2. ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฌธ์ž์—ด ์ˆ˜์ •
  3. ๋ฌธ์ž์—ด ์ถ”๊ฐ€ ์‹œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ์ด ๋ถˆํ•„์š”
  4. ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

์•„๋ž˜์˜ ๊ฐ™์ด 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)));

stringbuilder : ์‹คํ–‰ ๊ฒฐ๊ณผ

์„ฑ๋Šฅ ์ฐจ์ด

String๊ณผ StringBuilder์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋”์šฑ ๊ทน๋ช…ํ•˜๊ฒŒ ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ 1000๋ฒˆ์˜ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ

  • String: 1000๊ฐœ์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
  • StringBuilder: 1๊ฐœ์˜ ๊ฐ์ฒด๋งŒ ์‚ฌ์šฉ

๋ฐ˜๋ณตํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์‹คํ–‰ ์‹œ๊ฐ„์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.

 

์–ธ์ œ StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋ ๊นŒ?

StringBuilder๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํžˆ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ฐ˜๋ณต์ ์ธ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ
  2. ๊ธด ๋ฌธ์ž์—ด์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ
  3. ๋ฌธ์ž์—ด ์กฐ์ž‘์ด ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ
  4. ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฌธ์ž ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ

๋ฐ˜๋ฉด, ๋‹จ์ˆœํžˆ ํ•œ ๋ฒˆ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์„ ํ•œ๋‹ค๊ฑฐ๋‚˜ ์งง์€ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜ String์„ ์‚ฌ์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค.

 

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

 

์•ž์œผ๋กœ๋Š” String๊ณผ StringBuilder์˜ ํŠน์„ฑ์„ ์ˆ™์ง€ํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋” ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค.

728x90