ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

โœ”๏ธ String๊ณผ StringBuffer, StringBuilder ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฑธ๊นŒ

๊ฒฐ๋ก ๋ถ€ํ„ฐ ์ด์•ผ๊ธฐํ•˜๋ฉด ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ String ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , StringBuffer ํ˜น์€ StringBuilder ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

String ํด๋ž˜์Šค

  • ๊ฐ์ฒด(new ํ‚ค์›Œ๋“œ)๋กœ ์„ ์–ธํ•œ ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค.
  • ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ String ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๊ฐ€๋ณ€ ๋ฌธ์ž์—ด์ด๋‹ค.
  • ๋ฆฌํ„ฐ๋Ÿด๋ฐฉ์‹(๋”ฐ์˜ดํ‘œ)์€ ๊ฐ™์€ ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋“ค์˜ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์ด ๋™์ผํ•˜๋‹ค๋ฉด ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉฐ ์ข€ ๋” ์ž์„ธํžˆ ์ด์•ผ๊ธฐ ํ•ด๋ณด์ž.

    String str1 = "a";
    String str2 = "a";
    String str3 = new String("a");
    String str4 = new String("a");

์ฝ”๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.

 

์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค heap area์˜์—ญ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ  ์ฃผ๋ชฉํ•ด์•ผํ•  ๊ฒƒ์€ str1๊ณผ str2์ด๋‹ค. str3๊ณผ str4๋Š” ๋ฌธ์ž์—ด์ด ์ •์˜๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ str1,str2๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ String์˜ ํŠน์ง•์ธ " ๋ฆฌํ„ฐ๋Ÿด๋ฐฉ์‹์€ ๊ฐ™์€ ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค" ์ด๋‹ค. jvm์€ ๊ธฐ๋ณธ์ ์œผ๋กœ String Constant Pool์„ ํ™•์ธํ•˜์—ฌ, ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

Here the JVM checks the String Constant Pool. If the string does not exist then a new string instance is created and placed in the pool if the string exists then it will not create a new object rather it will return the reference to the same instance

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ab ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ชจ์Šต์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

 

str3๋Š” ์ƒˆ๋กœ์šด ab ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, str2_1์˜ ๊ฒฝ์šฐ ab์˜ ๋ฌธ์ž์—ด์ด String Contant Pool์— ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ  String์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ ์žฌ๋œ๋‹ค. ์ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ด์•ผ๊ธฐ ํ•˜๋ฉด String ํด๋ž˜์Šค๋Š” ๋‚ด์šฉ์˜ ๋ณ€ํ™”๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋ถ€์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ๊ฒƒ์ด StringBuffer, StringBuilder ํด๋ž˜์Šค์ด๋‹ค.

 

StringBuffer ์™€ StringBuilder ํด๋ž˜์Šค

  • String ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ณ€ ๋ฌธ์ž์—ด์ด๋‹ค.
  • StringBuffer๋Š” ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด ๋™๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‚˜ ์ด๋Š” ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.
  • StringBuilder๋Š” StringBuffer๊ฐ€ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š” ๋™๊ธฐํ™”๋ฅผ ์ œ๊ฑฐํ•œ ํด๋ž˜์Šค์ด๋‹ค.(๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.)
  • ์ด ๋‘ ํด๋ž˜์Šค๋Š” ๋ฉ”์„œ๋“œ์™€ ์‚ฌ์šฉ๋ฒ• ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค.
  • String ํด๋ž˜์Šค์™€ ๋น„๊ตํ–ˆ์„๋•Œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ stringBuilder์˜ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

 

โœ”๏ธ StringBuffer์™€ StringBuilder๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜

์œ„์—์„œ String ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์งˆ ๊ฒฝ์šฐ ์ˆ˜๋งŽ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  GC์™€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” SB ํด๋ž˜์Šค(์ดํ•˜ StringBuffer, StringBuilder)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. SBํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.  ๊ทธ ์ค‘ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€  append() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค.

    StringBuffer sb = new StringBuffer();
    sb.append("kithub");
    sb.append("stringBuffer");


    StringBuilder sb2 = new StringBuilder();
    sb2.append("kithub");
    sb2.append("stringBuilder");

    System.out.println(sb.toString() + " / "+ sb2.toString());

 

์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ SBํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฐธ์กฐํ•˜๊ณ , ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝ ํ•˜๋Š”๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฐํ–‰์œ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ผ๊นŒ ? ์‹ค์ œ append์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = value.length >> coder;
        int newCapacity = (oldCapacity << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
        return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

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

 

โ“ ๋ฌด์กฐ๊ฑด StringBuffer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ

๊ทธ๊ฑด ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. StringBuffer ์ž๋ฃŒํ˜•์€ String ์ž๋ฃŒํ˜•๋ณด๋‹ค ๋ฌด๊ฑฐ์šด ํŽธ์— ์†ํ•œ๋‹ค. new StringBuffer() ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜ String์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ๋งŽ๊ณ  ์†๋„๋„ ๋Š๋ฆฌ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ž์—ด ์ถ”๊ฐ€๋‚˜ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์ž‘์—…์ด ๋งŽ์„ ๊ฒฝ์šฐ์—๋Š” SBํด๋ž˜์Šค๋ฅผ , ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ ์ž‘์—…์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” String ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

 

 

โœ”๏ธ๊ฒฐ๋ก  

์„œ๋น„์Šค์™€ ๊ด€๋ จํ•ด ์š”์ฒญ/์‘๋‹ต์— ๋Œ€ํ•ด ๋งŽ์€ ์–‘์˜ ๋ฌธ์ž์—ด์„ Stirng์œผ๋กœ ๋ถ™์ž„์ƒ์„ฑ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, StirngBuilder ํ˜น์€ StringBuffer๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ๊ฐœ์„ ์„ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„๋“ฏ ํ•˜๋‹ค.

 


โ—๏ธ  += ์—ฐ์‚ฐ์ž๋Š” String Constatnt Pool์— ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

    String str1 = "kithub";
    String str2 = "kithub";

    System.out.println("์ฃผ์†Œ๊ฐ’ ๊ฐ™์Œ > "+(str1==str2));

    String str3 = "kit";
    str3+="hub";
    String str4 = "kithub";

    System.out.println("์ฃผ์†Œ๊ฐ’ ๋‹ค๋ฆ„ > "+(str3==str4));
    
    ===========================================
 	์ฃผ์†Œ๊ฐ’ ๊ฐ™์Œ > true
	์ฃผ์†Œ๊ฐ’ ๋‹ค๋ฆ„ > false

 

๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•