문자열 비교를 효과적으로 하기

문자열이 NULL인 경우를 판단해야 할 때가 많다. 특히 파일명을 입력받는 과정에서 아무값도 넘겨주지 않는 경우도 고려해야 한다.
일반적으로 문자열비교는 그 내용을 가지고 하지만, NULL인지 여부를 판단하는 경우에는 문자열의 길이로 판단하는 것이 훨씬 빠르다.

[vbnet]’고치기 전
If  dlgFile.FileName <> “” Then
txtBuildingDataFileName.Text = .FileName
End If[/vbnet]

[vbnet]’고친 후
If dlgFile.FileName.Length <> 0 Then
txtBuildingDataFileName.Text = .FileName
End If[/vbnet]

한글 텍스트 파일 읽기

한글 텍스트 파일을 읽기 위해서는 인코딩을 다음과 같이 지정해 주어야 한다.

[vbnet]’파일스트림 열기
Dim fs As New FileStream(“myhangultext.txt”, FileMode.Open, FileAccess.Read)

‘스트림리더 열기
‘*** 주의 : System.Text.Encoding.Default를 지정해야 ‘한글’을 읽어올 수 있음!!!
‘시스템의 현재 ANSI 코드 페이지에 대한 인코딩을 가져옵니다
‘Dim Reader As New StreamReader(fs, System.Text.Encoding.Default)
‘–> 사실 이렇게 하면, 한글윈도우이어야 읽을 수 있다.
‘명확히 한글을 읽을 수 있게 하려면 다음과 같이 해야 한다.
Dim Reader As New StreamReader(fs, System.Text.Encoding.GetEncoding(949))
‘여기서 949는 한글에 대한 code page이다.

‘자료를 읽기
Call Parse(Reader)

‘스트림리더 닫기
Reader.Close()
[/vbnet]

문자열을 읽어서 단어로 나누어 주는 함수 짜기

입력받은 문자열을 쉼표와 빈칸에 따라 단어를 나누어 준다.

Function GetWords(ByVal TextLine As String, ByVal ParamArray Separators() As Char) As String()
'
' 입력받은 문자열을 쉼표와 빈칸에 따라 단어를 나누어 준다.
' divide character string into separate words according to period and blank space.
'
'Revision History
' &amp;nbsp;Written by Yong-Yee Kim, 2005/11/25
'
Dim MySeparators() As Char = {","c, ":"c, "|"c, ";"c, """"c, "'"c} '기본 구분자 = 쉼표, 콜론, 파이프, 세미콜론, 큰따옴표, 작은따옴표
Dim Words() As String = {}
'
'1)문자열 시작과 끝의 공백을 제거한다.
TextLine = TextLine.Trim()
'
'2)문자열을 구분자(쉼표)를 통하여 분할한다.
If Separators.Length &amp;gt; 0 Then
MySeparators = Separators
End If
Dim Tokens() As String = TextLine.Split(MySeparators)

'
'3)얼마나 많은 단어가 존재하는가?
Dim nums As Integer = 0
For i As Integer = 0 To Tokens.Length - 1
If Tokens(i).Trim.Length &amp;gt; 0 Then '빈 문자열의 단어는 제외시킴
nums += 1
End If
Next i
'
'4)단어수만큼 배열을 할당
ReDim Words(nums - 1)
'
'5)단어를 반환한다.
Dim WordCount As Integer = 0
For j As Integer = 0 To Tokens.Length - 1
If Tokens(j).Trim.Length &amp;gt; 0 Then
Words(WordCount) = Tokens(j).Trim
WordCount += 1
End If
Next j
'
Return Words
End Function

여기서 3)과 5)가 많이 비슷하고 중복된 것으로 느낄 것이다.
그래서 어느 한 쪽을 지워버리면 어떤 일이 생길까?
시간이 되시면 한 번씩 해보면 좋을 것 같다.
결론부터 말하자면, 빈 문자열도 하나의 단어처럼 취급될 수 있다.
즉, 원하는 결과를 제대로 얻을 수 없다.

[사용법]

Dim Words() As String = Getwords("김창선, 4", ",") '문자열을 쉼표로 구분하라
'Words(0) 의 내용은 "김창선"
'Words(1)의 내용은 "4"

Single.Parse()처럼 문자열을 객체로 만드는 방법

Single.Parse()는 문자열을 읽어서 그 값을 Single형 값으로 바꾸어준다.

[vbnet]Dim myValue As Single = Single.Parse(“36.5”)[/vbnet]

myValue는 단정도 실수인 36.5가 된다.

이 방법은 파일에서 문자열을 읽어온 후에, 그 값을 전환하는데 있어서 매우 유용하다.

같은 방법으로 문자열을 읽어서 특정 객체를 생성시키려면 다음과 같이 하면 된다.

<작성하고자 하는 클래스>

[vbnet]Public Class Person ‘클래스명 = Person
Private m_Name As String
Private m_Age As Short
…<중략>….
End Class[/vbnet]

1) String형 매개변수를 갖는 생성자를 선언한다.

그리고, 생성자 코드 안에 문자열을 해석할 InternalParse를 호출한다.

[vbnet]Public Sub New(ByVal myText As String)
InternalParse(myText)
End Sub [/vbnet]

생성자 내용을 간단하게 하는 것이 좋다.

다른 함수(초기화메소드)를 이용하면, 인스턴스 변수에 대한 초기화를 생성자 이외에서도 할 수 있다.

2) InternalParse() 메소드를 작성한다.

[vbnet]Private Sub InternalParse(ByVal myText As String)
‘문자열을 분해한다.
Dim Words() As String = GetWords(myText) ‘GetWords에 대한 함수는 각자가 작성 ^^
‘하나의 문자열을 의미있는 단어로 분할!
‘분해된 문자열을 인스턴스 변수에 대입한다.
m_Name = Words(0) ‘이름
m_Age = Short.Parse(Words(1)) ‘나이
End Sub [/vbnet]

3) Parse() 메소드를 작성한다.

이 때, 이 클래스의 인스턴스 없이 Parse()메소드를 호출하기 위해서는 Shared를 선언한다.

[vbnet]Public Shared Function Parse(ByVal myText As String) As Person
Return New Person(myText)
End Sub[/vbnet]

4)사용법

[vbnet]Dim mySon As Person = Person.Parse(“김창선, 4”) [/vbnet]

이름은 ‘김창선’이고 나이는 ‘4’인 mySon 인스턴스가 생긴다.