본문으로 바로가기

[C#] 문자열(String) 처리 - 1

category 개발자과정준비/C# 2020. 9. 26. 08:25
반응형

System.String

문자열 처리는 대부분 string 타입에서 제공된다. 

책에있는 내용인데 올바르게 캡처가안됬다....

 

예제로 한번 살펴보자.

using System;
namespace String_Example
{
    class Program
    {
        static void Main(string[] args)
        {
            string txt = "Hello World";
            Console.WriteLine(txt + " Contains(\"Hello\"): " + txt.Contains("Hello"));
            Console.WriteLine(txt + " Contains(\"Halo\"): " + txt.Contains("Halo"));
            Console.WriteLine();

            Console.WriteLine(txt + " EndsWith(\"World\"): " + txt.EndsWith("World"));
            Console.WriteLine(txt + "EndsWith(\"ello\"): " + txt.EndsWith("ello"));
            Console.WriteLine();


            Console.WriteLine(txt + " GetHashCode(): " + txt.GetHashCode());
            Console.WriteLine("Hello GetHashCode(): " + "Hello".GetHashCode());
            Console.WriteLine();

            Console.WriteLine(txt + " IndexOf(\"World\"): "+ txt.IndexOf("World"));
            Console.WriteLine(txt + " IndexOf(\"Halo\"): " + txt.IndexOf("Halo"));
            Console.WriteLine();

            Console.WriteLine(txt + " Replace(\"World\", \"\"): "+ txt.Replace("World", ""));
            Console.WriteLine(txt + " Replace('o', 't'): " + txt.Replace('o', 't'));
            Console.WriteLine();

            Console.Write(txt + " Split('o'): ");
            OutputArrayString(txt.Split('o'));
            Console.Write(txt + " Split(' '): ");
            OutputArrayString(txt.Split(' '));
            Console.WriteLine();

            Console.WriteLine(txt + " StartsWith(\"Hello\"): " + txt.StartsWith("Hello"));
            Console.WriteLine(txt + " StartsWith(\"ello\"): " + txt.StartsWith("ello"));
            Console.WriteLine();

            Console.WriteLine(txt + " Substring(1) : " + txt.Substring(1));
            Console.WriteLine(txt + "SubString(2, 3) : " + txt.Substring(2, 3));
            Console.WriteLine();

            Console.WriteLine(txt + " ToLower(): " + txt.ToLower());
            Console.WriteLine(txt + " ToUpper(): " + txt.ToUpper());
            Console.WriteLine();

            Console.WriteLine("\" Hello World \" Trim(): " + " Hello World ".Trim());
            Console.WriteLine(txt + "Trim('H'): " + txt.Trim('H'));
            Console.WriteLine(txt + " Trim('d'): " + txt.Trim('d'));
            Console.WriteLine(txt + " Trim('H', 'd'): " + txt.Trim('H', 'd'));
            Console.WriteLine();

            Console.WriteLine(txt + " Legnth: " + txt.Length);
            Console.WriteLine("Hello Length : " + "Hello".Length);
            Console.WriteLine();

            Console.WriteLine("Hello != World: " + ("Hello" != "World"));
            Console.WriteLine("Hello == World: " + ("Hello" == "World"));
            Console.WriteLine("Hello == HELLO: " + ("Hello" == "HELLO"));
            Console.WriteLine();
        }

        private static void OutputArrayString(string[] arr)
        {
            foreach(string txt in arr)
            {
                Console.Write(txt + ", ");
            }
            Console.WriteLine();
        }
    }
}

 

 

 

 영문자를 다루면서 빠질 수 없는 사항이 바로 대소문자 구분이다. 대소문자 구분의 오버로드 버전을 제공하는 메서드로 EndsWith, IndexOf, StartsWith가 있다. 이 메서드들은 각각 StringComparison 열거형 인자를 추가로 받을 수 있다. 이 인자를 생략하면 기본적으로 대소문자 구분을 하고, 대소문자 구분을 하고 싶지 않다면 StringComparision, OrdinalIgnoreCase인자를 함께 전달하면 된다.

 

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt = "Hello World";
        Console.WriteLine(txt + " Endswith(\"WORLD\"): " + txt.EndsWith("WORLD", StringComparison.OrdinalIgnoreCase));
        Console.WriteLine();

        Console.WriteLine(txt + " IndexOf(\"WORLD\"): " + txt.IndexOf("WORLD", StringComparison.OrdinalIgnoreCase));
        Console.WriteLine();

        Console.WriteLine(txt + " StartsWith(\"HELLO\"): " + txt.StartsWith("HELLO", StringComparison.OrdinalIgnoreCase));
        Console.WriteLine();
    }
}

 

 

 

 

문자열의 "==" 비교 연산자는 대소문자를 무시하는 기능은 없지만 대신 Equals 메서드로 바꾸면 가능하다.

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt = "Hello";
        Console.WriteLine(txt + " == HELLO: " + (txt == "HELLO")); // 출력결과 : False
        Console.WriteLine(txt + " == HELLO: " + txt.Equals("HELLO", StringComparison.OrdinalIgnoreCase)); // 출력결과: True
        Console.WriteLine();
    }
}

 

Format 메서드에 대해 알아보자. 이 메서드의 주된 기능은 인자를 형식 문자열에 포함된 번호와 맞춰서 치환하는 기능이다.

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt = "Hello {0}: {1}";
        string output = string.Format(txt, "World", "Anderson");
        Console.WriteLine(output);
    }
}

 

 string.Format의 첫번째 인자에는 중괄호로 둘러싸인 번호를 포함할 수 있다. 여기서 사용된 번호는 뒤에 나오는 인자의 위치와 대응되어 치환된다.

 

 이런 식의 string.Format은 다른 곳에도 적용되어 사용되는데, 대표적인 사례가 Console.WriteLine 메서드이다.

 

 다음은 같은 출력 결과를 내는 Console.WriteLine의 사용예시이다.

또한 형식 문자열의 번호는 중복 사용이 가능하고 순서에도 제약이 없다.

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt = "Hello {0}: {1}";
        string output = string.Format(txt, "World", "Anderson");
        Console.WriteLine(output);

        string txt1 = "{2} {0} == {0}: {1}"; // 번호순서대로 들어갈것이다
        Console.WriteLine(txt1, "Hello", "World", "Hi");
        // 순서대로하면 HI Hello == Hello: World 로 출력될것이다
    }
}

 

 

 

 번호와 대응되는 인자가 반드시 string 형식일 필요는 없다. 닷넷의 모든 타입은 object를 상속받기 때문에 ToString 메서드가 제공되므로 string.Format은 string 형식이 아닌 타입의 인스턴스가 인자로 대응되면 그것의 ToString 메서드를 호출한 결과를 반복한다.

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt2 = "{0} * {1} == {2}";
        Console.WriteLine(txt2, 5, 6, 5 * 6);
    }
}

 string.Format의 인자를 지정할 때는 해당 문자열을 어떻게 형식화할 것인지에 대한 표현도 함께 제공된다. 이에 대한 정확한 형식은 다음과 같다.

 

 

{번호[,정렬][:형식문자열]}

-번호(필수): 지금까지의 에에서 본 것처럼 숫자 0부터 시작하는 번호를 지정

 

-정렬(선택): 번호와 대응되는 문자열의 최소 너비를 지정, 대응 문자열의 길이는 5인데 정렬로 지정된 숫자가 10이라면 나머지 너비는 공백으로 채워짐. 정렬값이 음수이면 왼쪽, 양수이면 우측 정렬이 된다. 정렬값이 생략되면 대응되는 문자열 길이대로 출력됨.

 

-형식문자열(선택): 대응되는 인자의 타입에서 직접 구현하고 있는 형식 문자열이 사용됨. 따라서 Int32, Double 등의 타입에 따라 그에 맞는 형식 문자열을 찾아서 지정.

 

다음은 간단하게 정렬 옵션까지 지정된 string.Format을 사용하는 예다.

using System;
class Program
{
    static void Main(string[] args)
    {
        string txt3 = "{0, -10} * {1} == {2, 10}";
        Console.WriteLine(txt3, 5, 6, 5 * 6);
    }
}

 

 첫 번째 대응되는 인자의 정렬값은 음수 10이므로 좌측 정렬 기준으로 5가 출력되고 나머지 9칸은 공백으로 출력된다. 

 두 번째 대응 인자는 정렬 숫자값이 생략됐으므로 정확히 숫자 6에 대한 ToString결과 문자열만 출력된다. 

 마지막 세 번째 대응 인자는 양수 10이므로 우측 정렬 기준으로 10이 출력되고 나머지 8칸은 공백으로 출력된다.

 

정렬 옵션까지 지정된 형식 문자열

 

 

 

 형식 문자열을 적용하려면 타입에서 제공되는 형식 문자열을 미리 알고 있어야 한다. 다음은 각 타입 별로 제공되는 대표적인 형식 문자열을 보여준다.

 

형식 문자열 종류

 

 

이번 예제는 인자 번호, 정렬, 형식 문자열을 모두 사용한 예시이다.

class Program
{
    static void Main(string[] args)
    {
        string txt4 = "날짜 : {0, -20:D}, 판매 수량: {1, 15:N}";
        Console.WriteLine(txt4, DateTime.Now, 267);
    }
}

 

 

 

 

 다음포스팅에는 System.Text.StringBuilder, System.Text.Encoding, System.Text.RegularExpressions.Regex 에 대해 알아보겠다.

반응형