문자열은 개별 문자들의 배열인 자료형입니다.
문자열은 한번 생성되면 변경되지 않습니다.
문자열의 변경은 가능하지만 내부적으로는 새로운 문자열을 만드는 것입니다.
string str = "Hello";
str += " World";
위 부분에서 Hello라는 부분은 사라지면서 가비지가 되고 새로운 Hello World를 다시 참조하도록 하는 것입니다.
그러므로 대량으로 문자열을 연결하는 것, 문자열 변경이 빈번하다면 대량의 객체 생성, 가비지화를 유발하기 때문에 성능상 좋지 못합니다.
이럴때는 StringBuilder 클래스를 사용합니다.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("Hello ");
sb.Apeend("World ");
sb.Append("!!");
string str = sb.ToString();
System.Console.WriteLine(str);
String과 StringBuilder 개체에 대한 연결 작업의 성능은 얼마나 자주 메모리를 할당하는 지에 따라 달라집니다.
StringBuilder 연결 작업에서는 StringBuilder 개체 버퍼가 너무 작아 새 데이터를 넣을 수 없는 경우에만 메모리가
할당되는 반면, String 연결 작업에서는 항상 메모리가 할당됩니다. 따라서 고정된 수의 String 개체를 연결하는 연결
작업에는 String 클래스가 더 적합합니다. 이 경우 개별 연결 작업이 컴파일러를 통해 단일 작업으로 결합될 수 있습니다.
임의의 개수의 문자열을 연결하는(예: 루프에서 임의의 개수의 사용자 입력 문자열을 연결할 경우) 연결 작업에는 StringBuilder 개체가 더 적합합니다.
string anyText = "Hello World"; //문자열생성
char anyChar = anyText[0]; //0번째 문자
bool found = anyText.Contains("Hello"); //Hello 존재여부 확인
bool isStart = anyText.StartsWith("He"); //특정 문자열로 시작하는지 여부
bool isEnd = anyText.StartsWith("ld"); //특정 문자열로 끝나는지 여부
int index = anyText.IndexOf("H"); //H 검색 후 위치 값 반환(없을시 -1)
int index2 = anyText.LastIndexOf("o"); //문자열 검색후 가장 뒤에있는 o위치값 반환
anyText = anyText + " C#"; //문자열 추가
anyText.Insert(0, "Oh "); // 0번째에 문자열 삽입
anyText.Replace("Oh ", "Wow "); // Oh 를 Wow 로 교체
anyText.Remove(1); //1번째 부분삭제
anyText.Substring(2); //2번째부터 문자열 추출
string lowerAnyText = anyText.ToLower(); //소문자로 변환
string uppderAnyText = anyText.ToUpper(); //대문자로 변환
string[] texts = anyText.Split(new char[] { ' ' }); //' '이 나올때마다 분리 ',',':'등으로도 가능
string addTexts = String.Join(" ",texts); //texts배열의 중간에 " "추가하여 문자열 합치기
Console.WriteLine(anyText);
Console.WriteLine("Add String : {0} {1}", anyText,"End");
Console.WriteLine($"Add String : {anyText}");