PROGRAMMING WORKSHOP

VSTO_12 | 크래스에 집착하는 이유

.Net FrameWork를 좀더 적극적으로 활용하려면
크래스모듈의 생활화가 되어야 한다는 것이 전제조건이 된다
엑셀프로그래밍은 정보처리가 주 목적이라고 해도 과언이 아니다
또한 엑셀을 사용하여 VSTO소루션을 만든다고 할때
대개의 경우가 정보처리를 하는 도구가 주 목적일 것이다
정보처리를 위한 .Net FrameWork에서의 다양한 도구들이 있다
이것을 원활히 사용하려면 시트상에 어떤 데이타테이블이 있다고 할때
이것을 .Net FrameWork들이 처리할수 있는 형식으로 전달하여야 하고
그 형식의 대표적인 것이 Object화하여 전달해주는 것이다

에이..!@# 그냥 엑셀시트에서 열방향으로 순환하면서 찾아서 이러 저러하게
처리하거나..
Find이나 FindNext메소드등으로 찾아서 처리하거나
엑셀이 제공하는 정렬이나, 부분합이나, 휠터등을 사용하지..뭐..
그렇게만 사용한다면 복잡하게 VSTO에 들어와서 법썩을 떨 필요가 없다
단지..코드를 안보이게 보안상의 문제만 처리하고 싶다!!
그렇다면 그래도 좋겠지만..
순수하게 엑셀만으로 소루션으로 만들때보다 정보처리자체가
엑셀의 순수기능으로 처리한다면 속도가 엄청 버벅거린다
그럴수밖에...
엑셀하나만 해도 몸집이 큰데..VSTO의 이런 저런 부속들을 달고 돌아가는
엑셀이 속도의 효율이 별로가 된다

.Net FrameWork가 제공하는 기술들을 활용하려면
.Net FrameWork가 일을 할 정보의 형식을 만들어 주면 되는것인데..
조금 노력하여 그렇게 하는 것이 좋다

앞페이지에서 이야기했다시피..
이벤트프로시져에 전달하는 매개변수도 오브젝트형식으로 만들어서 보내는
크래스, 오브젝트를 무지 좋아하는 곳이 이 곳이다!!!

쌤플을 하나 만들어 보자
아무튼 별 쓰잘데 없는 것도 크래스를 만들어서 사용한다
물론 그냥 VBA에서와 같이 모듈시트에 프로시져나 함수나 만들어서
사용해도 된다..
그러나 .Net FrameWork의 자원을 활용은 못하고 그냥
Visual Basic의 언어가 제공하는 기능만(VBA나 같은 기능정도)만 활용하는데 그칠것이다

ThisWorkBook.vb 를 코드보기 모듈시트를 열면
아래와 같이 두개의 이벤프르시져가 있을 뿐이다
크래스모듈시트를 별도로 삽입하여 사용할수도 있지만
그냥 약식으로 같은 ThisWorkBook모듈의 아래에 크래스를 만들어 버릴수도 있다

Public Class ThisWorkbook

    Private Sub ThisWorkbook_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
        Dim oX As New myDatas
        Dim oRandom As New Random
        For ix As Integer = 1 To 10
            oX.AddNew(oRandom.Next(10), oRandom.Next(10))
        Next
        oX.ReadDatas()  
    End Sub

    Private Sub ThisWorkbook_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown

    End Sub
End Class

Public Class myData
    Private iX As Integer
    Private iY As Integer
    Sub New(ByVal iMyNewX As Integer, ByVal iNewY As Integer)
        iX = iMyNewX
        iY = iNewY
    End Sub
    ReadOnly Property ReadData() As String
        Get
            Return Return iX.ToString & "X" & iY.ToString + "=" + (iX * iY).ToString
        End Get
    End Property
End Class

Public Class myDatas
    Private oX As New List(Of myData)
    Sub AddNew(ByVal iMyX As Integer, ByVal iMyY As Integer)
        oX.Add(New myData(iMyX, iMyY))
    End Sub
    
    Dim sX As String = ""
    For Each oZ As myData In oX
        sX += oZ.ReadData & Chr(13)
    Next

    oX.Reverse()
    
    sX += Chr(13) + Chr(13) + "Reverse 메소드로 순서를 뒤집은 상태" + Chr(13) + Chr(13)
    For Each oz As myData In oX
        sX += oz.ReadData & Chr(13)
    Next
    MsgBox(sX)
End Class

VBA에서 함수나 프로시져 작성하듯이
흔하게 만들어서 사용하는것이 크래스와 오브젝트이다
Rand함수같은 것도 Random이라는 크라스를 사용하니,
크래스와 오브젝트판이다..

단순한 문자열 정보나 Integer..숫자정보마저도 오브젝트화하여 사용한다

iX.ToString & "X" & iY.ToString + "=" + (iX * iY).ToString

Visual Basic언어적으로 처리한다면
Cstr(iX) & "X" & Cstr(iY) & "=" & Cstr((iX*iY)) 할 것인데..
위와 같이 String오브젝트, Integer오브젝트등으로 속성으로 처리하지 않는가??? 물론 Visual Basic 언어적인 함수로도 처리가 된다
언어는 언어대로 있고 .Net FrameWork의 자원은 자원대로 사용하면 되고..
VBA 는 프로그래밍언어이고
자원의 엑셀의 오브젝트를 활용하는 VBA프로그래밍을 좀더 확대해서
생각하면 될 것이다

왜 오브젝트화에 집착하는가???
예를 들어 문자열정보를 다루는데 별도로 관리하기보다는
문자열타입의 정보자체를 오브젝트화하여 자체적으로 문자의 처리를
하게 된다면 번거롭지 않고 관리하기가 쉽지 않은가??
별도로 다른 공장에 문자열정보를 보내서 뚝딱거리고 만들어서 갖여 오느니
문자열정보..자체가 공장까지 갖고 있어라..!!!!라는 의미인 것이다
문자열 정보를 3번째문자에서 끊어서 두개로 만들어라??!!!라고 한다면
별도의 함수를 만들고 법썩을 떨어야 하지만
그냥 문자열정보자체에서 메소드나 속성을 사용하면 되는 것이다

아무튼..
위에서 보다 시피 두개의 [사용자정의 크래스]를 만들었다
하나는 myDatas 라는 크래스고
또 하나는 myData라는 크래스고..
두개의 크래스를 만들었다

위의 내용을 실행하면 아래와 같이 통합문서가 열리면서 메시지박스가
나타나게 된다



흠..별것 아니군..
그렇다 별것 아니다
그냥 VBA로 뚝딱거려도 만들수 있다
한번 VBA로 만들어 보시기 바란다
그런데 주욱 만들었던 정보를 다시 뒤집으려면
뭔가 순환도 하고 뭐 법썩을 떨어야 할 것이다

그러나 .Net FrameWork의 데이타 관리를 위한
System.Collections.Generic.List(Of T)
의 파워를 맛을 보면 보는 시각이 달라진다
배열같기도 하고 집합체같기도 한 List오브젝트가 갖고 있는
다양한 메소드나 속성중에서 Reverse라는 메소드만 건들면
목록이 뒤집어 진다

.Net Framework의 System.Collections.Generic 이하의 다양한
정보를 다루는 도구들을 섭렵해 보게 되는 것이다
이런 .Net FrameWork의 자원은 VB에서만 사용하는 것이 아니고
C#을 위시하여 Visual Studio의 다양한 프로그래밍언어에서 접근하여
공동으로 사용하는 자원이니..
언어의 장벽이 없어졌다고 하는 것은 그런 의미가 되는 것이다

좀더 구체적으로 이야기 해보자 정보를 집합적으로 관리하기 위하여
VBA나 VB에는 그냥 배열이라던가, Collection 이라는 것 밖에 없다
그리고 배열이나 Collection은 단순히 정보를 담고만 있을 뿐이지
어떤 자체내에서 작업을 하는 메소드라던가..속성이 없다
물론 Collection오브젝트...집합체 오브젝트에는 Delete,Add같은 메소드나
간신히 있을 뿐이다

그러나 .Net FrameWork 로 가면 상황이 다르다..
한마디로 정보를 다루기 위한 도구의 천국이고..
참 기발난 생각들을 하는 구나...
라는 영감과 자극을 얻을 수 있다

그것을 차근 차근 살펴보도록 하자

***[LOG-IN]***