[강좌] 비주얼 베이직 클래스가 쉬워진다 ③

일반입력 :2002/10/11 00:00

최지환

다음 코드를 봅시다.

Option Explicit

Public Col As New Collection 'MDI폼에다 지정합니다.

Private Sub mnuFileOpen()

Dim FileStr As New NewFileOpen

Static I As Integer

I = I + 1

FileStr.Caption = Untitle & I

Col.Add FileStr

FileStr.Show

End Sub

보시기에 어때요? 아주 쉬운 로직이죠? Col이라는 이름의 컬렉션을 MDI폼에다 모듈처럼 사용할 수 있도록 선언합니다. 그리고 우리는 메뉴바의 파일 오픈 메뉴를 만들어 거기다가 위의 코딩을 선언합니다. NewFileOpen이란 문서를 열기 위해서 만들어 놓은 차일드 폼의 이름입니다. 사용자가 만든 폼도 하나의 개체로서 개체 변수의 형태로 선언을 할 수 있습니다. 그런 후에 우리는 폼들의 구분을 주기 위해서 I를 선언합니다.

이것은 Static으로 선언을 해서 프로시저가 끝이 나도 변화를 받지 않습니다. 왜냐하면 우리가 여러 개의 폼을 선언을 하는데 그 타이틀이 전부 같아버리면 곤란하죠? 이미 차일드 폼으로 선언된 File_Str은 NewFileOpen이라는 폼과 같은 역할을 하게 됩니다. 그래서 그 폼의 타이틀을 정해줍니다. 그런데 아무리 이렇게 정해서 불려져 있어도 작업이 끝나고 폼이 사라져 버리면 곤란하죠? 그래서 이것을 계속 고정시킬 필요가 있습니다. 우리는 이미 Col이라는 컬렉션 개체를 모듈급으로 선언했습니다. 그럼 드디어 그 컬렉션 개체를 사용할 때가 왔습니다.

Col.Add FileStr

이라는 구문을 통해서 컬렉션 개체를 넓혀서 기억하게 만들어줍니다. 그리고 우리는 볼 수 있도록 그 폼을 보여줍니다. 그런데 이 FileStr은 왜 안사라지느냐고요? 그것은

Col.Add FileStr이라는 구문에 의해서 FileStr개체가 Col에 귀속되어 버렸으니까 그렇습니다. Col은 현재 아무데서든 항상 사용이 가능하게 선언돼 있습니다.

이미 FileStr은 지역적 전역 변수라 할 수 있는 Col에 저장이 되고 만 것입니다. 하지만 위의 구문이 없이 그냥 보여주셨다면 폼은 사라지고 말 것입니다. 그것은 저도 테스트를 해봐야 할 듯 합니다. 이것은 이론상... 이처럼 컬렉션 개체는 잘만 사용한다면 상당히 쓸 만 할 것입니다. 주의할 것은 컬렉션도 자신의 범위를 벗어나면 소멸된다는 것입니다. 그리고 참조에서 Nothing으로 선언하면 사라집니다. 그 구문은 이렇게 되겠죠?

Set Col = Nothing

참조란 Set 절을 의미합니다. 컬렉션 개체는 Variant의 타입과 같은 형식을 갖고 있습니다. 컬렉션의 항목들은 Variant 형식으로 저장합니다. Variant는 16바이트를 고정적으로 사용하기 때문에 리소스를 생각한다면 Variant를 배열로 해서 사용하는 것이 더 좋다고 할 수 있습니다. 하지만 지난 연재에서 배운 바와 같이 Variant는 값을 리턴하거나 하지 않기 때문에 그리고 다른 값을 대입시킨다면 바로 그 안의 것들은 사라지고 맙니다. 안전성과 관리 그리고 빠른 코딩을 위해선 컬렉션을 사용하는 것을 더 권합니다. 이상입니다.

컬렉션도 성질이 고약하다고요? 우선 다음의 코드를 봅시다.

Dim I As Long

For I = 1 To colCompany.Count

colCompany(I).Rate = colComapny.Rate * 1.1

Next

위의 코딩을 보면서 대부분은 이게 뭐야? 하는 의아스러움을 떨치지 못할 것입니다. 간단히 설명하자면 어떤 단위 대상의 전부에게 어떤 값을 10% 올려주는 로직입니다. 이런 로직을 사용하려면 조금 더 나중에 나오는 강좌도 들어야 할 필요가 있습니다.

Company는 짐작하신 것처럼 컬렉션입니다. 클래스를 만들고 그런다면 이렇게 상당히 쉬운 로직도 만들 수 있습니다. Rate는 실수 값을 갖고 있는 형태입니다. 이것을 데이터베이스라고 한다면 우리가 갑자기 전 항목에 대해 가격을 10% 인상해야 하는 경우가 있다면 이런 로직을 사용하게 될 겁니다. 우선 이것은 맛보기겠죠? 어서 빨리 저런 형태의 로직을 만들기 위해서 열심히 공부해야겠죠?

하지만 이것이 컬렉션이 선언되어서 만들어진 것이라면 더 간단하고도 빠르고 효율적인 방법이 있습니다. '아니? 이것도 상당한데 이보다 더한 게 있다고? 아! 그리고 이미 설정되어 있는 비베의 Object 중에 위의 형태를 사용할 수 있도록 되어있는 것들도 있습니다. 한 번 찾아보시길 바랍니다. 그럼 코딩갑니다.

Dim I As Company

For Each I In colCompany

I.Rate = I.Rate * 1.1

Next

어떻습니까? 잘 모르시겠다고요? 앞의 것은 계속 더하는 연산을 수행하는 작업을 해주고 자신을 번지를 통해서 찾아가는 작업을 합니다(번지를 대입시켜서). 그러므로 여기서 나오는 속도의 손실은 작지만 그래도 상당합니다.

왜냐하면 컬렉션이 데이터베이스였고 그 데이터 양이 몇만 건이나 된다고 한다면 그 손실은 감당하기 힘들 정도가 되죠. 허나 아래의 코딩은 그렇지 않습니다. 아마도 현재까지는 제가 아는 한도 안에서 가장 빠르다고 할 수도 있을 듯 하군요. 여기서는 For Each 구문을 사용했습니다. 왜냐하면 컬렉션은 선택적 인수이기 때문에 다른 것처럼 수시로 증가하고 그럴 필요가 없습니다.

또한 우리가 알고 있는 것 중에 가장 빠르다고 생각되는 것이 어떤 것인지요? 제가 보기에는 Index가 가장 빠른 듯 합니다. 그러나 For Each 구문은 그것보다 빠릅니다. 여러분들도 아마 빠른 검색을 할 경우 Seek문을 사용할 것입니다. 허나 이것은 Index를 사용하는 것입니다. 그것보다 더 빠른 위의 구문들을 사용한다면 거의 환상적이겠죠?

그런데 왜 이런 걸 보이냐고요? 그것은 우선 두 가지 목적이 있습니다. 우선은 학구열을 불태우기 위해서고, 또 하나는 컬렉션도 성질이 있다는 것입니다. 그 성질 중에 기본적으로 쓰이는 것을 나열해 보도록 하겠습니다.

이상이 가장 기본적인 것입니다. 컬렉션은 아마 잘 살펴보면 위의 Rate가 있는 것들이 있습니다. 살펴보시고 사용하세요. 여기에 안나온 것 중 하나가 이미 보여졌죠? Index입니다.이미 colCompany(I) 이런 식으로 인덱스를 사용했습니다. @

비주얼 베이직 클래스가 쉬워진다 ②

비주얼 베이직 클래스가 쉬워진다 ①