c# String 잔기술들 1

String과 string의 차이

String은 클래스이고 string은 변수형이다. 그러나 아래 예제를 보면 이들 사이에 차이가 없다는 걸 알 수 있다.

string string1 = "aaaaa";
string string2 = new('a', 5);

String string3 = new('a', 5);
String string4 = "aaaaa";

Text = string1 + ' ' + string2 + ' ' + string3 + ' ' + string4; // aaaaa aaaaa aaaaa aaaaa

string은 변수형인데 new로 만들 수 있고 String은 클래스인데 new 없이 그냥 쓸 수 있다. 이들은 이렇게 변수형과 클래스 모두의 기능을 한다. 더 정확하게는 string이 String의 껍데기다.

string is an alias for System.String in .NET.
Built-in reference types

따라서 아래는 이들을 구별하지 않고 쓴다.

String.Substring 이용 방법에 따른 성능 비교

Substring을 이용하는 전통적인 방법은 아래와 같다.

string String1 = "-123456789";

private void button1_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new();

    stopwatch.Start();
            
    for (int i = 0; i < 1000000; i++)
    {
        string string = String1.Substring(0, 6); // -12345
    }

    textBox1.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n"); // the 5 times average is 79,238.6
}

시작 인덱스와 길이를 입력하는 거다. 그런데 최근 버전에서는 아래와 같이 더 간단하게도 된다.

private void button2_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new();

    stopwatch.Start();

    for (int i = 0; i < 1000000; i++)
    {
        string string = String1[0..6]; // -12345
    }

    textBox2.AppendText(stopwatch.ElapsedTicks.ToString() + "\r\n"); // the 5 times average is 78,808.6
}

더 간단하면서 심지어 조금 더 빠르기까지 하다. 이때 주의해야 할 건 배열을 이용할 때와 달리 6은 인덱스가 아니라 Substring을 쓸 때처럼 길이라는 거다.

문자열을 한쪽으로 밀기

String.PadLeft/PadRight를 이용하면 된다. ​pad는 ‘채워 넣는다’는 뜻으로 우리가 흔히 ‘패드를 댄다’고 할 때 그 패드다. 따라서 PadLeft는 왼쪽에다 채워 넣었으니까 오른쪽으로 밀리고 PadRight는 그 반대다.

string string1 = "abcde";

textBox1.Text = string1.PadLeft(10, '0'); // 00000abcde

숫자만큼 밀리는 것이 아니라 그것이 총 길이라는 것에 유의한다. 위 예제에서 채울 문자를 입력하지 않고 그냥 10이라고만 설정하면 왼쪽에 다섯 개의 빈칸들이 생긴다. 이 메써드는 이베스트투자증권의 api를 이용하여 서버로 문자열을 보낼 때 요긴하다. 이 api를 이용하여 서버가 숫자로 취급할 값을 보낼 때에는 정해진 문자열의 길이에서 오른쪽으로 밀고 왼쪽의 빈칸들은 0으로 채워야 하며 문자인 값을 보낼 때에는 왼쪽으로 밀고 남은 공간은 그냥 빈칸들로 남겨 둬야 한다.