string

string vs String

string a;
String b;
  • ๋‘ ํƒ€์ž… ๋ชจ๋‘ System.String ํƒ€์ž…์œผ๋กœ ๋™์ผ

String Pool

  • ์„ ์–ธ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์œ„์น˜ ๊ฒฐ์ •
string str1 = "asdf";             // str1 -> ์Šคํƒ, "asdf" -> ํž™์˜ string pool
string str2 = new string("asdf"); // str2 -> ์Šคํƒ, "asdf" -> ํž™
  • str1์˜ ๋ฌธ์ž์—ด์€ ํž™์˜ string pool ์— ์ €์žฅ๋˜์–ด, ์ดํ›„ ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉ๋˜๋ฉด ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค
  • str2์˜ ๋ฌธ์ž์—ด์€ ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค

eqauls() vs. ==

string str1 = "asdf";                       // str1 -> ์Šคํƒ, "asdf" -> ํž™์˜ string pool ๊ณต์œ 
string str2 = new string("asdf");           // str2 -> ์Šคํƒ, "asdf" -> ํž™ ๋ณ„๊ฐœ ์ฃผ์†Œ 
string str3 = "asdf";                       // str3 -> ์Šคํƒ, "asdf" -> ํž™์˜ string pool ๊ณต์œ 
string str4 = new string("asdf").intern();  // str4 -> ์Šคํƒ, "asdf" -> intern ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํž™์˜ string pool ๊ณต์œ 

str1 == str2; // false
str1 == str3; // true
str1 == str4; // true
  • == ๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด์ธ์ง€ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ต
  • equals๋Š” ๋‘ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋น„๊ต

intern pool

  • ๋ฌธ์ž์—ด ํ•˜๋‚˜๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ด๋Š” ํ•˜๋“œ์ฝ”๋“œ๋œ ์ƒ์ˆ˜ ๋ฌธ์ž์—ด์ด๋ฉฐ, ์ธํ„ด ๋ฌธ์ž์—ด์ด๋‹ค
    • ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด Literal string์ด๋ผ ํ•œ๋‹ค
  • ์œ„์˜ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด์„ CLR์ด ๋ชจ์•„๋†“์€ ํ…Œ์ด๋ธ”์ด ์ธํ„ด ํ’€
    • ์ธํ„ด ํ’€์— ์กด์žฌํ•˜๋Š” ๋ฌธ์ž์—ด ๊ฐ์ฒด๋Š” ํž™์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, GC ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค

์ธํ„ด ํ’€ ์กด์žฌ ์ด์œ ?

  • ๋ฌธ์ž์—ด์ด ์„ ์–ธ๋˜๊ณ  2ํšŒ ์ด์ƒ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด 2๊ฐœ์˜ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค
  • ์œ„์˜ ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜ํ–ˆ์„ ๋•Œ, ์ธํ„ด ํ’€์— ์ถ”๊ฐ€๋œ ๋ฌธ์ž์—ด์€ ์–ธ์ œ ์žฌ์‚ฌ์šฉ๋ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ GC์˜ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋‹ค
    • ํž™์— ์œ„์น˜ํ•  ์ˆ˜ ์—†๋‹ค

StringBuilder

string์€ ๋ถˆ๋ณ€๊ฐ์ฒด

  • string ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋Œ€์ž…ํ•  ์‹œ, ๊ทธ ๋ฌธ์ž์—ด์€ pool์— ์ƒˆ๋กญ๊ฒŒ ์ €์žฅ
  • ๊ธฐ์กด ๋ฌธ์ž์—ด์€ pool์—๋Š” ๋‚จ์•„์žˆ์œผ๋‚˜ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š”๋‹ค
    • ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ์ฐธ์กฐํ•˜๋˜ string ๊ฐ์ฒด๋Š” GC์— ์˜ํ•ด ์ˆ˜์ง‘
    • ์ด ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐ˜๋ณต๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์™€ ํผํฌ๋จผ์Šค์— ์˜ํ–ฅ์„ ์ค€๋‹ค
      • intern pool์ด ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๋œป์ธ๊ฐ€โ€ฆ?
string str = "2022" + "July" + "17th";
  • ์œ„์˜ ๊ฐ์ฒด๋Š” 3๊ฐœ์˜ string ๊ฐ์ฒด๊ฐ€ ์กฐํ•ฉ๋˜์–ด ์ƒ์„ฑ๋˜๋ฉฐ, ์ด์ค‘ 2๊ฐœ string ๊ฐ์ฒด๋Š” ์กฐํ•ฉ ์ดํ›„ GC์— ์˜ํ•ด ์ˆ˜์ง‘๋œ๋‹ค
    • ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด ์ž์ฒด๋Š” intern pool์— ๋‚จ์•„์žˆ๋‹ค

StringBuilder๋Š” ๊ฐ€๋ณ€๊ฐ์ฒด

  • ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋  ์‹œ, ์ž๋™์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝ
  • System.Text.StringBuidler ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
    • ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—์„œ ๊ฐ’๋“ค์„ ์กฐํ•ฉ ๋ฐ ์‚ญ์ œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐฉ์ง€
  • ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋„˜์ง€์•Š๋Š” ์ผ€์ด์Šค์—์„œ์˜ ์‚ฌ์šฉ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
    • ๋ฌธ์ž์—ด ์ˆ˜์ •์ด ๋นˆ๋ฒˆํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต์ ์ผ ๋•Œ
    • ๋งŽ์€ ์ˆ˜์˜ ๋ฌธ์ž์—ด ์กฐํ•ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๋™์ผํ•œ ์ด์œ ๋กœ string + string ๋ณด๋‹ค StringBuilder์˜ Append๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค

์ถœ์ฒ˜