Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Java] - String Builder์™€ String Buffer - Fin #115

Open
Irisation23 opened this issue Mar 9, 2023 Discussed in #114 · 0 comments
Open

[Java] - String Builder์™€ String Buffer - Fin #115

Irisation23 opened this issue Mar 9, 2023 Discussed in #114 · 0 comments
Assignees
Labels
Java Java ๊ด€๋ จ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.

Comments

@Irisation23
Copy link
Member

Discussed in https://github.com/orgs/cs-collections/discussions/114

Originally posted by bunsung92 March 9, 2023
๐Ÿ“ ๊ตฌ์„ฑ

Table of contents generated with markdown-toc


0. ํ•ต์‹ฌ ์š”์•ฝ ๐Ÿ“š

  • Thread-Safe ํ•˜๊ณ  ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” StringBuilder, StringBuffer, String ์ค‘์—์„œ StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜์ž.

  • Thread-Safe ํ•˜์ง€ ์•Š๊ณ  String ์—ฐ์‚ฐ์ด ๋งŽ์„ ๊ฒฝ์šฐ๋Š” StringBuffer์˜ ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋œ๋‹ค.

1. String์˜ Immutable

์ž๋ฐ”์—์„œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” String์€ ๋ถˆ๋ณ€์ด๋‹ค.
๋ฌธ์ž์—ด์ด ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

+ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๊ธฐ์กด ๋ฌธ์ž์—ด์— ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ์ด๋‹ค. ๊ธฐ์กด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ ธ Unreachable ์ƒํƒœ๊ฐ€ ๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋Œ€์ƒ์ด ๋œ๋‹ค.

String์„ ์กฐ์ž‘ํ•˜๋Š” ์—ฐ์‚ฐ์€ ์‹œ๊ฐ„๊ณผ ์ž์›(๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


2. StringBuilder์™€ StringBuffer

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

๊ทธ๋ ‡๋‹ค๋ฉด StringBuilder์™€ StringBuffer์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?
๋ฐ”๋กœ ๋™๊ธฐํ™” ์ด์Šˆ์— ๋‹ค๋ฅด๊ฒŒ ๋Œ€์ฒ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

StringBuilder๋Š” ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
StringBuffer๋Š” ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

์•„๋ž˜์˜ append() ๊ตฌํ˜„์„ ๋ณด๋ฉด ๋™๊ธฐํ™” ์—ฌ๋ถ€์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜์žˆ๋‹ค.

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

public synchronized StringBuffer append(String str) {
    super.append(str);
    return this;
}

synchronized ๊ฐ€ ๊ฑธ๋ฆฐ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์ด ๋Š๋ฆด ๊ฑฐ๋ผ๋Š” ์ถ”์ธก์€ ๋ˆ„๊ตฌ๋‚˜ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์„ฑ๋Šฅ ์œ„์ฃผ๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋“ค์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.


3. StringBuilder & StringBuffer Performance Test

๊ฐ€์žฅ ๋จผ์ € ์‹œ๊ฐ„ ์ธก์ •๊ณผ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค.

  • Performance ํด๋ž˜์Šค
public class Performance {

    private long startTime;
    private long endTime;

    // ์‹œ์ž‘ ์‹œ๊ฐ„์„ ์ฒดํฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public void startClock() {
        startTime = System.nanoTime();
    }

    // ์ข…๋ฃŒ ์‹œ๊ฐ„์„ ์ฒดํฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public void stopClock() {
        endTime = System.nanoTime();
    }

    // ๊ฒฐ๊ณผ ์ถœ๋ ฅ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
    public void printResult(String clockName) {
        System.out.printf("%s" + ": %.3f seconds %n",
            clockName, (endTime - startTime) / (double) 1_000_000_000);

        resetTime();
    }

    // ์‹œ๊ฐ„ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ
    private void resetTime() {
        startTime = 0L;
        endTime = 0L;
    }
}

๊ฐ™์€ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ํผํฌ๋จผ์Šค ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•จ.

  • StringBuilder์™€ String ํ…Œ์ŠคํŠธ
public class TimeTest {

    private static final int MAX_LOOP_COUNT = 50_000;

    public static void main(String[] args) {

        Performance performance = new Performance();

        // StringBuilder
        StringBuilder builder = new StringBuilder();
        performance.startClock();

        for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) {
            builder.append("test")
                   .append(loop)
                   .append("play");
        }

        performance.stopClock();
        performance.printResult("StringBuilder");

        //String
        String str = "";
        performance.startClock();
        for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) {
            str += "test" + loop + "play";
        }

        performance.stopClock();
        performance.printResult("String");
    }
}
image
  • StringBuffer ํ…Œ์ŠคํŠธ
public class TimeTest2 {

    private static final int MAX_LOOP_COUNT = 50_000;

    public static void main(String[] args) {

        Performance performance = new Performance();

        //StringBuffer
        StringBuffer buffer = new StringBuffer();
        performance.startClock();

        for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) {
            buffer.append("test")
                  .append(loop)
                  .append("play");
        }

        performance.stopClock();
        performance.printResult("StringBuffer");
    }
}
image

๊ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋“ค์„ ๋ณด๊ฒŒ๋˜๋ฉด 5๋งŒ๋ฒˆ ํ…Œ์ŠคํŠธ์—์„œ์˜ ์„ฑ๋Šฅ์€ StringBuilder์™€ StringBuffer๋Š” ํฐ ์„ฑ๋Šฅ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ String ์—ฐ์‚ฐ์€ ํ™•์‹คํžˆ ๋Š๋ฆฌ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜์žˆ๋‹ค.

image

์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด ์•ฝ 100๋งŒ ํšŒ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์กฐ๊ธˆ์”ฉ ์ฐจ์ด๊ฐ€ ๋‚˜๊ฒŒ๋œ๋‹ค.

์—ฐ์‚ฐ์ด ๋งŽ์•„์ง„๋‹ค๋ฉด StringBuilder๊ฐ€ StringBuffer ๋ณด๋‹ค ์ˆ˜ํ–‰ ๋Šฅ๋ ฅ์ด ์ข‹๋‹ค.


4. ํšŒ๊ณ  ๐Ÿงน

2023-03-09 ๋ชฉ

  • StringBuilder์™€ StringBuffer์˜ ๋น„๊ต๋Š” ํ”ํ•˜๋”” ํ”ํ–ˆ์ง€๋งŒ ์„ฑ๋Šฅ ๊ด€์ ์—์„œ ์ง๊ด€์ ์œผ๋กœ ๋ณผ ์ˆ˜์žˆ๋Š” ์ž๋ฃŒ๊ฐ€ ์žˆ์–ด์„œ ์ •๋ฆฌํ•˜๊ธฐ ์ข‹์•˜๋‹ค.
  • ์ด๋กœ์จ String ์‹œ๋ฆฌ์ฆˆ๋Š” StringTokenizer ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ๋  ๊ฒƒ ๊ฐ™๋‹ค.
  • ์™œ J๋ชจ ๊ต์ˆ˜๊ฐ€ StringBuffer๋ฅผ ํ†ตํ•œ ์—ฐ์‚ฐ์—์„œ ๊ฑฐํ’ˆ์„ ๋ฌผ์—ˆ๋Š”์ง€ ๋‹ค์‹œ๊ธˆ ์ƒ๊ธฐ ๋˜์—ˆ๋‹ค. (ํ•˜์ง€๋งŒ ์œ ์˜๋ฏธํ•œ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋„ ์•„๋‹ˆ์˜€๋Š”๋ฐ...)
@Irisation23 Irisation23 added the Java Java ๊ด€๋ จ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค. label Mar 9, 2023
@Irisation23 Irisation23 self-assigned this Mar 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Java Java ๊ด€๋ จ ๋ผ๋ฒจ์ž…๋‹ˆ๋‹ค.
Projects
None yet
Development

No branches or pull requests

1 participant