Visual Basic에서 숫자 데이터 형식 값을 Boolean으로 변환하는 경우 0은 False가 되고 다른 모든 값은 True가 된다. Visual Basic에서 Boolean 값을 숫자 값으로 변환하는 경우 False는 0이 되고 True는 -1이 된다. 반면에 C/C++ 또는 Java는 True값을 1로 하기에 바로 수식 계산에 이용할 수 있다. 다른 언어의 이와 같은 코드를 바로 옮기면 오류가 발생할 수 있다.
설정내용을 외부에 저장하기
프로그램의 설정을 다음 번에도 사용하기 위해서는 프로그램 외부에 설정내용을 저장해야 한다. VB2005부터는 My.Settings라는 클래스를 통해서 설정내용을 저장할 수 있다.
프로젝트 디자이너에서 응용 프로그램 설정을 추가하려면
1. 솔루션 탐색기에서 프로젝트를 선택하고 프로젝트 메뉴에서 속성을 클릭합니다.
2. 설정 창을 선택합니다.
3. 설정 표의 빈 행을 클릭합니다.
4. 이름 열에 설정 이름을 입력합니다. 이름에는 공백을 사용할 수 없습니다.
5. 형식 드롭다운 목록에서 설정의 데이터 형식을 선택합니다.
6. 범위 드롭다운 목록에서 설정 범위를 선택합니다. 설정 범위는 응용 프로그램 또는 사용자가 될 수 있습니다.
7. 값 열에 설정의 기본값을 입력합니다. 값은 선택한 데이터 형식에 적합해야 합니다.
문자열 비교를 효과적으로 하기
문자열이 NULL인 경우를 판단해야 할 때가 많다. 특히 파일명을 입력받는 과정에서 아무값도 넘겨주지 않는 경우도 고려해야 한다.
일반적으로 문자열비교는 그 내용을 가지고 하지만, NULL인지 여부를 판단하는 경우에는 문자열의 길이로 판단하는 것이 훨씬 빠르다.
1 2 3 4 |
'고치기 전 If dlgFile.FileName <> "" Then txtBuildingDataFileName.Text = .FileName End If |
1 2 3 4 |
'고친 후 If dlgFile.FileName.Length <> 0 Then txtBuildingDataFileName.Text = .FileName End If |
동적 메모리 할당 ReDim에 관하여
처리해야 할 정보의 양에 맞게 변수를 선언하는 것이 프로그래밍의 기본이다.
그러나, 프로그램을 작성하다보면 처리해야 할 정보의 양이 고정되어 있지 않고 상황에 따라 변하는 경우를 자주 만나게 된다. 그렇다면 정보량이 변하는 경우는 어떻게 변수를 선언하고 관리할 것인가?
비주얼베이직에서는 정보량 변화를 수용하기 위하여 변수 크기에 대하여 동적으로 할당할 수 있는 장치를 마련하였다. 그것이 바로 ReDim이다.
그 사용법을 보면 다음과 같다.
1) 최초 변수를 선언할 때, 그 크기를 비워둔다.
1 |
Dim Data() As Single |
보통 배열을 선언할 때, 그 크기를 “1 To 10″과 같이 그 크기를 명시하지만, 여기서는 크기를 비워두는 것이 핵심이다.
2) 상황에 따라 배열의 크기를 설정한다.
1 2 3 4 |
ReDim Data(10) As Single ..... ReDim Preserve Data(100) As Single ReDim Preserve Data(NumberOfData) As Single |
상황에 따라 10개가 필요하면 10을 100개가 필요하면 100을, 아니면 특정 변수만큼 필요하면 해당 변수(여기서는 NumberOfData)를 넣어서 그 크기만큼 변수를 만들 수 있다.
이 방법을 사용하는 데 있어서 유의할 것도 있다.
1) 프로그램의 속도가 느려진다.
특히 ReDim을 루프와 같이 반복 계산되는 곳에 두면 프로그램의 속도는 눈에 띄게 느리게 될 것이다. 따라서, 변수의 양이 루프 밖에서도 알 수 있다면 꼭 밖에 두는 것이 현명한 처사이다.
2) 다차원배열의 동적할당
다차원 배열의 동적할당에 있어서는 맨마지막 차원에 대해서만 적용된 것을 명심하자.
1 2 3 4 5 6 7 8 |
Dim MultiData() As Single .... ReDim MultiData(NumberOfData,3,4) As Single ReDim MultiData(NumberOfData+1,3,4) As Single '=> 오류발생 ReDim MultiData(3,4,NumberOfData) As Single ReDim MultiData(3,4,NumberOfData+1) As Single '=> 정상작동 |
List와 Dictionary 클래스
.NET Framework v1.1이하에서는 ArrayList와 HashTable을 이용하여 콜렉션을 관리하였다.
ArrayList는 항목이 중복될 수 있는 콜렉션을 관리하며 추가된 순서(인덱스)가 중요한 관리대상이다. 예를 들어 벽체의 구성은 벽돌, 단열재, 방습층, 벽돌 등과 같이 중복되는 재료가 있는 경우이기 때문에 ArrayList를 사용하는 것이 좋다.
HashTable은 항목이 중복될 수 없는 콜렉션을 관리하며 중복되지 않는 키(key)가 중요한 관리대상이다. 예를 들어, 건축재료 전체 목록을 관리하고자 한다면 이름을 키(key)로하여 각 재료의 물성치를 관리할 수 있다.
이 둘을 안전하게 사용하려면 자료형(data type)을 항상 검토하여야 한다.
저장할 자료형을 정하여, 이와 다를 경우 코딩시부터 오류를 발생시키도록 강력한 자료형검토를 보장하는 클래스가 v2.0에서 추가되었다.
Generic.List와 Generic.Dictionary가 바로 새로 추가된 클래스들이다.
1 2 3 |
변경전[.NET Framework v1.1] Private m_Elements As ArrayList |
1 2 3 |
변경후[.NET Framework v2.0] Private m_Elements As Generic.List(Of Node) |
———
1 2 3 |
변경전 [.NET Framework v1.1] Private m_Elements As HashTable |
1 2 |
변경후[.NET Framework v2.0] Private m_Elements As Generic.Dictionary(Of String, Pipe) |
*주의 : .NET Framework v2.0에 Generic이 추가된 것임. 기존의 ArrayList와 HashTable은 계속사용할 수 있음
Single.Parse()처럼 문자열을 객체로 만드는 방법
Single.Parse()는 문자열을 읽어서 그 값을 Single형 값으로 바꾸어준다.
1 |
Dim myValue As Single = Single.Parse("36.5") |
myValue는 단정도 실수인 36.5가 된다.
이 방법은 파일에서 문자열을 읽어온 후에, 그 값을 전환하는데 있어서 매우 유용하다.
같은 방법으로 문자열을 읽어서 특정 객체를 생성시키려면 다음과 같이 하면 된다.
<작성하고자 하는 클래스>
1 2 3 4 5 |
Public Class Person '클래스명 = Person Private m_Name As String Private m_Age As Short ...<중략>.... End Class |
1) String형 매개변수를 갖는 생성자를 선언한다.
그리고, 생성자 코드 안에 문자열을 해석할 InternalParse를 호출한다.
1 2 3 |
Public Sub New(ByVal myText As String) InternalParse(myText) End Sub |
생성자 내용을 간단하게 하는 것이 좋다.
다른 함수(초기화메소드)를 이용하면, 인스턴스 변수에 대한 초기화를 생성자 이외에서도 할 수 있다.
2) InternalParse() 메소드를 작성한다.
1 2 3 4 5 6 7 8 |
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 |
3) Parse() 메소드를 작성한다.
이 때, 이 클래스의 인스턴스 없이 Parse()메소드를 호출하기 위해서는 Shared를 선언한다.
1 2 3 |
Public Shared Function Parse(ByVal myText As String) As Person Return New Person(myText) End Sub |
4)사용법
1 |
Dim mySon As Person = Person.Parse("김창선, 4") |
이름은 ‘김창선’이고 나이는 ‘4’인 mySon 인스턴스가 생긴다.