๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Java

[Java] ์ž๋ฐ”์—์„œ '+' ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ๋ฅผ ์ง€์–‘ํ•˜๋ผ

by ์•ˆ์ฃผํ˜• 2022. 7. 19.

์„œ๋ก 

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

 

[Java] StringBuffer์™€ StringBuilder

์„œ๋ก  [Java] String ํด๋ž˜์Šค ์„œ๋ก  c์–ธ์–ด ๊ฐ™์€ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด์„ charํ˜•์˜ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ String ํด๋ž˜์Šค์ธ๋ฐ, String ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์„ ์ €์žฅ

dkswnkk.tistory.com

 

[Java] String ํด๋ž˜์Šค

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

dkswnkk.tistory.com

๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์‹œ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. String ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ immutable ํด๋ž˜์Šค์ด๋‹ค.

  • ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ String ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด์€ ์ฝ์–ด ์˜ฌ ์ˆ˜๋งŒ ์žˆ๊ณ , ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด '+'์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค ๋‚ด์˜ ๋ฌธ์ž์—ด์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด("ab")์ด ๋‹ด๊ธด String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

2. String๊ณผ ๋‹ฌ๋ฆฌ StringBuffer๋Š” ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  • StringBuffer ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ ์ ˆํ•œ ๊ธธ์ด์˜ charํ˜• ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๊ณ , ์ด ๋ฐฐ์—ด์€ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ณ  ํŽธ์ง‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„(buffer)์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋งŒ์•ฝ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์—…ํ•˜๋ ค๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ณด๋‹ค ์ž‘์„ ๋•Œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ํ›„์— ์ด์ „ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์™œ ์ž๋ฐ”์—์„œ '+' ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ๋ฅผ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

String '+' ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •

stackoverflow ์ฐธ์กฐ

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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๋ฉด์—์„œ ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€