๐StringBuilder๋?
String์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๋ฐ๋ณต์ ์ผ๋ก ์์ ์,
์๋ก์ด String ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ GC ๋์์ด๋ฉฐ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋จ์ด์ง๋ค.
๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํด๋์ค๊ฐ StringBuilder ํด๋์ค์ด๋ค.
StringBuilder๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ์กด ๊ฐ์ฒด์์ ์์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋๋ค.
๐StringBuilder ์ฌ์ฉ ๋ฐฉ๋ฒ
System.Text ๋ค์์คํ์ด์ค๊ฐ ํ์ํ๋ค.
StringBuilder ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑ ํ
Append, Insert, Replace, Remove ๋ฑ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด ์์ ์ด ๊ฐ๋ฅํ๋ค.
using System.Text;
StringBuilder sb = new StringBuilder();
sb.Append("append");
sb.Append("string");
StringBuilder๋ ๊ฐ์ฒด ์์ฑ ์,
๋ณด๊ดํ ์ ์๋ ์ต๋ ๋ฌธ์ ์๊ฐ ์ง์ ๋๊ณ ๊ทธ ์๊ฐ ๋์ด๊ฐ๊ธฐ ์ ๊น์ง ํด๋น ๊ณต๊ฐ ๋ด์์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
StringBuilder sb = new StringBuilder();
Console.WriteLine(sb.Capacity);
์๋ฌด๋ฐ ์ค์ ์ ํ์ง ์์ผ๋ฉด 16๊ฐ์ ๋ฌธ์๋ฅผ ๋ณด๊ดํ ์ ์๋ค๊ณ ๋์จ๋ค.
์ฆ ์ค์ ์ ํด์ ์ด๊ธฐ ์ฉ๋์ ํ ๋นํ ์๋ ์๋ค.
StringBuilder sb = new StringBuilder();
sb.Capacity = 25;
Console.WriteLine(sb.Capacity);
Capacity ํ๋กํผํฐ์ Length ํ๋กํผํฐ๋ก ํ์ฌ StringBuilder์ ์ฉ๋๊ณผ ํ ๋น๋ ๋ฌธ์์ ๊ธธ์ด๋ฅผ ์ ์ ์๋ค.
StringBuilder sb = new StringBuilder();
sb.Capacity = 25;
for (int i = 0; i < 20; i++)
sb.Append("a");
Console.WriteLine($"์ฉ๋ : {sb.Capacity}");
Console.WriteLine($"๊ธธ์ด : {sb.Length}");
Console.WriteLine(sb.ToString());
์ ์ฅ๋ ๊ณต๊ฐ์ด ์ฉ๋์ ์ด๊ณผํ๊ฒ๋๋ฉด ์๋์ผ๋ก ๊ณต๊ฐ์ด ํ ๋น๋๊ณ ์ฉ๋์ด 2๋ฐฐ๋ก ์ฆ๊ฐํ๋ค.
StringBuilder sb = new StringBuilder();
sb.Capacity = 25;
for (int i = 0; i < 30; i++)
sb.Append("a");
Console.WriteLine($"์ฉ๋ : {sb.Capacity}");
Console.WriteLine($"๊ธธ์ด : {sb.Length}");
Console.WriteLine(sb.ToString());
์ด๋ ๊ฒ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์๋ดค๋ค.
์์ธํ ๋ด์ฉ์ ๋ง์ดํฌ๋ก์ํํธ ํ์ด์ง์ ๋์์๋ค.
https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/stringbuilder
๐์๋์ฐจ์ด
๊ทธ๋ ๋ค๋ฉด ์๋๋ ์ผ๋ง๋ ์ฐจ์ด๊ฐ๋ ๊น?
์คํ์ ์ํด string += "a"์ 1,000,000๋ฒ ๋ฐ๋ณต๋ฌธ์ ๋๋ ค๋ดค๋ค.
DateTime startTime = DateTime.Now;
Console.WriteLine("ํ๋ก๊ทธ๋จ ์์ ์๊ฐ: " + startTime.ToString());
string st = "a";
for (int i = 0; i < 1000000; i++)
st += "a";
DateTime endTime = DateTime.Now;
Console.WriteLine("ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์๊ฐ: " + endTime.ToString());
TimeSpan duration = endTime - startTime;
Console.WriteLine("์ด ์คํ ์๊ฐ: " + duration.ToString());
์ฒ์์ ์ฝ์์ด ๋ฉ์ถ์ค ์์๋ค. ์ฝ 2๋ถ 28์ด์ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
๊ทธ๋ ๋ค๋ฉด StringBuilder๋ ์ด๋จ๊น?
DateTime startTime = DateTime.Now;
Console.WriteLine("ํ๋ก๊ทธ๋จ ์์ ์๊ฐ: " + startTime.ToString());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++)
sb.Append("a");
DateTime endTime = DateTime.Now;
Console.WriteLine("ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์๊ฐ: " + endTime.ToString());
TimeSpan duration = endTime - startTime;
Console.WriteLine("์ด ์คํ ์๊ฐ: " + duration.ToString());
......
๊ทธ๋ฅ ๋ง๋ ์ ๋๊ฒ ์ฐจ์ด๊ฐ ๋๋ค.