PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

.NetFrameWork | VB 문법..Shared|OverLoads|Inherits|Shadows

크래스모듈등의 사용이 빈번하게 되니..
VBA와 다른 문법이라기 보다는 VBA에는 없는 낯선것들을 살펴보자
다른 코너에서 두서 없이 이야기하였지만 ..
조금 더 살펴보는 것이 좋을 것 같다

Shared라는 키워드가 종종 눈에 뜨일 것이다

' 크래스모듈시트를 일일이 만들지 않아도
' 일반 모듈시트에 크래스모듈을 만들수 있다 아래와 같이

Module modMain

' 크래스모듈
Public Class clsTest
    Sub showMsgBox()
        MsgBox("일반적인 개체의 프로시져호출")
    End Sub
End Class

' 또 다른 크래스
Public Class clsTest_1
    Shared Sub showMsgBox()
        MsgBox("개체의 Shared 프로시져호출")
    End Sub
End Class
End Module

두번째 크래스의 프로시져앞에 Shared 라는 키워드가 붙어 있다
이것의 역할이 무멋일까?
편리한 키워드다
일반적으로 크래스모듈속의 함수나 프로시져에 접근하려면

Dim oObj As New clsTest
oObj.showMsgBox()

와 같이 개체를 생성하고 하여야 한다
하지만 Shared가 붙어있는 함수나 프로시져나 속성은 모두
그냥 부르면 된다 아래와 같이,
개체생성없이 그냥 크래스모듈명.프로시져명으로 직접호출

clsText_1.showMsgBox()

이번에는 OverLoads라고 하는 키워드

Public Class clsTest_1

  Shared Sub showMsgBox()
      MsgBox("개체의 Shared 프로시져호출")
  End Sub

  Overloads Shared Function Max(ByVal dblA As Double, ByVal dblB As Double) As Double
      Return IIf(dblA > dblB, dblA, dblB)
  End Function

  Overloads Shared Function Max(ByVal strA As String, ByVal strB As String) As String
      Return IIf(strA > strB, strA, strB)
  End Function

  Overloads Shared Function Max(ByVal dteA As Date, ByVal dteB As Date, ByVal datC As Date) As Date
      Dim datTemp As Date
      datTemp = IIf(dteA > dteB, dteA, dteB)
      Return IIf(datTemp > datC, datTemp, datC)
  End Function
End Class

아마도 위와 같이 Max라는 함수이름을 같이 모듈시트에 입력을 한다면
VBA에서는 담박에 에러가 날 것이다
그러나 위와 같이 OverLoads라는 키워드를 붙이면 모두 사용할수 있는 것이다
같은 이름의 함수에 정보의 타입을 어느 것은 날짜를
어느 것은 숫자를 어는 것은 문자를 받아서 처리하게 ..즉 기능은
같은데 데이타타입은 다르거나, 이름은 같은데 연산방법을 달리 하거나

그리고 세번째 Max함수는 매개변수가 다른 것과 달리 3개 였다
이럴때는 OverLoads를 사용하지 않아도 같은 이름으로 사용할 수 있다



VBA에는 없지만 모든 개체지향언어는 상속(Inheris)이라는 개념이 있다
즉 이미 만들어 놓은 개체를 또 만들 필요는 없는 것이다
A라는 자동차모델을 만들어 놓으면 즉 개체를 만들어 놓으면
B라는 자동차모델을 만들때 A에 이미 있는 것을 다시 만들 필요는 없다
무언가 있는 개체에 기능을 추가하는 것일 것이다
이렇게 이미 작성된 크래스모듈을 그대로 다시 재사용하여 다른 기능을
좀더 추가하겠다는 생각이 들때 A라는 크래스를 그대로 상속(Inerits)를
받는 다는 개념이다

Public Class Car_A
    Public Sub Run()
        Msgbox "달린다"
    End Sub
End Class

Class Car_B
    Inherits Car_A   '#### Car_A 라는 크래스의 내용을 상속받겠다는 것...
    Public Overloads Sub Walk(ByVal Speed As Double)
        MsgBox Speed & "값의 속도로 달린다"
    End Sub
    
    ' 다른 기능의 메소드들...추가..
End Class

위와 같이 크래스모듈 원형을 하나 만들고 상속받으면서
새로운 개체를 만들면서 기능이 좀더 구체화되게 되는 것이다
아무튼 프로그래밍세상은 사람 사는 세상과 똑같다고..보는 눈을
갖으면 좋을 것이다

아래와 같이 크래스모듈을 작성하고

Publci Class myClass
'''''''''' 아무내용이 없어도
End Class

위의 크래스를 생성하여

Dim oX As New myClass

아래와 같이 사용하면 ToString외에 몇개가 나타나는 것을
볼수 있다

oX.ToString

이것은 시스템적으로 범용 Object의 내용을 상속받고 있는 것이다
모든 사용자정의 개체는 이것을 상속받아서 사용하는 것!!!

oX.ToString을 불러서 사용하면 해당 개체가 어떤 개체인지
설명하는 문자열정보를 볼수 있는 것

이 페이지에서 낯선 것들이 나온다고 그렇게 걱정 할 것은 없다
대개의 VBA능력이면 커버되는 것들이지만..
알아 두면 나쁠 것이 없는 것들이다

ToString이라는 속성은 어떤 사용자정의 개체를 만들어도
나타나는 상속받은 속성인 것이다
그런데 ..사용자정의 개체를 만들면서
ToString이라는 것을 다른 용도로 사용하고 싶을수도 있을 것이다
내가 만든 개체에서는 ToSting이 내가 만든개체만의 값을
주는 것으로 만들고 싶다는 것..
당연히 그런 욕구가 있을 것이고 그래서 또 표시하는 단어가
하나 생기게 된다
Shadows라고 하는 것

Public Class clsTest_3
    Shadows Function ToString() As String
        Return "this is my first object"
    End Function
End Class


Public Class clsTest_4
    ' 아무내용도 없는 빈껍데기
End Class


'' 위와 같이 크래스모듈을 두개 만들고 아래와 같이 생성호출해보면
Private Sub Button3_Click(ByVal sender As System.Object, _
				 ByVal e As System.EventArgs) Handles Button3.Click
    Dim oX As New clsTest_3
    MsgBox(oX.ToString)
    Dim oY As New clsTest_4
    MsgBox(oY.ToString)
End Sub
''
''  시스템개체에서 상속받은 ToString의 값과
''  Shadows 라는 키워드를 붙인 메소드에서 값이 다르게 나타남을 알게 된다

즉..주는대로 안먹구..나는 다르게 해서 먹겠다는 것
그럴때 Shadows로 기존의 상속을 막아 내는 셈이다
뭐가 이렇게 복잡하냐..아래의 그림과 같이 수많은 개체들을
관리하여야 하는 .NetFrameWork의 족보의 일부를 잠깐보면



앞에서 우리가 사용하였던 DataGridView같은 콘트롤도 하나의
크래스에서 만들어낸 개체인 것이다
이것을 쌩짜로 만든 것이 아니고 유사한 내용을 상위 크래스에서
만들고 이것을 상속받아서 해당개체의 특징적인 기능만 추가하여
나가는 셈인 것이다
위의 그림을 조금 설명한다면
.NetFrameWork의 크래스 라이브러리는 수많은 크래스로 구성된다
DataGridView의 족보를 쫓아서 올라가 본다면

최상위는
System.Object 로 부터 시작하여
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Windows.Forms.Control
        System.Windows.Forms.DataGridView

와 같은 관계를 구성하고 있다는 것..
그러니 NetFrameWork와 같은 방대한 라이브러리에서 필요한 것이니..
엑셀소루션정도에서 확장한 VSTO 소루션까지 가면서 사용하는
사용자정의개체정도에서는 별로 이런 구성을 해가면서 할 일은 없다
그러나 이런 구조를 어느 정도만 .NetFrameWork의 자원을 만껏 활용할 수있는 것이다

사용자정의 개체를 만들때 System.Object의 개체에서 ToString같은 것이 자동
상속된다는 정도를 알고 있으면 되는 셈이다

위의 것을 실제로 간단하게 어떻게 사용하는지 보자..
크래스모듈이 서로 상속을 해 나가는 것을 사용해 본다

'####################################
'# [사람]이라는 크래스 모듈
'####################################
Class 사람
    Private 이름 As String
    Private 나이 As Integer

    Public Sub New(ByVal Name As String, ByVal Age As Integer)
        Me.name = Name
        Me.age = Age
    End Sub
   
    Property name()
        Get
            Return 이름
        End Get
        Set(ByVal value)
            이름 = value
        End Set
    End Property
    Property age()
        Get
            Return 나이
        End Get
        Set(ByVal value)
            나이 = value
        End Set
    End Property
End Class

'########################################################
'# 위의 [사람] 크래스를 상속받아서 [운동선수]라는 크래스모듈
'########################################################
Class 운동선수
    Inherits 사람

    Private 운동종목 As String
    Private 소속팀 As String
    
    Public Sub New(ByVal name As String, ByVal age As Integer, _
    ByVal sport As String, ByVal team As String)
        MyBase.New(name, age)
        Me.team = team
        Me.sport = sport

    End Sub
    
    Property team()
        Get
            Return 소속팀
        End Get
        Set(ByVal value)
            소속팀 = value

        End Set
    End Property
    Property sport()
        Get
            Return 운동종목
        End Get
        Set(ByVal value)
            운동종목 = value

        End Set
    End Property
End Class

'##################################################
'# 위의 [운동선수]라는 크래스모듈을 상속받아서 [야구선수]라는 크래스모듈
'##################################################

Class 야구선수
    Inherits 운동선수

    Private 안타회수 As Integer
    Private 도루회수 As Integer

    Public Sub New(ByVal name As String, ByVal age As Integer, _
    ByVal sport As String, ByVal team As String, ByVal hit As Integer, ByVal steal As Integer)
        MyBase.New(name, age, sport, team)
        Me.안타회수 = hit
        Me.도루회수 = steal
    End Sub
    Public Property hit()
        Get
            Return 안타회수
        End Get
        Set(ByVal value)
            안타회수 = value
        End Set
    End Property
    Public Property steal()
        Get
            Return 도루회수
        End Get
        Set(ByVal value)
            도루회수 = value
        End Set
    End Property
End Class

사람이라는 크래스는 가장 기본이 되는 크래스가 될수 있을 것이다
사람이라는 크래스가 갖고 있는 [이름]과 [나이]는 다른 크래스모듈에서
기본적으로 모두 사용하는 속성인 것이다



그림과 같이 상위 크래스의 공통으로 사용될수 있는 자원을
상속받으면 하위 크래스에서 복잡한 자원을 또 만들 필요가 없는 것
이것이 개체의 상속이라는 점을 상식적으로 아시면 된다

위의 크래스모듈을 활용하여 아래의 그림과 같이 DataGridView에
정보를 담아 보도록 하자
위와 같이 개체를 만들어서 DataGridView와 같은 집합적으로정보를
받아들이는 콘트롤의 DataSource속성에 직접연결 활용할 수 있다는 점!!



Dim oX As New 야구선수
oX.name = "너구리"
oX.age = 19
oX.sport = "야구"
oX.team = "무궁화"
oX.hit = 28
oX.steal = 19
oList.Add(oX)

와 같이 하는것을 아래와 같이 간단히 한줄로 처리 할수 있다

oList.Add(New 야구선수("너구리", 19, "야구", "무궁화", 28, 19))

이것은 VBA에서크래스모듈로 사용자정의개체생성할때
Dim oX As New clsX
에서 New 메소드는 매개변수를 전달할수 없었지만
여기에서는 New메소드에 매개변수를 전달할수 있기때문에 위와 같은 방법이
가능한 것이다

***[LOG-IN]***