본문 바로가기

Window Programming/VB

VB :: ActiveX 구성요소의 작성

http://yatoyato.tistory.com/235
클래스와 개체
모든 개체는 각각의 클래스로부터 생성된다. 우리가 사용하는 command1개체는 commandButton클래스로부터 만들어지고, text1개체는 textBox클래스로부터 만들어진다. 이와 같이 컨트롤형태로 제공되는 개체를 컨트롤개체라고 한다. 그리고 visual basic에서는 컨트롤들을 그려넣는 것만으로도 개체의 생성이 가능하다.

클래스는 개체를 나타내는 설계도라고 할 수 있다. 누구든 클래스모듈을 사용해서 클래스를 설계하면 자신만의 개체를 생성할 수 있다. 생성된 개체는 property와 method를 가지고 있으며, 이를 통해서 맡은 업무를 수행하게 된다.

클래스모듈 사용
visual basic에서는 클래스모듈을 사용하면 다음과 같은 것들이 가능해진다.

개체를 생성할 수 있다.
작성한 개체는 공유가 가능해진다.
activeX컨트롤, activeX dll, activeX exe, activeX 도큐먼트 등 각종의 컴포넌트의 작성이 가능하다.
실제로 클래스는 [표준 exe]프로젝트에 추가하는 형식으로 처음에는 작성이 된다. 즉, [프로젝트-클래스 모듈 추가]메뉴를 선택하면 된다.

간단한 예를 통해 속성의 의미를 파악해 보도록 한다.
가령, 1부터 임의의 수까지 더하는 개체를 설계해 보도록 한다. 막연한 생각으로 일단 입력된 수를 받는 속성이 하나 있어야 할 것이고, 계산된 수를 저장하는 속성(property)이 하나 있어야 한다. 마지막으로 계산을 하는 method가 있을 것이다.

클래스에서 속성을 추가하는 방법으로는 크게 두가지가 있다. 하나는 변수를 선언해 주는 것이고, 다른 하나는 property(속성)프로시저를 사용하는 것이다.

public변수를 사용한 속성 추가하기
공용변수를 사용한 속성추가는 매우 간단한 방법으로 public변수를 선언해주어 외부에서 공용변수를 사용할 수 있는 방법이다. 이 방법은 외부에서 사용하는 것을 전혀 통제할 길이 없기 때문에 자칫 프로그램이 복잡해지고 길어질 경우 오류의 확률이 메우 높게 된다. 다음은 공용변수를 사용한 속성추가의 예이다.

public myData as integer    'class 1일 경우

위 코딩의 경우, myData가 class1에서 속성으로 추가된 것이다. 일반적으로는 class작성시 변수를 private로 선언을 해서 안전성을 추구하게 된다.

속성 프로시저를 통한 속성 추가하기
class에 속성을 추가하기 앞서서 우리는 여기에서 사용될 property let문과 property get문에 대해서 알아야 한다.

property let문
속성에 값을 할당하는 property let프로시저의 형태를 구성하는 프로그램이나 인수, 이름을 선언한다. 구문과 구성요소는 다음과 같다.
[public | private] [static] property let 변수들 ([인자들.] 값)
    [문]
    [exit property]
    [문]
end property

public
선택. property let프로시저는 모듈의 다른 모든 프로시저에서 엑세스할 수 있음을 표시한다. option private문을 포함하는 모듈에서 사용하는 경우 그 프로시저를 프로젝트 밖에서는 사용할 수가 없다.
private
선택. 선언된 모듈에서만 property let프로시저가 다른 프로시저를 엑세스할 수 있음을 나타낸다.
static
선택. property let프로시저의 지역 변수값이 프로그램의 호출간에도 유지됨을 나타낸다. static속성은 프로시저 내에서 사용할 때도 property let프로시저 밖에서 선언한 변수에 영향을 주지 않는다.
변수
필수. property let프로시저의 이름은 표준변수 이름짓기 규칙에 따르며, 예외적으로 같은 모듈내에서 property get프로시저나 property let프로시저같은 이름이 사용가능하다.
인자들
필수. 호출할 때 property let프로시저로 전달되는 인수를 나타내는 변수목록이다.
property let프로시저 내에서 각 인수의 이름과 데이터형식은 대응하는 property get프로시저에 대응되는 인수와 같아야 한다. 마지막 인수는 식의 오른쪽 속성에 할당된 값으로 최종인수의 데이터형식은 대응하는 property get프로시저의 반환값과 같아야 한다.

필수. 속성에 값을 지정하기 위한 값을 포함하는 변수. 프로시저가 호출되었을 때 이 인수는 호출식의 오른쪽에 표시된다. value의 데이터형식은 반드시 대응하는 property get프로시저의 반환형식과 동일해야 한다.

선택. property let프로시저 내에서 실행되는 모든 그룹의 문이다.
모든 property let문은 프로시저가 정의한 하나 이상의 인수를 정의해야 한다. 이 인수는(하나 이상의 경우 최종인수) property let문으로 정의한 프로시저를 호출할 때 할당될 속성의 실제값을 갖는다. 이 인수는 앞의 문의 value에 의해 참조된다. 선언하지 않은 public이나 private, property프로시저 등의 기본값은 public이다. static을 사용하지 않을 경우, 지역변수의 값은 프로그램 호출시에 보존되지 않는다.

모든 실행가능한 프로그램은 프로시저에 두어야 한다. 다른 property, sub, function프로시저에 property let프로시저를 선언할 수 없다. exit property문은 property let프로시저로부터 빠져나갈 때 사용한다. 이때 프로그램은 property let프로시저 다음의 문장을 실행하게 된다. property let프로시저에서 exit property문은 몇변이고 사용할 수 있다.

property get문
속성값을 갖고 property프로시저를 이루는 프로그램이나, 인수이름을 선언한다.
[ public | private ] [static] property get 변수들 [(인자들)] [as 데이터형]
    [문]
    [변수명 = expression]  [exit property]
    [문]
    [변수명 = expression]
end property

기본적인 구성요소는 property let문과 유사하다. 즉, 외부 프로그램의 입장에서 값을 가져오기 위해서는 property get을 통해야하며, 외부프로그램이 값을 넣으려고 하면 property let을 사용을 한다고하면 이해가 될 것이다.
그럼, 위의 구문을 좀더 구체적으로 이해하기위해 다음 예제코드(새로 추가된 class모듈에 작성)를 본다.

Private mMyData As Integer  '변수를 private로 선언

'속성을 사용해서 property를 선언한다.
'외부프로그램이 값을 가져가기위한 MyData속성
Public Property Get myData() As Long
    myData = mMyData
End Property

'외부에서 값을 넣기위한 MyData속성
Public Property Let myData(value As Long)
    mMyData = value
End Property

다음 코드는 작성된 class가 form1에서 사용이 되었다고 가정했을 때의 예제이다.

Private Sub Form_Load()
    'class1이라는 이름으로 개체가 생성되었을 경우
    'MyData의 값을 넣는 속성을 이용함(let을 이용)
    Class1.myData = 44

    'myData값을 불러오는 속성을 이용함(get을 이용)
    k = Class1.myData
    'k에는 class1을 통해서 myData가 가지고 있는 get값이 들어간다.
End Sub

위의 경우는 읽기와 쓰기가 모두 되는 경우인데 반해서 계산한 값이 변하면 안되는 경우가 있다. 오직 계산에 의해 산출된 결과면을 출력해야 할 경우 읽기전용속성을 사용한다.

클래스에 메서드 추가하기
만들고자 하는 개체에 속성을 추가한 후에 어떤 일을 수행할 것인지에 관해서 메서드(method)를 추가해야 한다. 메서드는 public으로 작성되어서 외부로 호출될 경우에 필요한 역할을 수행하게 된다.

Public Sub compute()
    Dim i As Long
    Dim total As Long
    total = 0

    For i = 1 To mMydata
        total = total + i
    Next i

    mResult = total
End Sub