PROGRAMMING WORKSHOP

VB.Net | String 개체

VBA에서는 Sring은 정보의 타입으로 사용한다
Dim sX As String
sX="This is my first VB.Net"
과 같이 한후 문자열을 처리하는 함수를 사용하여
Len(sX) 라고 하면 sX문자열이 몇개의 문자로 되어 있는지 알아내고
Instr(sX,"VB")라고 하면 VB라는 문자가 sX문자열정보내에서
몇번째 문자인지를 알아낸다
위와 같은 함수들을 VB.net에서 사용할수 있을까?
물론 사용할수 있다
VBA의 함수들은 VB 6.0시절에 사용하던 함수들과 같은 것이다
하지만 VB.Net은 철저하게 개체지향적인 언어가 되었다
이전 버전의 것도 받아주는 것이 일반적인 상식이다
그러니 사용할수 있는 것이다

위와 같은 경우를 VB.Net으로 처리한다면
"This is my first VB.net".Length 라고 하면
변수에 문자열을 넣지 않고도 그냥 문자열을 문자열 개체로 인식하고
개체이므로 속성이나 메소드를 뒤에 붙여서..
"This is my firt VB.net".Length 라고 표현하여 문자열이 몇개의
문자로 구성되었는지 알아내는 Len(sX)와 같은 역할을 한다
VBA에서 사용하는 문법도 사용할수 있지만
개체지향적언어의 즐거움을 느끼려면
될수 있는 한 새로운 방법을 받아들이는 것이 좋을 것이다
그런 것에 대한 VBA와 비교하면서 String개체를 이야기 해보자

VB.Net에서 중요한 것은
1에서 부터 시작하지 않고 항상 0부터 시작한다는 점을 잊지 말자
"This is my first VB.net"을
Instr("This is my first VB.net")의 값은 1이다 This의 T가 첫번째문자라서
그런데 VB.Net에서는
"This is my first VB.net".IndexOf("This")라고 표현하거나
Dim sX As String="This is my first VB.net"
sX.IndexOf("This") 라고 한 결과는 0이다
문자열의 첫째문자는 0번째라고 문자라고 약속을 하고 있는 것!!

Max,Min

버튼 하나 달고 아래와 같이 해보시기 바란다
MsgBox("32334324".Max)
제일 큰값 4를 찾아 줄것이다
마찬가지로 Min을 하면 2을 찾아 줄것이고
문자와 숫자가 섞여있다면 물론 숫자나 문자나 모두 문자열로
간주하고 큰 것, 작은것을 찾아주는 셈이다
이것이 뭐 그렇게 필요한가?
VBA에서 위와 같은 문자열에서 작은문자, 큰문자를 찾아내려면
순환문을 돌리던가..좀 수선을 떨어야 한다
아래와 같이

Sub Test() MsgBox GetMaxChar("23254526442") End Sub Function GetMaxChar(sX As String) As String Dim iPos As Integer Dim sMax As String For iPos = 1 To Len(sX) If sMax = "" Then sMax = Mid(sX, iPos, 1) Else If sMax < Mid(sX, iPos) Then sMax = Mid(sX, iPos, 1) End If End If Next GetMaxChar = sMax End Function

프로그래밍 언어가 발전한다고 하는 것은
위와 같이 열라..순환돌리고 찾아내고 하는 것들을
개체의 메소드나 속성으로 처리하게 엔진들을 추가 시켜놓는 셈이다
그리고 또한 좀더 가볍게..좀더 빠르게를 염두게 두고
개선시켜나가는 셈이다

Insert, IndexOf

편리한 메소드들이 많다
주어진 문자열 속에 문자열을 또 삽입을 하고 싶다면
이것도 역시 VBA나 VB 6.0에서 처리한다면
순환문을 방금 배운 초보님이라면
순환문을 돌고 위치를 찾아내고 하면서 뒤에 붙였다..
그렇지 않으면 문자열정보처리 테크닉을 동원해야 하면서
앞에 붙였다하여야 할 것이다

예를 들어서
This is my first VB.Net 이라는 문자열정보를
This is my NEW first VB.net 이라고 중간에 New를
때려 넣고 싶다면
때려 넣을 위치를 찾아내고 IndexOf
그곳에 넣을 문자열 정보를 Insert 메소드를 사용하면 되는 것이다
아래와 같이
Dim sX As String="This is my first VB.Net"
sX=sX.Insert(sX.IndexOf("first"), "New ")
라고 하면 sX변수에 This is my New first VB.Net 으로 바뀐다
이것을 VB 6.0 이나 VBA에서 처리한다면

Sub InsertNew() Dim sX As String, sInsert As String sInsert = "New " sX = "This is my first VB.Net" sX = Replace(sX, "first", sInsert & "first") MsgBox sX End Sub

좀 번잡하다..
VBA를 열나 하시는 분들은 그러실수 있겠다..
이거..원 배워보았자 헛일 아니야??!!
참 잘못 생각하는 것이다
기초튼튼!!!

Contains

말그대로 문자열 정보에 어떤 문자정보가 들었는지(contains) 확인하고 싶을때

Msgbox "Excel Is Interesting And Fun".Contains("Fun")

을 하면 True가 메시지박스에 나타난다
VBA의 Instr함수나 VB.Net 의 IndexOf는 찾고자하는 문자가
있는 위치를 Integer값으로 주지면 이것은 Boolean값을 얻을 수 있다

SubString

Substring 메소드는 VBA의 Mid함수에 해당하는 것..
다른 것은 VB.Net에서 항상 0부터 시작한다는 점을
감안하여 계산하여야 한다는 점
예를 들어서
"Excel Is Interesting And Fun".Substring(9,11) 이라고 하면
Interseting이라는 문자열을 얻어낸다
VBA에서 는
Mid("Excel Is Interesting And Fun",10,11)이라고 하여야 같은 결과다

아무튼 VB.Net이나 다른 C,C++, Javascript등 모두
배열이던 집합체던 모두 0부터 시작한다는 점..
잘 챙겨두시는 것이 좋다..첨..VBA에서 넘어와서 작업을 할때
자주 헷갈리게 되는 부분중의 하나다!!
VBA에서도 배열등을 자주 사용하여 0부터 시작되는 습관을
갖는 것이 좋겠지..
그런 의미에서 배열을 자주,자주 사용하시기를..

EndsWith

화일경로같은 것에서 화일명이 마지막에 붙는다
과연 해당결로의 마지막이 어떤 원하는 화일명인지 알아내려면??
물론 Instr함수라던가 IndexOf라던가 위에서 이야기한 Contains이라던가
알아낼수 있을 것이나..
마지막에 붙어 있는지 알고 싶다면..
좀 번거로운 계산을 하여야 할것이지만
EndsWith가 있어서 편리한것이다
아래와 같이 주어진 문자열에서 Fun이라는 단어가 마지막에
붙어 있는지 알고 싶다면 EndsWith를 사용한다
Dim strX As String= "Excel Is Interesting And Fun"
MsgBox(strX.EndsWith("Fun"))
결과값은 True를 얻을수 있게 되고
이 결과값에 따라서 어떤 작업을 또 하면 되겠지..

그런데 프로그래밍에 경험이 없으면 도대체 이따위것이 왜 필요한지
모른다..
아래와 같은 것은 실제로..데이타베이스에서 정보를 갖여 오기위하여
SQL문을 작성하게 될때..
SQL문은 왼통 문자열정보의 처리이다..

sMonth = Trim(txtMonth.Text): sYear = Trim(txtYear.Text): sDay = Trim(txtDay.Text)
sWeek = Trim(txtWeek.Text): sClass = Trim(txtClass.Text): sGrade = Trim(txtGrade.Text)
sSQL = "SELECT * FROM AS_Score WHERE "
If IsNumeric(sYear) Then sSQL = sSQL & " year='" & sYear & "' AND "
If IsNumeric(sMonth) Then sSQL = sSQL & "month='" & sMonth & "' AND "
If IsNumeric(sDay) Then sSQL = sSQL & " day='" & sDay & "' AND "
If IsNumeric(sWeek) Then sSQL = sSQL & " week='" & sWeek & "' AND "
If sClass <> "" Then sSQL = sSQL & " class='" & sClass & "' AND "
If IsNumeric(sGrade) Then bFill = True: sSQL = sSQL & " grade='" & sGrade

와 같이 SQL문을 이어 나가다가...
마지막에 어떤 값이 빈값이라서 SQL문의 마지막에 재수없게 AND라는 연산자가
걸린다..
sGrade변수값이 빈탕일때 sClass변수를 처리하면서 끝에 "' AND " 라는
쓸데없는 문자열이 붙어있게 되는 것이다
이것을 그대로 ADO나 DAO에 보내면 에러가 나는 것이고
이 SQL문의 뒤에 "' AND " 가 있는지 확인하고 짤라 내버려야 하는 것이다
이런 문자열을 처리를 많이 하면(대개의 프로그래밍은 문자열처리!!)
이런 EndsWith같은 메소드는 아주 유용한 것이다..

만약 위의 것을 VBA에서 처리한다면

If InStrRev(sSQL, "' AND ") - 1 = Len(sSQL) - Len("' AND ") Then
     sSQL = Left(sSQL, Len(sSQL) - Len("' AND ") + 1)
End If

와 같이 앞뒤를 따져나가야 할 것이다


Format

VB.Net의 문자열을 다루는 메소드중에서 가장 매력적인 것은
Format메소드일 것이다
아래와 같이 하면

Dim sX As String = "홍길동"
Dim iY As Integer = 20
MsgBox(String.Format("{0}이는 현재{1} 살입니다", sX, iY))

결과는
"홍길동이는 현재20 살입니다"
라는 문자열이 된다
{0}과 {1}은 매개변수로 같이 전달된 것을 차례대로 잡아 넣어주는
편리한 지능이 높은 메소드이다
좀더 하면



Dim sX As String = "홍길동"
Dim iY As Integer = 20
MsgBox(String.Format("{0}이는 현재{1} 살입니다..현재시간은 {2:hh:mm:ss} 입니다", sX, iY, DateTime.Now))

문자열사이에 {} 표시로 스롯을 만들어주고 이곳에 변수로 전달되던 값이
직접전달되던 차례대로 {0},{1},{2}와 같이 받아서 문자열정보속에
쏙 집어 넣어주는 것이다
이것이 없으면 좀 수선을 떨어야 하지만 아주 간단하게 처리되는 셈이다
세번째 스롯{2}..항상 0부터 시작된다고 한 것이 이곳에서도 적용된다
첫번째는 {0}으로 시작된다
그래서 세번째는 {2}가되는 것이고 세번째변수로 전달된 것..
여기에서는 직접값이 전달되었다
즉 DateTime개체의 Now메소드로 현재시간을 얻은 것이다
VBA에서 Now()함수나 마찬가지다
이렇게 얻은 값을 {2:hh:mm:ss}로 받어서 처리하는 것이다
전달받은 변수 중 3번째것을 hh:mm:ss형식으로 처리하라는 것이다

위의 것을 vBA로 처리한다고 하면 아래와 같이 몇줄 더 손을 써야 할 것이다

Sub MixString()
Dim sX As String, iY As Integer
Dim sTime As String, sAll As String
sX = "홍길동"
iY = 20
sTime = Format(Now, "hh:mm:ss")
sAll = sX & "이는 " & iY & " 살이고 현재시간은 " & sTime & " 입니다"
혹은
sAll=sX & "이는 " & iY & " 살이고 현재시간은 " & Format(Now,"hh:mm:ss") & " 입니다"
MsgBox sAll
End Sub