문자열 다루기

  • 33 minutes to read

닷넷에 내장되어 있는 클래스 중에서 문자열 관련 클래스는 문자열의 길이 반환, 문자열의 공백 제거, 대/소문자로의 변환 등의 기능을 하는 메서드 등을 제공합니다. C#의 문자열은 유니코드(Unicode) 문자열이기에 다국어를 지원하고 문자열 관련 모든 기능도 다국어를 제대로 처리합니다.

> // String 클래스와 StringBuilder 클래스를 사용하여 문자열 다루기 
IMPORTANT

문자열은 불변성(Immutability)을 가집니다.
C#과 Java에서 문자열은 변경 불가능합니다. String 오브젝트는 불변(읽기 전용)이라고 합니다. 생성된 후에는 값을 수정할 수 없습니다. String 개체를 수정하는 것처럼 보이지만 실제로는 새 개체를 반환합니다. 즉, 수정 사항이 포함된 문자열 개체입니다.

미리보기 동영상 강의: C# 교과서 마스터하기 25강 문자열 다루기

문자열 다루기

프로그래밍할 때 자주 사용하는 String(스트링) 클래스의 자주 사용하는 문자열 관련 속성 또는 메서드는 아래 표와 같습니다. 표에 나오지 않는 다른 메서드들은 실습을 통해서 알아보겠습니다.

표: 문자열 관련 주요 속성 및 메서드

속성 및 메서드 설 명
Length 문자열의 길이 값 반환
ToUpper() 문자열을 모두 대문자로 변환
ToLower() 문자열을 모두 소문자로 변환
Trim() 문자열의 양쪽 공백 잘라 냄
Replace(원본문자열, 대상문자열) 원본문자열을 대상문자열로 변경
Substring(문자열인덱스, 길이) 지정된 문자열 인덱스부터 길이만큼 반환

문자열 관련 주요 메서드 다루기

문자열 관련 주요 메서드를 사용해보겠습니다.

코드: StringFunction.cs

> //[?] 문자열 관련 메서드 사용하기
> string message = "hello, World!";
> 
> Console.WriteLine(message.ToUpper()); // 대문자
HELLO, WORLD!
> Console.WriteLine(message.ToLower()); // 소문자
hello, world!
> 
> // 바꾸기
> message.Replace("hello", "안녕하세요.").Replace("World", "세계.")
"안녕하세요., 세계.!"

소문자로만 되어 있는 문자열을 담고 있는 message 변수의 값을 ToUpper() 메서드로 대문자로 변경할 수 있고 ToLower()로 모두 소문자로 변경할 수 있습니다. 문자열 변수에 Replace() 메서드를 적용하면 특정 문자열을 새로운 문자열로 변경할 수 있고, Replace() 메서드를 여러 번 호출할 때마다 계속해서 값을 바꿀 수 있습니다. 이렇게 메서드를 여러 번 점을 찍어서 구분하면서 호출하는 방법을 메서드 체인(Method Chain) 또는 메서드 체이닝(Method Chaining)이라고도 합니다.

메서드 체이닝(Method Chaining)

C#에서 문자열과 같은 하나의 개체에 대해서 여러 번 메서드를 호출하는 방법을 메서드 체인(Method Chain) 또는 메서드 체이닝(Method Chaining) 또는 파이프라인(Pipelines)이라고 부릅니다.

다음 샘플 코드는 이번 장에서 배울 메서드들을 사용하여 " Hello " 문자열에서 "Hello"를 "Hi"로 변경하고 시작 공백을 없애고(TrimStart) 마지막 공백도 없앤 후(TrimEnd) 양쪽 공백을 없애는(Trim) 추가 작업을 표현해 보았습니다.

> " Hello ".Replace("Hello", "Hi").TrimStart().TrimEnd().Trim()
"Hi"

참고로, 이러한 메서드 체이닝은 C#으로 함수형 프로그래밍을 표현하는 방법 중 하나입니다.

String 클래스

C# 프로그램을 작성할 때 가장 많이 사용되는 클래스 중 하나가 바로 String 클래스입니다. System.String 클래스는 string 키워드와 동일하게 문자열 변수를 생성할 때 사용됩니다.

이번에는 String 클래스로 변수를 선언해보겠습니다.

코드: StringClass.cs

> //[?] System.String 클래스 == string 키워드
> String s1 = "안녕하세요."; // String 클래스
> string s2 = "반갑습니다."; // string 키워드
> $"{s1} {s2}"
"안녕하세요. 반갑습니다."

소문자로 시작하는 string 키워드는 대문자로 시작하는 String 클래스와 동일한 기능을 합니다. 이 코드는 지금까지 우리가 사용해 온 코드와 별반 다르지 않으나, String 클래스와 string 키워드를 구분 짓기 위해서 예제를 만들어 보았습니다.

참고로, String 클래스에 문자 배열을 전달하면 문자열로 변환할 수 있습니다.

코드: CharArrayToString.cs

> char[] charArray = { 'A', 'B', 'C' };
> String str = new String(charArray);
> str
"ABC"

Length 속성을 사용하여 문자열의 길이 구하기

이번에는 문자열 변수의 Length 속성을 사용하여 문자열의 길이 구하는 방법을 살펴보겠습니다.

코드: StringLength.cs

> //[?] 문자열의 길이: String.Length 속성
> string s1 = "Hello.";
> string s2 = "안녕하세요.";
> $"{s1.Length}, {s2.Length}"
"6, 6"

문자열 변수에 괄호가 붙지 않는 Length 속성을 요청하면 문자열의 길이를 알려줍니다. 영문이건 한글이건 동일하게 문자의 개수를 알려줍니다.

String.Concat() 메서드로 문자열 연결하기

이번에는 String.Concat() 메서드로 문자열을 연결하는 방법을 살펴보겠습니다.

코드: StringConcat.cs

> //[?] 문자열 연결: 더하기 연산자, String.Concat() 메서드
> string s1 = "안녕" + "하세요.";
> string s2 = String.Concat("반갑", "습니다.");
> $"{s1} {s2}"
"안녕하세요. 반갑습니다."

C#에서 문자열을 묶는 방법은 여러 가지가 있습니다. 더하기 연산자를 사용하거나 간단히 2개의 문자열을 묶을 때에는 String.Concat() 메서드도 사용 가능합니다.

문자열 묶는 3가지 표현 방법 정리

이번에는 C#에서 문자열을 묶는 3가지 표현 방법을 알아보겠습니다. 가장 기본적인 방법은 + 연산자를 사용합니다.

코드: StringDisplay.cs

> //[?] 문자열 묶는 3가지 표현 방법 정리
> var displayName = "";
> var firstName = "길동";
> var lastName = "홍";
> 
> //[1] 더하기(+) 연산자 사용
> displayName = "이름: " + lastName + firstName;
> displayName
"이름: 홍길동"
> 
> //[2] string.Format(), String.Format() 메서드 사용
> displayName = string.Format("이름: {0}{1}", lastName, firstName);
> displayName
"이름: 홍길동"
> 
> //[3] 문자열 보간법 사용
> displayName = $"이름: {lastName}{firstName}";
> displayName
"이름: 홍길동"

문자열을 묶는 방법은 이번 예제처럼 더하기 연산자, String.Format() 메서드 그리고 $""{} 형태의 문자열 보간법을 사용할 수 있습니다. 추가로 String.Concat() 메서드도 사용할 수 있습니다.

문자열 비교하는 2가지 방법 정리

C#에서 문자열을 비교할 때, == 연산자는 기본적으로 대소문자를 구분합니다. 대소문자를 구분하지 않고 문자열을 비교하려면 String.Equals() 메서드와 StringComparison 열거형의 OrdinalIgnoreCase (또는 InvariantCultureIgnoreCase) 값을 활용할 수 있습니다.

이번에는 문자열 비교하는 2가지 방법을 알아보겠습니다.

코드: StringEquals.cs

> //[?] 문자열 비교하는 2가지 방법 정리
> string userName = "RedPlus";
> string userNameInput = "redPlus";
> 
> //[1] == 연산자 사용
> if (userName.ToLower() == userNameInput.ToLower())
. {
.     Console.WriteLine("[1] 같습니다.");
. }
[1] 같습니다.
> 
> //[2] string.Equals() 메서드 사용
> if (string.Equals(userName, userNameInput,
.     StringComparison.InvariantCultureIgnoreCase))
. {
.     Console.WriteLine("[2] 같습니다.");
. }
[2] 같습니다.

String.Equals() 메서드는 2개의 문자열 변수의 값을 비교합니다. 기본값으로는 대소문자를 구별하지만 3번째 매개 변수로 StringComparison.InvariantCultureIgnoreCase 열거형을 옵션으로 주면 대소문자를 구별하지 않습니다.

문자열의 대소문자 비교하기

다시 한번, 문자열을 대소문자를 구분하지 않고 비교하는 방법을 살펴보겠습니다.

코드: StringCompareValue.cs

> //[?] 문자열 값 비교: 대소문자 비교
> string s1 = "Gilbut";
> string s2 = "gilbut";
> 
> //[1] 문자열의 값의 대소문자를 구분
> if (s1 == s2)
. {
.     Console.WriteLine("같다.");
. }
. else
. {
.     Console.WriteLine("다르다."); // "다르다." 출력됨
. }
다르다.
> 
> //[2] 문자열의 대소문자를 구분하지 않고 비교 
> if (s1.Equals(s2, StringComparison.OrdinalIgnoreCase))
. {
.     Console.WriteLine("같다."); // "같다." 출력됨
. }
같다.

문자열 변수의 Equals() 메서드를 사용하여 대소문자를 비교하는 방법을 살펴보았습니다. 또 다른 간단한 방법은 문자열 변수의 ToLower()ToUpper() 메서드로 한가지 방식으로 변경한 후 == 연산자로 비교할 수도 있습니다.

코드: StringCompare.java

public class StringCompare {
    public static void main(String[] args) {
        String s1 = "안녕";
        String s2 = "안녕";

        if (s1 == s2) {
            System.out.println("같다.");
        }
    }
}
같다.

ToCharArray() 메서드로 문자열을 문자 배열로 변환하기

이번에는 ToCharArray() 메서드를 사용하여 문자열을 문자 배열로 변환하는 방법을 알아보겠습니다.

코드: StringToCharArray.cs

> //[?] ToCharArray() 메서드로 문자열을 문자 배열로 변환하기
> string s = "Hello.";
> 
> char[] ch = s.ToCharArray(); // 문자열을 문자 배열로 변환
> ch
char[6] { 'H', 'e', 'l', 'l', 'o', '.' } 
> for (int i = 0; i < ch.Length; i++)
. {
.     Console.Write($"{ch[i]}\t"); 
. }
H	e	l	l	o	.	

ToCharArray() 메서드를 호출하면 문자열이 개별 문자로 나뉘어 문자 배열로 반환됩니다. 위 코드에서는 생성된 ch 배열을 for 문을 사용하여 하나씩 출력하면서 문자열이 문자 배열로 변환되는 과정을 확인할 수 있습니다.

문자 배열을 문자열로 변환하기

문자 배열을 다시 문자열로 변환하려면 다음과 같은 코드를 사용할 수 있습니다.

코드: StringAndCharArrayConverter.cs

> string originalString = "Hello";
> char[] charArray = originalString.ToCharArray();
> string.Join(", ", charArray)
"H, e, l, l, o"
> string newString = new string(charArray);
> newString
"Hello"
  • string.Join(", ", charArray) 메서드는 문자 배열의 각 요소를 지정된 구분 문자(", ")로 연결하여 하나의 문자열로 만듭니다. 이 과정을 통해 배열의 내용을 확인할 수 있습니다.
  • new string(charArray) 생성자는 주어진 문자 배열을 원래 문자열로 복원합니다. 결과적으로, newString 변수는 원래 문자열인 "Hello"를 담게 됩니다.

이처럼 ToCharArray() 메서드와 new string() 생성자를 활용하면 문자열과 문자 배열 간의 변환 작업을 쉽게 수행할 수 있습니다.

Split() 메서드로 문자열 분리하기

이번에는 콤마와 같은 구분자를 사용하여 문자열을 분리하는 방법을 알아보겠습니다.

코드: StringSplit.cs

> //[?] Split() 메서드로 문자열 분리하기
> string src = "Red,Green,Blue";
> 
> // 문자열에서 특정 구분자를 사용하여 문자열 배열 만들기
> string[] colors = src.Split(',');
> colors
string[3] { "Red", "Green", "Blue" }

원본 문자열인 src 변수에는 콤마를 구분으로 3개의 문자열이 저장되어 있습니다. 이러한 형태에서 콤마와 같은 구분자를 바탕으로 새로운 문자열 배열을 만들어낼 때 Split() 메서드가 사용됩니다.

문자열의 null 값 및 빈 값 체크

문자열 변수는 ""와 같이 빈 값이 들어오거나 null 값이 들어올 수 있습니다. String.IsNullOrEmpty() 메서드로 문자열 변수를 묶어주면 null 또는 빈 값인지 여부를 알 수 있습니다.

이번에는 String.IsNullOrEmpty() 메서드를 사용해보겠습니다.

코드: StringIsNullOrEmptyDemo.cs

> //[?] 문자열의 null 값 및 빈 값 체크
> var str = "";
> 
> var str = String.Empty;
> 
> //[1] null 비교와 "" 값 비교를 사용하여 처리
> if (str == null || str == "")
. {
.     Console.WriteLine($"{nameof(str)} 변수의 값은 null 또는 빈(Empty)값입니다.");
. }
str 변수의 값은 null 또는 빈(Empty)값입니다.
> 
> //[2] String.IsNullOrEmpty() 메서드를 사용하여 처리
> if (string.IsNullOrEmpty(str))
. {
.     Console.WriteLine($"{nameof(str)} 변수의 값은 null 또는 빈(Empty)값입니다.");
. }
str 변수의 값은 null 또는 빈(Empty)값입니다.
str 변수의 값은 null 또는 빈(Empty)값입니다.
str 변수의 값은 null 또는 빈(Empty)값입니다.

[1]번 코드처럼 null""를 비교하는 코드를 한번에 해주는 API가 [2]번 코드 영역의 String.IsNullOrEmpty() 메서드입니다. String.IsNullOrEmpty()string.IsNullOrEmpty() 처럼 String대문자 클래스 이름 또는 소문자 키워드 중 하나로 표현됩니다.

문자열 변수에 대한 유효성 검사를 진행하는 3가지 방법

이번에는 문자열 변수에 대한 유효성 검사 진행하는 3가지 방법을 살펴보겠습니다.

코드: StringValidation.cs

> //[?] 문자열 변수에 대한 유효성 검사를 진행하는 3가지 방법 정리
> //[!] 문자열 유효성 검사
> string userName = "a_b_c";
> 
> //[1] 빈값(Empty)과 널값(null) 확인 
> userName = null;
> if (userName != "" && userName != null)
. {
.     var s = userName.Split('_'); // null일 때 에러 발생
. }
> 
> //[2] [1]번과 동일한 표현 방법
> userName = "";
> if (!string.IsNullOrEmpty(userName))
. {
.     var s = userName.Split('_');
. }
> 
> //[3] ([1][2]) + "공백"까지 처리
> userName = " ";
> if (!string.IsNullOrWhiteSpace(userName))
. {
.     var s = userName.Split('_');
. }

이 코드는 3개의 if 문이 한번도 실행이 되지 않고 출력 내용이 없어 실행 결과 아무런 값도 출력하지 않습니다.

실습 - 문자열 처리 관련 주요 API 살펴보기

소개

C# 응용 프로그램을 제작할 때 자주 사용되는 String(스트링) 클래스의 문자열 처리 관련 기능을 정리해보겠습니다.

따라하기

(1) Visual Studio를 열고 C# Interactive를 실행합니다. 프로젝트 기반 원본 소스는 다음 경로에 있습니다.

  • C:\C#\StringClassNote\StringClassNote.cs

(2) 문자열 변수는 초기화하지 않으면 기본적으로 null 값으로 초기화 됩니다. 일반적으로 빈 문자열을 의미하는 "" 또는 String.Empty 속성으로 초기화합니다.

> string str = "";
> str = String.Empty;

(3) 몇가지 문자열 관련 API를 연습하기 위해서 앞 뒤 공백 및 대소문자를 구분한 다음 문자열로 초기화한 후 출력합니다.

> str = " Abc Def Fed Cba ";
> str
" Abc Def Fed Cba "

str 변수의 앞과 뒤에 공백인 한 칸 들어가 있는 상태입니다

(4) 문자열 변수의 Length 속성을 사용하여 문자열의 길이를 구할 수 있습니다. C#에서는 한글 및 영문 모두 1자로 표현합니다.

> str.Length
17

(5) 문자열은 문자의 배열을 의미합니다. str[5] 형태로 5번째 인덱스의 문자 하나를 구할 수 있습니다.

> str[6 - 1]
'D'

(6) ToUpper() 메서드로 대문자로 변경하고 ToLower() 메서드로 소문자로 변경합니다.

> str.ToUpper()
" ABC DEF FED CBA "
> str.ToLower()
" abc def fed cba "

(7) Trim() 메서드를 사용하면 문자열의 시작과 끝 부분의 하나 이상의 공백을 제거합니다. 만약 시작 공백 또는 마지막 공백을 제거하고자할 때에는 TrimStart() 메서드와 TrimEnd() 메서드를 사용합니다.

> str.Trim()
"Abc Def Fed Cba"
> str.TrimStart()
"Abc Def Fed Cba "
> str.TrimEnd()
" Abc Def Fed Cba"

(8) Replace() 메서드는 2개의 매개 변수 중 첫 번째 매개 변수를 문자열에서 검색 후 있으면 두 번째 매개 변수로 변경한 값을 반환합니다.

> str.Replace("Def", "디이에프")
" Abc 디이에프 Fed Cba "

(9) 모든 문자열 처리 관련 메서드들은 하나 이상을 연결해서 호출할 수 있습니다. 이를 메서드 체이닝(Method Chaining)으로 부릅니다.

> str.Replace("Def", "디이에프").Replace("Fed", "XYZ").ToLower()
" abc 디이에프 xyz cba "

(10) IndexOf() 메서드는 문자열에서 앞부분부터 검색을 시작하여 지정된 문자의 위치(인덱스)를 알려줍니다. LastIndexOf() 메서드는 문자열의 뒤에서부터 검색을 시작하여 지정된 문자의 인덱스를 구할 때 사용됩니다. 즉, 처음 요소의 인덱스는 IndexOf() 메서드를 사용하고 마지막 요소의 인덱스는 LastIndexOf() 메서드를 사용하여 구합니다.

> str.IndexOf('e')
6
> str.LastIndexOf('e')
10

(11) Substring() 메서드는 Substring(5, 3) 형태로 5번째 인덱스부터 3자를 읽어올 수 있고 Substring(5) 형태로 5번째 인덱스 이후로 나오는 모든 문자열을 반환할 수 있습니다.

> str.Substring(5, 3)
"Def"
> str.Substring(5)
"Def Fed Cba "

(12) Remove() 메서드는 매개 변수로 지정한 위치의 문자 또는 문자열을 제거하여 출력하는 기능을 제공합니다.

> str.Remove(5, 3)
" Abc  Fed Cba "

(13) 문자열 비교는 == 연산자, String.Compare() 메서드, String.Equals() 메서드 등을 사용하여 값을 비교할 수 있습니다.

> str[2 - 1] == str[16 - 1]
false
> String.Compare("A", "C")
-1
> "A".CompareTo("C")
-1
> "Abc".Equals("Abc")
true
> String.Equals("Abc", "aBC")
false

(14) StartsWith() 메서드로 특정 문자열로 시작하는지 여부를 알 수 있고 EndsWith() 메서드로 특정 문자열로 끝나는지 여부를 알 수 있습니다.

> "http://www.dotnetkorea.com".StartsWith("http")
true
> "http://www.dotnetkorea.com".EndsWith(".com")
true

(15) 문자열을 연결할 때에는 더하기 연산자, String.Concat() 메서드, String.Format() 메서드 및 문자열 보간법 등이 사용됩니다.

> var hi1 = "안녕";
> var hi2 = "하세요.";
> hi1 + hi2
"안녕하세요."
> String.Concat(hi1, hi2)
"안녕하세요."
> String.Format("{0} {1} {0}", hi1, hi2)
"안녕 하세요. 안녕"
> $"{hi1} {hi2}"
"안녕 하세요."

(16) String.Format() 메서드 및 문자열 보간법은 문자열에 지정된 숫자 값을 바탕으로 통화량(C) 또는 세자리마다 콤마를 찍는 문자열을 다음과 같이 줄 수 있습니다.

> String.Format("{0:C}", 1000)
"₩1,000"
> String.Format("{0:#,###}", 1000)
"1,000"
NOTE

제 개인적인 생각으로는, 프로그래밍에 앞서 Microsoft Excel을 경험해보면 많은 부분에서 큰 도움이 된다고 생각합니다.

(17) Split() 메서드는 지정한 문자를 구분자로 하여 문자열에서 또 다른 문자열 배열을 뽑아내는데 사용됩니다. 변수 str에는 공백을 기준으로 구분이 되어 있습니다. Split(' ') 형태로 공백 하나를 구분자로 구분해서 문자열 배열로 구분해서 strArray 배열을 채우면 Abc, Def, Fed, Cba 순서로 배열 요소가 생성됩니다.

> string[] strArray = str.Trim().Split(' ');
> foreach (string s in strArray)
. {
.     Console.WriteLine(s);
. }
Abc
Def
Fed
Cba

(18) 기타, Insert() 메서드로 문자열을 삽입하거나 Remove() 메서드로 문자열을 제거할 수도 있습니다.

> string original = "Hello";
> string modified = original.Insert(5, "World");
> modified
"HelloWorld"
string original = "HelloWorld";
> string modified = original.Remove(5);
> modified
"Hello"

(19) 문자열에 PadLeft()PadRight()를 사용하여 특정 문자를 왼쪽 또는 오른쪽에 채울 수 있습니다.

> string number = "1234";
> number.PadLeft(10, '0')
"0000001234"
> number.PadRight(10, '_')
"1234______"

마무리

상당히 긴 코드를 통해서 C#에서 주로 사용되는 문자열 처리 관련 기능들을 살펴보았습니다. 이번 실습에서 제시한 많은 메서드들은 프로그래밍에서 많이 사용되는 코드이니 실습이 길더라도 여러 번 연습하길 바랍니다.

StringBuilder 클래스를 사용하여 문자열 연결하기

string 키워드로 선언된 문자열 변수는 더하기 연산자 등으로 문자열을 연결할 수 있습니다.

System.Text 네임스페이스에 포함되어 있는 StringBuilder 클래스는 문자열을 추가 및 삭제하는 등의 유용한 API를 제공함으로써 긴 문자열을 묶어서 처리해야하는 경우에 유용하게 사용될 수 있습니다.

StringBuilder 클래스를 사용하여 문자열을 연결하는 방법은 어려울 수 있으니 다음 내용을 가볍게 따라하기 해 본 후 넘어가도 됩니다.

StringBuilder 클래스는 Console.WriteLine() 또는 String.Format()과 달리 직접 StringBuilder.메서드() 형태를 가지지 않습니다. StringBuilder 클래스의 주요 멤버들은 앞으로 자세히 다룰 인스턴스 멤버이기에 클래스의 인스턴스인 개체를 생성 후 호출이 가능합니다. 클래스를 사용하려고 새로운 개체를 만드는 것을 인스턴스 생성이라고 합니다.

"인스턴스 생성" 의미는 개체 만들기 장에서 자세히 다루겠지만, 간단한 구문은 다음 모양과 같습니다.

클래스 개체 = new 클래스();

StringBuilder 클래스를 사용하려면 다음과 같이 builder 등의 이름으로 새로운 이름의 개체(인스턴스)를 생성해야 합니다.

> StringBuilder builder = new StringBuilder();

StringBuilder 클래스의 Append() 메서드로 문자열 연결

StringBuilder 클래스의 모든 멤버도 다 설명하지 않고 필요한 내용 몇 가지를 다루어 보겠습니다.

코드: StringBuilderClass.cs

> //[?] StringBuilder 클래스의 Append() 메서드로 문자열 연결
> using System.Text;
> 
> //[1] StringBuilder 클래스의 인스턴스 생성
> StringBuilder sb = new StringBuilder();
> 
> //[2] Append() 메서드로 문자열 추가
> sb.Append("January\n");
> sb.Append("February\n");
> sb.AppendLine("March");
> 
> sb
[January
February
March
]
> 
> //[3] ToString() 메서드로 문자열로 출력
> sb.ToString()
"January\nFebruary\nMarch\r\n"

StringBuilder 클래스는 인스턴스 생성 후 Append() 등의 메서드를 통해서 문자열을 추가합니다. AppendLine() 메서드를 사용하면 문자열 끝에 \r\n를 추가합니다. StringBuilder의 개체인 sb 변수는 그 자체가 StringBuilder이기에 이 안에 묶여 있는 문자열을 출력하기 위해서는 ToString() 메서드로 문자열로 변환 후 사용이 가능합니다.

메서드 체이닝으로 StringBuilder 클래스의 여러 메서드 호출하기

StringBuilder 클래스도 메서드 체이닝을 통해서 여러 메서드를 단계별로 호출할 수 있습니다.

다음 메서드의 message 변수를 생성하는 부분은 한 줄로 길게 작성해도 됩니다.

코드: MethodChaining.cs

> //[?] 메서드 체이닝으로 StringBuilder 클래스의 여러 메서드 호출하기
> using System.Text;
> 
> var message = new StringBuilder()
.     .AppendFormat("{0} 클래스를 사용한 ", nameof(StringBuilder))
.     .Append("메서드 ")
.     .Append("체이닝 ")
.     .ToString()
.     .Trim();
> message
"StringBuilder 클래스를 사용한 메서드 체이닝"

StringBuilder 클래스 사용하기

이번에는 StringBuilder 클래스의 여러 메서드를 함께 사용해보겠습니다.

코드: StringBuilderDemo.cs

> //[?] StringBuilder 클래스: 문자열 처리 관련 여러 메서드 제공
> using System.Text;
> 
> //[!] StringBuilder 클래스: 긴 문자열 묶을 때 효과적
> StringBuilder sb = new StringBuilder();
> 
> sb.Append("<script>");
> sb.AppendFormat("window.alert(\"{0}\");", DateTime.Now.Year);
> sb.AppendLine("</script>");
> 
> sb.ToString()
"<script>window.alert(\"2023\");</script>\r\n"

StringBuilder 클래스의 인스턴스 생성 후 Append(), AppendFormat(), AppendLine() 등의 메서드를 통해서 문자열을 여러 방식으로 추가할 수 있습니다.

StringBufferDemo.java

코드: StringBufferDemo.java

// StringBuffer 클래스: 문자열 묶고 추가 또는 삭제 등의 명령어 제공
public class StringBufferDemo {
    public static void main(String args[]) {
        //[!] StringBuffer 클래스: 긴 문자열 묶을 때 효과적
        //[1] 50자 정도의 문자열을 받을 수 있는 그릇(버퍼) 생성 
        StringBuffer sb = new StringBuffer(50);

        //[2] 문자열 추가
        sb.append("안녕하세요.");

        //[3] 문자열 입력
        sb.insert(0, "홍길동님, ");        

        //[4] 문자열 출력
        System.out.println(sb + ": " + sb.length());
    }
}
홍길동님, 안녕하세요.: 12

String과 StringBuilder의 성능 차이 비교

이번에는 String 클래스와 StringBuilder의 성능 차이를 알아보겠습니다. 먼저 문자열 변수를 더하기 연산자로 1만번 연결하는 시간을 재 보겠습니다.

코드: StringPerformance.cs

using System;

class StringPerformance
{
    static void Main()
    {
        DateTime start = DateTime.Now;

        string msg = "";
        for (int i = 0; i < 10000; i++)
        {
            msg += "안녕하세요."; 
        }

        DateTime end = DateTime.Now;
        double exec = (end - start).TotalMilliseconds;
        Console.WriteLine(exec); // 60~70
    }
}
62.5

문자열 변수를 더하기 연산자로 묶는 작업을 1만번 수행했을 때 박용준 강사의 컴퓨터에서는 60에서 70 밀리초 정도가 소비되었습니다.

이제 동일한 작업을 StringBuilder 클래스의 Append() 메서드로 묶어 보겠습니다.

코드: StringBuilderPerformance.cs

using System;
using System.Text;

class StringBuilderPerformance
{
    static void Main()
    {
        DateTime start = DateTime.Now;

        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < 10000; i++)
        {
            sb.Append("안녕하세요.");
        }

        DateTime end = DateTime.Now;
        double exec = (end - start).TotalMilliseconds;
        Console.WriteLine(exec); // 1
    }
}
1.0001

String 변수로 묶는 작업과 달리 StringBuilder를 사용하였을 때에는 1밀리초 정도로 아주 빠르게 진행이 되는 것을 확인할 수 있습니다. 이처럼 많은 양의 문자열을 반복해서 묶는 작업이 필요한 경우에는 StringBuillder 클래스를 사용하면 효율적입니다.

TIP

StringBuilder를 반드시 써야겠다고 판단이 드는 상황이 아니라면, 평상시에는 더하기 연산자와 같은 기본 방식으로 문자열을 연결하면 됩니다.

참고: 정수를 문자열로 표현시 +, - 기호 붙이기

숫자 형식의 문자를 +, - 기호를 붙여 표현할 때에는 ToString() 메서드 또는 String.Format() 메서드에 서식을 주어 표현할 수 있습니다.

코드: ToStringFormat.cs

> //[?] 정수를 문자열로 표현시 +, - 기호 붙이기 
> //[?] 10 -> +10, -10 -> -10, 0 -> 0
> 10.ToString("+#;-#;0")
"+10"
> 
> string.Format("{0:+#;-#;0}", -10)
"-10"
> 
> $"{10:+#;-#;0}"
"+10"

ToString() 메서드, String.Format() 메서드, 문자열 보간법 등에 +#;-#;0 형식을 사용하여 숫자에 +, - 기호를 붙입니다.

장 요약

프로그래밍에서 문자열 다루기는 언제 어디서든 필요한 기능입니다. 닷넷에서 문자열을 다룰 때에는 String 클래스와 StringBuilder 클래스가 자주 사용됩니다. 문자열 변수에서 제공되는 여러 메서드와 String, StringBuilder 클래스에서 제공되는 메서드들을 이번 장에서 모두 다루지는 않았지만 거의 대부분은 다뤄보았으니 각각의 기능의 사용법을 잘 기억해 두세요.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com