[유니티 / C#] String과 StringBuilder

⭐ String (문자열)

String은 문자열 형식의 클래스로 값이 저장되어 있는 공간의 주소를 참조하는 참조 타입입니다.

참고로 문자 하나를 저장하는 Char 타입은 값 타입입니다.

 

 

string은 불변성을 지니고 있습니다.

평소에도 자주 string을 사용하고 값을 변경해주는데 불변성이라니..

잘못된 정보가 아닐까 생가할 수도 있지만 string의 값을 변경하면 기존의 값을 수정하는 것이 아니라

새 객체를 생성하는 방식으로 동작합니다.

 

따라서 자주 값을 변경해줘야 하는 string 변수의 경우 다른 타입을 사용하는 것이 좋은 선택일 수 있습니다.

 

String 사용하기


💡 문자열 선언하기

string str = "문자열";       -> 문자열 타입 선언

- #문자열을 빈 텍스트로 출력하는 방법 -
string str = "";             -> 리터럴로 선언
string str = string.empty;   -> string.empty로 선언

● 문자열 선언 기본 형식

    ○ string 변수명 = "텍스트 내용";

 

 

 

💡 자주 사용하는 String 메서드

 

String을 사용하다보면 정말 많은 기능들이 필요합니다.

 

유저가 닉네임을 정하거나 로그인을 하는 등의 상황에서 문자열의 길이나 문자에 특수기호 등이 있는지도 확인해야 하고,

두 문자열을 합치거나, 특정 기준으로 문자열을 분리하는 등의 기능들이 필요합니다.

하지만 대부분의 기능들은 메서드를 통해 구현할 수 있으며,

문자열 이스케이프 시퀀스나 문자열 보간등을 이용해 더욱 편리하게 문자열을 사용할 수 있습니다.

 

그 중에서 자주 사용하는 String 클래스의 속성과 메서드에 대해서 알아보겠습니다.

 

 

🔔 String.Length - 문자열 길이 반환

Length 프로퍼티: 문자열의 길이를 int 형식으로 반환합니다.

string str = "문자열";
Debug.Log(str.Length);

출력 결과:
3

 

 

 

🔔 Substring - 일부 문자열 추출

Subtring(int index, int count): 이용해 일부 문자열을 잘라낼 수 있습니다.

    ○ index 주소부터 count 개수만큼 추출합니다.

string str = "Hello Unity";

Debug.Log(str.Substring(3, 7));

출력 결과:
lo Unit

 

 

 

🔔 IndexOf - 특정 문자 / 문자열 위치 반환

IndexOf(char/string s, int startIndex): 특정 문자 혹은 문자열의 인덱스를 반환할 수 있습니다.

    ○ s 문자 혹은 문자열을 startIndex 위치부터 탐색하여 반환합니다.

//문자(Char) 탐색
string str = "Hello Unity";

Debug.Log(str.IndexOf('l', 0));

출력 결과:
2


//문자열(String) 탐색
string str = "Hello Unity";

Debug.Log(str.IndexOf("ni", 0));

출력 결과:
7

 

 

 

🔔 Contains - 해당 문자 포함 여부 확인

Contains(char/string s): 특정 문자 또는 문자열이 포함되어 있는지 여부를 bool 형으로 반환합니다.

string str = "Hello Unity";

Debug.Log(str.Contains('l'));        //True
Debug.Log(str.Contains('a'));        //False
Debug.Log(str.Contains("Unity"));    //True
Debug.Log(str.Contains("Unityy"));   //False

출력 결과:
True
False
True
False

 

 

 

🔔 Replace - 문자열 교체

Replace(string/char s1, string/char s2): 특정 문자/문자열을 다른 문자/문자열로 교체합니다.

string str = "Hello Unity";

str = str.Replace("Unity", "Tistory");
Debug.Log(str);

출력 결과:
Hello Tistory

 

 

 

🔔 ToUpper / ToLower - 대문자/소문자 변환

● ToUpper(): 대문자로 변환

● ToLower(): 소문자로 변환

string str = "Hello Unity";

str = str.ToUpper();
Debug.Log(str);

출력 결과:
HELLO UNITY

 

 

 

🔔 Trim - 앞뒤 공백 제거

● Trim(): 문자열의 앞, 뒤 공백 제거 (문자들 중간의 공백은 제거x)

string str = "     Hello Unity       ";

Debug.Log(str.Trim());

출력 결과:
Hello Unity

 

 

 

🔔 Split - 문자열 분리

● Split(char/string s): 특정 문자를 기준으로 문자열을 분리

//문자 기준 분리
string str = "Hello Unity";

string[] s = str.Split(' ');

foreach(var a in s)
{
    Debug.Log(a);
}

출력 결과:
Hello
Unity

//문자열 기준 분리
string str = "Hello Unity";

string[] s = str.Split("Uni");

foreach(var a in s)
{
    Debug.Log(a);
}

출력 결과:
Hello
ty

 

 

 

🔔 Concat - 문자열 합치기

string.Concat(string s1, string s2): 두 개 이상의 문자열을 하나의 문자열로 합칩니다. (Char 형도 가능)

    ○ 나열된 문자열을 이어 붙일 때 주로 사용

//문자 합치기
char c = 'h';
char c2 = 'c';

Debug.Log(string.Concat(c, c2));

출력 결과:
hc

//문자열 합치기
string str = "Hello";
string str2 = " ";
string str3 = "Unity";

Debug.Log(string.Concat(str, str2, str3));

출력 결과:
Hello Unity

 

 

 

🔔 Join - 문자열 합치기

string.Join(string separator, Ienumerable<string> values): 두 개 이상의 문자열을 하나의 문자열로 합칩니다. (Char 형도 가능)

    ○ 컬렉션(배열, 리스트 등) 안의 항목을 구분자로 연결할 때 주로 사용

string[] strings = { "MineCraft", "LostArk", "MapleStory" };

string str = string.Join(", ", strings);

Debug.Log(str);

출력 결과:
MineCraft, LostArk, MapleStroy

 

 

 

🔔 string.IsNullOrEmpty - 문자 null 체크

● string.IsNullOrEmpty(string s): 문자열이 null이거나 비어있으면 True, 값이 있으면 False 반환

string str = "";
string str2 = string.Empty;
string str3 = "Unity";

Debug.Log(string.IsNullOrEmpty(str));
Debug.Log(string.IsNullOrEmpty(str2));
Debug.Log(string.IsNullOrEmpty(str3));

출력 결과:
True
True
False

 

 

 

⭐ StringBuilder

StringBuilder는 변경 가능한 문자열을 효율적으로 다루기 위한 클래스입니다.

값이 바뀌면 새 객체를 할당하는 string과 다르게 인스턴스 내부에서 직접 값을 수정할 수 있기 때문에 반복적인 문자열 조작 동작에서 좋은 퍼포먼스를 보여줍니다.

 

 

StringBuilder 속성


🔔 Length

● 현재 문자열의 문자 수

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Length);

출력 결과:
9

 

 

🔔 Capacity

● 현재 버퍼가 담을 수 있는 문자 수

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Capacity);

출력 결과:
16

 

 

🔔 MaxCapacity

● 최대 허용 가능 문자 수

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.MaxCapacity);

출력 결과:
2147483647

 

 

 

StringBuilder 메서드


🔔 Append(value)

● 끝에 문자열 추가

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Append(" Happy"));

출력 결과:
Unity Day Happy

 

 

 

🔔 AppendLine([value])

● 문자열 + 줄바꿈(\r\n) 추가

StringBuilder builder = new StringBuilder("Unity Day");

builder.AppendLine(" Happy");
builder.Append("Study");

Debug.Log(builder);

출력 결과:
Unity Day Happy
Study

 

 

 

🔔 Insert(index, value)

● 지정 위치에 문자열 삽입

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Insert(6, "Week"));

출력 결과:
Unity WeekDay

 

 

 

🔔 Remove(startIndex, length)

● 지정 범위 문자열 삭제

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Remove(6, 3));  //6번 인덱스부터 3크기 삭제

출력 결과:
Unity

 

 

 

🔔 Replace(oldValue, newValue)

● 특정 문자열을 다른 문자열로 교체

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Replace("Unity", "Unreal"));

출력 결과:
Unreal Day

 

 

 

🔔 Clear()

● 전체 내용 삭제

StringBuilder builder = new StringBuilder("Unity Day");

Debug.Log(builder.Clear());

출력 결과:

 

 

 

🔔 Tostring()

● stringBuilder의 내용을 string으로 반환

StringBuilder builder = new StringBuilder("Unity Day");

string str = builder.toString();

 

 

 

🔔 EnsureCapacity(capacity)

● 최소 용량 설정(버퍼 확장)

StringBuilder builder = new StringBuilder("Unity Day");
Debug.Log($"확장 전 용량: {builder.Capacity}");
builder.EnsureCapacity(500);
Debug.Log($"확장 후 용량: {builder.Capacity}");

출력 결과:
확장 전 용량: 16
확장 후 용량: 500

 

 

 

String VS StringBuilder


문자열의 값이 변경될 때

String의 경우 변경된 값을 갖는 객체를 새로 생성한 뒤 해당 주소값을 변수에 다시 할당하는 방식입니다.

반면에 StringBuilder의 경우 Append() 함수를 이용하여 기존의 값에 추가하는 방식이기 때문에 훨씬 빠릅니다.

이와 같은 과정의 차이 때문에 빈번한 문자열 수정이 필요한 경우에는 StringBuilder를 사용하는 것이 성능적으로

유리합니다.

 

하지만 짧은 크기의 데이터에서는 유의미한 차이를 기대하기 어렵고

StringBuilder 클래스는 특정 문자를 찾는 기능을 지원하지 않기 때문에 문자열 내에서 검색을 하는 경우에는

String 클래스를 사용하는 것이 좋습니다.

 

이처럼 String과 StringBuilder는 용도에 따라 적절하게 사용하는 것이 좋습니다.