메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

StringBuilder 입문

한빛미디어

|

2003-07-31

|

by HANBIT

14,169

저자: 웨이-밍 리(Wei-Meng Lee), 역 한동훈(traxacun@unitel.co.kr)

비주얼 베이직에서는 문자열 생성, 자르기, 붙이기 등과 같은 문자열 조작이 쉽게 때문에 비주얼 베이직 프로그래머들은 이러한 문자열 조작을 쉽게 할 수 있다. 예를 들어 다음 코드는 두 개의 문자열을 하나로 합쳐준다.
Dim st As String
st = "Hello"
st += " World!"
그렇지만 닷넷에서 일단 한번 생성된 문자열은 변경될 수 없기 때문에(immutable) 위와 같은 코드는 권장되지 않는 문자열 조작 방법이다. 닷넷은 실행중에 문자열이 변경되면 새로운 문자열 객체를 생성한다. 위 예제에서는 두 개의 문자열 객체가 생성되는데 첫번째는 "Hello"와 같이 문자열이 초기화 될 때 이며, 다른 하나는 문자열을 합칠 때이다.

문자열을 보다 효율적으로 다루려면 System.Text 네임스페이스의 StringBuilder 클래스를 사용해야 한다. StringBuilder 클래스는 문자들로 이루어진 목록으로 되어 있으며 이는 문자열과 비슷하다. StringBuilder 클래스는 생성된 후에 내용이 변경될 수 있다는 점을 제외하면 String 데이터 형식에 가깝다.

아래 예제에는 StringBuilder 클래스의 생성자중, 문자열을 매개변수로 사용하는 것을 이용하여 개체를 생성하고 있으며 ToString() 메소드를 사용하여 간단하게 문자열처럼 다룰 수 있다.
Dim str As New StringBuilder("This is a string")
Dim aString As String
aString = str.ToString
Console.WriteLine(aString)
이제부터는 일반적인 문자열을 처리하기 위해 StringBuilder 클래스의 다양한 메소드와 속성을 사용하는 방법에 대해 소개할 것이다.

문자열 이어 붙이기

기존 문자열에 문자열을 이어 붙이려면 Append() 메소드를 사용하면 된다.
"---Appending a string
str.Append(" created using StringBuilder.")
Console.WriteLine(str)
위 코드를 실행한 결과는 다음과 같다.
This is a string created using StringBuilder.
AppendFormat() 메소드를 사용하면 이어 붙일 텍스트에 적절한 형식을 지정할 수 있다. 여기서는 StringBuilder 객체에 현재 날짜를 추가하기 위해 ShortDatePattern을 사용하여 날짜의 출력 형식을 제어하였다.
"---Appending with format
str.AppendFormat("{0}:{1:d}", " Created on ", Today)
Console.WriteLine(str)
위 코드를 실행한 결과는 아래와 같다.
This is a string created using StringBuilder. Created on :7/14/2003
날짜 형식 지정에 대한 보다 자세한 내용은 MSDNDateTimeFormatInfo 클래스를 참고하기 바란다.


Programming Visual Basic .NET, 2nd Edition

참고 도서

Programming Visual Basic .NET, 2nd Edition
Jesse Liberty


문자열 삽입하기

문자열을 삽입하기 위해서는 Insert() 메소드를 사용한다.
"---Inserting a string
str.Insert(0, "VB.NET : ") " 기존 문자열 앞에 문자를 삽입한다.
Console.WriteLine(str)
위 코드를 실행한 결과는 다음과 같다.
VB.NET : This is a string created using StringBuilder. Created on :7/14/2003
문자열 바꾸기

Replace() 메소드를 사용해서 문자열을 바꾼다.
"---문자열 바꾸기
"-- 대소문자를 구분한다.
str.Replace("VB.NET", "C#")  " replace VB.NET with C#
Console.WriteLine(str)
위 코드를 실행한 결과는 다음과 같다.
C# : This is a string created using StringBuilder. Created on :7/14/2003
문자열 내의 각 문자의 순서를 나타내는 색인과 Chars() 속성을 사용하여 문자열을 바꾸는 것도 가능하다.
"---한 문자만 바꾸기
str.Chars(0) = "c"          " 첫번째 문자를 "c"로 변경한다.
Console.WriteLine(str)
위 코드를 실행한 결과는 다음과 같다.
c# : This is a string created using StringBuilder. Created on :7/14/2003
문자열 일부를 제거하기

문자열 일부를 제거하려면 Remove() 메소드를 사용한다.
"---문자열 제거하기
str.Remove(0, 5) " 첫번째 글자부터 시작해서 5개의 문자를 삭제한다.
Console.WriteLine(str)
위 코드를 실행한 결과는 다음과 같다.
This is a string created using StringBuilder. Created on :7/14/2003
단어의 위치 찾기

문자열 내에서 특정 단어의 위치를 찾을 경우에는 ToString() 메소드와 함께 IndexOf() 메소드를 사용할 수 있다. 단어를 찾을 수 없다면 -1을 반환한다.
"---단어가 처음으로 일치하는 부분을 찾기
Console.WriteLine(str.ToString.IndexOf("i"))
위 코드를 실행한 결과는 다음과 같다.
2
IndexOf() 메소드는 주어진 문자나 문자열과 처음으로 일치되는 위치를 반환하기 때문에 어떤 단어와 일치하는 부분을 모두 찾으려면 IndexOf() 메소드의 오버로드된 버전을 사용해야 하고, 이 코드를 루프 안에서 실행해야 한다. 다음 예제는 문자열에서 단어 "is"를 모두 찾는 예제이다.
"---단어와 일치하는 부분을 모두 찾기
"--대소문자 구분함
Dim index As Integer = -1
Do
	index += 1
	index = str.ToString.IndexOf("is", index)
	If index >= 0 Then Console.WriteLine(index)
Loop Until index = -1
위 코드를 실행한 결과는 다음과 같다.
2
5
문자열 나누기

문자열을 여러 개로 나누려면 Split() 메소드와 문자열을 구분할 구분자(separator)를 사용한다.
 "---문자열 나누기
Dim str1 As New _
	 StringBuilder("Mango Apple Orange Pineapple Durian")
 Dim aStr() As String = str1.ToString.Split(" ") " separator is " "
 For j As Integer = 0 To aStr.Length - 1
	 Console.Write(aStr(j) & "-")
 Next
위 코드를 실행한 결과는 다음과 같다.
Mango-Peach-Orange-Pineapple-Durian-
문자열 덮어쓰기/자르기

StringBuilder 개체에 새로운 문자열을 할당하려면 Remove() 메소드를 사용해서 전체 문자열을 제거한 다음에 Append() 메소드를 사용하면 된다. Length 속성은 문자열의 길이를 반환한다.
"---기존 문자열 덮어쓰기
str1.Remove(0, str1.Length)
str1.Append("Mango Apple Orange Pineapple Durian")
Console.WriteLine(str1)
위 코드를 실행한 결과는 다음과 같다.
Mango Apple Orange Pineapple Durian
위 코드의 두 문장을 다음 예제와 같이 하나의 코드로 결합할 수도 있다.
str1.Remove(0, str1.Length).Append("Mango Apple Orange Pineapple Durian")
Console.WriteLine(str1)
문자열을 할당하는 다른 방법은 StringBuilder 객체의 Length 속성을 0으로 설정한 다음에 Append() 메소드를 사용하는 것이다. Length 속성을 0으로 설정하면 문자열을 제거하는 것과 같다.
str1.Length = 0
str1.Append("Mango Apple Orange Pineapple Durian")
Console.WriteLine(str1)
대부분의 경우, Length 속성은 읽기 전용일거라고 추측했겠지만 실제로는 Length 속성에 실제 문자열 길이보다 작은 값을 할당하면 문자열을 해당 길이만 남기고 자를 수 있다.
"---문자열 자르기
str1.Length = 11
Console.WriteLine(str1)
위 코드를 실행한 결과는 다음과 같다.
Mango Apple
문자열 비교하기

문자열 처리 작업 중에 가장 흔히 볼 수 있는 예는 문자열을 비교하는 것이다. 문자열이 동일한지 비교하기 위해 Compare() 메소드를 사용한다.
"---Comparing strings
Dim str2 As New StringBuilder("String 1")
Dim str3 As New StringBuilder("String 2")
Dim str4 As New StringBuilder("string 1")

Console.WriteLine(str2.ToString.Compare(str2.ToString, _
                                        str3.ToString))
Console.WriteLine(str2.ToString.Compare(str2.ToString, _
                                        str4.ToString)) 
Console.WriteLine(str2.ToString.Compare(str2.ToString, _
                                        str4.ToString, False))
Console.WriteLine(str2.ToString.Compare(str2.ToString, _
                                        str4.ToString, True))
위 코드를 실행한 결과는 다음과 같으며 괄호안의 내용은 필자의 설명이다.
-1 (str2 < str3)
 1 (str3 > str4)
 1 (str3 > str4)
 0 (str3 = str4)
문자열 비교의 기본 설정은 대소문자를 구분하게 되어있다. 문자열 비교를 수행하는 동안 대소문자 구분을 무시하고 싶다면 대소문자 구분 여부를 Boolean 매개변수로 사용하는 오버로드된 버전의 Compare() 메소드를 사용하면 된다. 이 값을 True로 설정하면 대소문자 구분을 무시할 것이다. 기본값은 False로 되어 있다.
이 기사를 작성한 웨이-밍 리(Wei-Meng Lee)는 닷넷 전문가이자 저자로 활동하고 있으며 「SQL Server Magazine」과 「Visual Studio Magazine」, 「.NET Magazine」에 기사를 기고하고 있다.
TAG :
댓글 입력
자료실