PROGRAMMING WORKSHOP

VB.Net | 개체란 무엇인가? What is Object

수시로 개체란 무엇이고
어떻게 사용하는 것이고 이야기하지만 개체가 도대체뭔지 막연한 분들이 많다
개체는 실제로 이해하고 스스로 만들어 보기전까지는 아무리 이야기를 해도
모르는 것이 개체다
엑셀프로그래밍이 바로 개체프로그래밍이라고 해도 무슨 소린지 모른다

VB.Net입장에서 개체이야기를 다시 해보도록 하자
실은 엑셀프로그래밍자체가 이미 개체속에서 살고 있는 것이다
그러니 인생의 실체를 무엇인지 모르고 사는 것과 다름없는 막연한
상태에서 살아가는 것이나 마찬가지라고 할 수 있다
개체를 이야기 하자면 철학적인 소리도 하고 장황하게 이야기 할수도 있고
짧게 설명할수도 있다
좀 장황한쪽으로 재미있게 읽어 나가시기 바란다
개체를 이해하고 알게되는 것은 스스로 코딩을 해보면서
불편함도 느껴야 하고 개선하고자 하는 생각도 들어야 하고
뭔가 새로운 것을 만들어 보고자 하는 열정이 생길때 철저히
이해하게 되는 것이 개체이다
그래서 uno-weekly의 프론트페이지의 섭타이틀이 [개체지향적사고]라고
붙이고 떠드는 것이다
그런 방향으로 조금씩 접근하실수 있는 길을 터줄수 있다면
인생이던 프로그래밍던 다행스러운 일이라고 생각하니까..

세상이 모든 것은 개체이다
주변의 모든 개체를 택해 보라..
당신의 컴퓨터, 책, 강아지, 당신이 입고 있는 옷,TV
어느 것이나...타고 다니는 자동차.. 살고 있는 집..
딱 두가지 동사로 설명할수 있다
개채는..
What it is(그것이 어떤 상태이고) 와
What it does(그것이 어떤 것을 할수 있는지) 두개이다
What it is--------->State(상태)
What it does------->Behavior(행동)

이것을 다시 컴퓨터과학자들은 이렇게 바꿔서 사용한다
What it is--------->State(상태)---------Property(상태)
What it does------->Behavior(행동)------Method(행동)

개체화시킨다고 하는 것이 바로
컴퓨터의 프로그래밍을 하는 대상을 개체화시킨다는 소리인것이다
왜????
편리하고 조직적이고 체계적이고 효율적이니까

예를 들어서
회사의 각부서에서 같은 이름의 작업을 하는 것이 있을 것이다
관리부에서 [인원관리]라는 함수가 하나 있다고 치고
영업부에서도 [원원관리]라는 함수가 하나 있다고 치자
회사를 운영하는데 [인원관리]라고 하는 함수가 이곳,저곳에서
사용하는데 약간씩의 운영방법이 다르다..아주 약간씩..
또한 어느 부서에서 사용하는 [인원관리]함수인지도 헷갈린다
이때 프로그래밍을 할때 [관리부]라는 개체를 하나 만들거나
[영업부]라는 개체를 하나 만들고(개체화시키고)
[관리부]라는 개체를 하나 만들고(개체화시키고)
[영업부].[인원관리]라는 함수
[관리부].[인원관리]라는 함수 와 같이 각각의 개체가 갖고있는
기능으로 독립적으로 프로그래밍을 하면 체계적,조직적,효율적으로 되지 않겠는가?

이런 그냥 단순한 필요에 의하여 개체화가 시작되는 것이다

VB.Net을 하면서 헷갈리는 것중의 하나는 이런 것이 있을 것이다
[관리부].[인원관리] 라고 할때 [관리부]라는 것이 개체가 아닌 경우도 있다
이런 것을 NameSpace라고 부른다
그냥 여러분의 화일시스템의 폴더와 같이 껍데기이름만 있는
영역을 표시하는 것일때 이렇게 사용한다..
개체가 아닌데 개체같이 보이는 것 ..착각하지 마시고..

다시 위의 이야기로 돌아가서
일반적으로 사용하는 생활속의 개체를 보자
TV를 보면
TV의 State(상태)라고 하는 것이 도대체 뭐냐???
고장났냐???안났냐??? 상태다
싸이즈가 몇인치냐??
흑백이냐 칼라냐??
이런 상태는 모두 Be동사로 설명 된다
TV의 Behavior(행동)은 무엇이 있는가
TV를 키고 끄는 것(Turn on or off)이 대표적인 행동일 것이다
또한 소리를 키웠다가(Sound)혹은 묵음(Mute)로 하거나
챠넬을 바꾸거나(Change Chanel)

그리고 또 행동은 상태를 바꾼다
다시 Method를 사용하게 되면 Property가 바뀌는 셈이기도 하다
예를 들어서 TV의 Turn Off메소드로 TV를 껐다면
TV가 켜진 상태인지 꺼진 상태인지를 가름하는 속성이 생기게 될수도
있을 것이다
그러니 상호관계는 보는 상태에 따라서 다르게 볼수도 있을 것이다
그래서 개체의 속성과 메소드를 이해한다고 하면서도
종종..어라..속성값을 바꾸었는데 상태가 바뀌었네..할수도 있다
그래서 헷갈리는 것이다
바탕색이라는 속성을 빨강색을 파랑색으로 바꾸는 것도
어떻게 보면 메소드이기도 하다

사람이 하는 행동도 똑같다
긍정적으로 행동하였더니 상태가 어떻게 바뀌였다
부정적으로 행동하였더니 상태가 어떻게 바뀌였다
상태를 이렇게 바꾸었더니 행동이 이렇게 바뀌였다
상태를 저렇게 바꾸었더니 행동이 저렇게 바뀌였다
마찬가지 인것이다
구별하기 위하여 속성과 메소드를 위와 같이 설명하지만..
행동과 상태, 메소드와 속성은 상호반응이 똑같은 셈이다

프로그래밍에서 단지 다르다면
속성은 딱 하나의 속성값만 변화시키고
메소드는 여러개이던 하나이던 상관없이 행동하는 것이고
위와 같은 설명이 실은 초보님들에게는 또 헷갈리게 하는 소리이기도 하다

좀더 이해를 돕자면..
아무리 간단한 소루션을 하나 만들더라도
여기저기 널려있는 함수 프로시져, 변수등등이
처음에는 그냥 시익 눈으로 보아도 관리하는데 별 문제가 없어 보인다
그러나..몇날 몇일을 줄줄이 작성하다 보면
뭐가 뭔지 작성한 스스로도 헷갈린다
특히나 깊이 심취하여 코딩중에 누가 말을 시키고
갑자기 급한 다른 일이 있어서 몇일 손을 놓았다치면..
에고...!@# 이거 다시 작성하는 것이 오히려 빠르겠다..
싶어서 시원하게 지워버리고 다시 작성하게 되기도 한다

바로 이 부분이 문제인 것이다
문제는 풀라고 만들어지는 것..
이것에 대한 해법이 바로 개체지향적 프로그래밍이 된 것이다


심각하게 생각할 것도 없이
같은 성질머리를 갖은 함수끼리..
같은 성질머리를 갖은 변수,상수끼리..
묶어서 개체라는 것을 만들거나 NameSpace라는 것을 만들어 조직적으로
체계적으로 시스테믹하게 구성을 하여(이것을 Class Modeling이라고도 한다)
관리하게 되는 것이다
그러니 엑셀통합문서에서 지극히 간단한 시트의 작업이라던가
도형의 작업이라던가..별로 연관성이 없고
별로 복잡하지 않은 코드에서는
필요성도 못느끼고..필요하지도 않은 것이다
실은 엑셀프로그래밍도 개체지향적으로 만들어진 Class Modeling이지만
이것을 VBA로 다루는 입장에서는 그냥 모듈시트에 이런 저런
함수와 프로시져로 엑셀개체에 접근 하는 것이다
즉 사용자정의 개체의 생성같은 것은 복잡하지 않은 간단한
코드관리에서는 필요 없다는 이야기다
VB6시절에도 자체적으로는 사용자정의 개체의 생성은 필요없었다
그러나 VB.Net에서는 사용자정의개체를 만들어가면서 써야할
이유가 생기게 되는 것이다
왜냐면..
VB.Net의 자체적인 개체들에게 변수를 넘겨줄때
변수자체의 정보타입이 개체타입을 요구하는 경우가 많아지게 되는 것이다

아무튼..
개체는 3가지 요소가 있다
Encapsulation 캡슐화
Inheritance 상속성
Polymorphism 다형성
무지 어려워 보이는 소리같지만
모두 하나의 개체를 만들고 만들어 놓은것 또 만들지 말고
다시 사용하고 싶은 Reusability 와 이미 만들어 놓은 것의
기능을 놓아두고 다른 기능을 추가 시켜 보고 싶은 이미 기존의
기능을 Extensibility(확장)하고 싶은 것을 구현하고자 하는 소리다

엑셀의 VBA 크래스모듈은 위의 3가지중 딱 한가지정도를
만족시키는 것이다
Encapsulation, 캡슐화..정도만 구현해보려고 하는 것이다
상속성이나 다형성은 없다

그러나 VB.Net에서는 완벽한 개체구현을 하고자 하는 언어라서
위의 3가지를 모두 알게 된다
실은 이전의 VB도 개체지향적 언어라고 볼수 없었으나(어느 정보 흉내만 내는)
.Net FrameWork를 기반으로 하는 VB.Net에서 좀더 VB가 발전된 것이다

상속성의 경우를 간단하게 보면
아래와 같이 크래스모듈에 사람이라는 개체를 구현하는 크래스모듈을 만들었다

Class Person
  Public Name As String
  Public BirthDate As Date
  Public Sex As String
  Public BloodType As String
  Public Security_ID As String
End Class

사람이라면 누구나 갖고 있어야 할 속성들이다
이름이 있어야 하고 생년월일이 있고 성별이 있고 혈액형이 있고
주민번호가 있고 이것은 공무원이던 학생이던 가정주부이던 모두
갖고 있는 기본정보가 된다
그런데 이제 직원개체를 만든다고 생각하면
어느 직원이다 위의 필수정보를 갖고 있고 추가하여 직원으로서
필요한 정보가 만들어지면 되는 것이다
그래서 위의 개체, 크래스를 상속을 받으면 재 작성을 할 필요가 없고
재사용 Reuseablility가 구현되는 것이다
아래와 같이

Class Employee
	Inherits Person
	Public EmployeeID As String
	Public Salary As Double
	Public Dept As String
	Public ....
	Public ....
End Clasee

직원용 개체를 만들면서 Person개체를 상속받는 다고
Inherits Person
이라고 작성하는 것이다
즉 Employee크래스에서 생성된 개체에서 위의 Person크래스의
BirthDate라던가 Sex라던가하는 자원을 마치 자신의 자원같이
사용하게 되는 것이다
엑셀 VBA에서는 Inherits라는 키워드 자체가 없는 셈이다
완벽한 개체지향성의 VB.Net의 키워드중의 하나이다

VB.Net에서 Inherits라는 키워드는 꼭 알고 있어야 하는 것중의 하나다
위와 같이 사용자정의 개체에서 뿐만 아니라
이미 만들어져 있는 개체를 상속받아서 기능을 확장시켜갈수 있는 것이니까

VB.Net개발도구를 사용하면서 뻑하면 나타나는 키워드 Inherits가 바로 위와 같은 것이니..아하..어떤 개체의 것을 내 것같이
쓰겠다는 소리구나!!라고 아시면 된다
사용자정의 개체를 사용하지 않는다 하더라고
VB.Net환경에서는 아주 흔히 나타나는 키워드가 Inherits이다
아래의 그림은 웹을 개발하는 ASP.Net 의 웹페이지의 크래스모듈을
열면 자동으로 나타나는 모습이다



여러분이 보고 있는 웹페이지 한장 자체가 개체로 처리되고 있는 것이다
Web 개체로 처리되는데 있어서 기본적인 모든 메소드나 속성을 갖고 있는
.Net FrameWork에서 갖고 있는 크래스집단중의 하나인
System.Web.UI.Page
즉 Page개체의 모든 자원을 상속받아서 개발자가 코딩을 하게 되는 것이다

.Net FrameWork를 사용한다고 하는 것은
.Net FrameWork의 개체를 사용하거나 개체를 상속받아서
새로운 개체를 만들어 가면서 개발 한다는 이야기가 되는 셈이다

좀더 Inherits의 사용예를 본다면
아래와 같이 데이타베이스를 받아서 정보를 집합체에 담으려고 할때
아래와 같이 개체를 만들어서 사용한다

Public Class CCB
    Public iChapter As Integer
    Public Talk As String
    Public Example As String

End Class
Public Class CCBs
    Inherits System.Collections.Generic.List(Of CCB)
End Class


Private Sub ListBoxChapter_SelectionChanged(...)
oCCBs = New List(Of CCB)

Dim oCon As New System.Data.SqlClient.SqlConnection( _
	"Data Source=**.***.***.***;Initial Catalog=uno21;_
	User ID=***;Password=********")
oCon.Open()
Dim oCom As New System.Data.SqlClient.SqlCommand( _
"SELECT * FROM UNO_CCB WHERE Chapter=" & _
ListBoxChapter.SelectedIndex + 1, oCon)

Dim oRst As System.Data.SqlClient.SqlDataReader = _
	 oCom.ExecuteReader
Do While oRst.Read
    Dim oX As New CCB
    oX.Talk = oRst(2).ToString
    oX.Example = oRst(3).ToString
    oCCBs.Add(oX)
Loop
End Sub

CCB라는 개체와 CCBS라는 개체가 있다
CCBS는 CCB라는 개체를 수도없이 만들어서
보관하는 하나의 집합체이다
이 집합체는 VBA는 Collection이라는 것 하나밖에 없지만
VB.Net에서는 아주 다양한 것을 제공하게 되고
이것이 System.Collections.Generic.List(Of T)라고 하는 크래스에서
상속받아서 만든다는 표시를 아래와 같이 한 것이다

Public Class CCBs
Inherits System.Collections.Generic.List(Of CCB)
End Class

그렇게 되면 CCBs라고 하는 사용자정의 크래스에서
.Net Framework에서 제공하는 크래스를 그대로 내가 작성한 것 같이
활용을 하게 된다는 것이다

왜 이렇게 골치(??)아픈 짓을 하나??
실은 쓸데없는 코딩을 할 필요가 없는 것이다
그냥 개체가 갖고 있는 능력에 일을 시킬줄만 알면 되는것이다

실버라이트로 영화의 자막을 영화가 진행되는 것에
따라서 나타나게 하는 교재를 하나 만들었던 것이 있다
만든 내용이 어떤 것인지 버튼을 크릭하여 우선 다운 받아서 보시고..

실버라이트 영화크립열기 영화가 진행되면서 자막이 차례대로 바뀐다
silvierlight 개발코드의 내용을 보면

Partial Public Class MainPage
	Inherits UserControl
  Dim oCaptions As Captions
  Dim iMarkerIndex As Integer
  
  Class Caption
      Public sC As String
      Public oT As TimeSpan
  End Class
  Class Captions
      InheritsSystem.Collections.Generic.List(Of Caption)
  End Class
  
  Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
      oCaptions = New Captions
      Dim oX As Caption
      oX = New Caption : oX.sC = "So you're gonna meet your boyfriend now or what?" : oX.oT = New TimeSpan(0, 0, 6, 23) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "No, I think he's probably out doing what you're doing" : oX.oT = New TimeSpan(0, 0, 6, 24) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Getting a crush on someone else's girlfriend?" : oX.oT = New TimeSpan(0, 0, 6, 27) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "No, I'm sorry. I just meant to say I had a really great time." : oX.oT = New TimeSpan(0, 0, 6, 30) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "You know, maybe you should give me your phone number,you know, just in case." : oX.oT = New TimeSpan(0, 0, 6, 33) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "In case of what?" : oX.oT = New TimeSpan(0, 0, 6, 36) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "You know, in case of life." : oX.oT = New TimeSpan(0, 0, 6, 37) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "I just had a great time, and I'd never be able to find you again." : oX.oT = New TimeSpan(0, 0, 6, 39) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Well, if we're meant to meet again,then we'll meet again" : oX.oT = New TimeSpan(0, 0, 6, 42) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "It's just not the right time now " : oX.oT = New TimeSpan(0, 0, 6, 46) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Maybe we were supposed to meet on British time and we're five hours too early" : oX.oT = New TimeSpan(0, 0, 6, 47) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Come on.I don't even know your name.My name is Jonathan. " : oX.oT = New TimeSpan(0, 0, 6, 51) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Does that make you wanna tell me something?" : oX.oT = New TimeSpan(0, 0, 6, 55) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Yeah, it does" : oX.oT = New TimeSpan(0, 0, 6, 57) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "Merry Christmas, Jonathan.And thanks. " : oX.oT = New TimeSpan(0, 0, 7, 0) : oCaptions.Add(oX)
      oX = New Caption : oX.sC = "That's it?" : oX.oT = New TimeSpan(0, 0, 7, 11) : oCaptions.Add(oX)
  End Sub
  ...
  ...
  ...
End Class


Class 모듈내에 또 Class를 작성할수있다
아주 편리하다
소루션이 초기화되면서

비디오크립이 진행되면서 시간이 돌아간다
어떤시간이 되면 문자열정보인 대사가 필요해진다
이 어떤시간에 어떤정보를 전달해준다는 것을 의미한다
이때 단순하게 대사만 전달할수도 있고 그 순간에 어떤 그림이 나타나게 하고 싶다면
그림화일 정보도 같이 전달하여야 할 것이다
바로 이런 욕구, 단순한 하나의 정보가 아니라 여러개의 정보를 팩키지로
보내게 되는 것이 현대의 복잡한,다양한 정보의 처리를 말하는 것이고
이렇게 관련된 정보를 여러개 세트로 구성하여 보내게 되는 것이
바로 개체라는 것이 필요하게 되는 것이디

Captions 집합체개체에 Caption개체를 만들어서 줄줄이 담아놓고
실행될때는 앞뒤로 이동을 할때 이 Captions집합체의 내용을 읽어서
화면서 표시하면 되는 것이다
일종의 배열이지만..위와 같이 죄다 개체를 만들어서 사용하게 되는 것이다
영화의 진행시간에 따라서 자막이 올라와야 하니까..
시간을 전달하는 것도 개체이다 New TimeSpan(시,분,초,미리세컨)과 같이
물론 위와 같이 대사를 줄줄이 작성하지않고 DB에서 읽어서 순환하면서 처리하지만..
(참..Silverlight는 데이타베이스를 다이렉트로 접근하지 못하니 다른 방법으로
하여야 하지만..XML로 변환시킨화일을 참조하거나..나중에 다른 코너에서 설명할 것임)

위의 보기 쉽게 하기 위하여 풀어 놓은 것이다
단순한 하나의 정보도 개체로 다루는 것이 습관이 되어야 한다(VB.Net을 즐기려면)
참으로..우노 정성이 하늘을 뻣친다..조금이라도 깊이 이해를 돕기 위하여..^^

상속성(Inherits)라는 것에 대하여 감을 잡으셨으면
캡슐화(Encaptulation)이라는 것을 살펴보자
몸이 아픈 사람의 약을 이런 성분,저런성분 다양한 성분의 것을
켑슐속에 몰아 넣고 환자는 켑슐하나만 쏙 먹으면 된다
프로그램에 필요한 기능을 한곳에 톡 털어 넣고 사용자는 이 캡슐만
사용하면 된다...사용자는 내용을 알필요없다
예를 들어서 어느 회사의 데이티베이스 관리자의 입장에서
각각 업무부서에서 시도 때도 없이 이런,저런조건에 맞는 정보를
엑셀에 뿌리고 싶디고 주문이 잦다
스마트하고 의욕적인 관리자라면 크래스모듈로 COM라이브러리를 하나 만들어서
부서별 엑셀좀 한다는 친구들에게 5분만 교육시키면 끝난다
아래와 같이 작성된 크래스모듈을

Public Class DataA
    Public Chapter As Integer
    ReadOnly Property Datas
        Get
            If Chapter = 0 Then Chapter = 1
            Try
                Dim oList As New Collection
                Dim oCON As New System.Data.SqlClient.SqlConnection("Data Source=**.***.***.****;Initial Catalog=**;User ID=**;Password=****")
                Dim oCOM As New System.Data.SqlClient.SqlCommand
                oCON.Open()
                oCOM.CommandText = "SELECT * FROM uno_ccb WHERE chapter=" & Chapter
                oCOM.Connection = oCON
                Dim oReader As System.Data.SqlClient.SqlDataReader = oCOM.ExecuteReader()
                Do While oReader.Read
                    Dim sX As String = oReader(2)
                    If sX.IndexOf("|") > 0 Then
                        sX = sX.Split("|")(0)
                        If sX.IndexOf(":") > 0 Then
                            sX = sX.Split(":")(1)
                        End If
                    End If
                    oList.Add(sX)
                Loop
                Return oList
            Catch ex As Exception
                Return Nothing
            End Try
        End Get
    End Property
End Class

위와 같이 데이타쏘스에 접근하여 정보를 갖여오기 위하여
패스워드,사용자ID,IP주소등등
크래스모듈내의 잡다한 작업내용은 사용자는 알 필요 없다
만약 위의 개체를 엑셀에서 참조하여 사용한다면 그냥

데이타중에서 몇번째 Chapter의 내용을 갖고 오겠냐는 정보를 받아서
개체내에서 ADO.Net이 코넥션을 하던..몇번째휠드를 검색을 하던
그냥 Chapter정보만 전달하면 휠터링된 개체를 받아 오게 되면 되는 것이다

Dim oX As New DataA
Dim oCol As Collection
oX.Chapter=10
Set oCol=oX.Datas
If Not oCol Is Nothing Then
.......사용하면 되고
Else
.......MsgBox "일시적 오류가 있습니다..다시호출하세요"
End If

받아온 집합체 oCol만 엑셀에서 사용하면 된다

이런 개념이 Encapsulation이고 또 다른 말로 Abstract(추상화)라고
부르는 것이다

이제 Polymorphism 이라는 것을 살펴보자
Polymorphism은 상속성(Inheritance)과 경계가 모호하지만(관계가 깊어서
이것이 저것같고 저것이 이것 같다) 쉽게 생각해보자
혹시 코딩하다가 아래와 같은 것을 본적이 있으신지



ADO.Net의 Connection개체를 생성하려고 New 를 사용하고 괄호를 치니
1 OF 2라는 아이콘이 보인다
이것뿐만이 아니라 많은 메소드를 사용하다 보면 1 of 6, 1 of 3 등과 같이
하나의 메소드에 다양한 명령을 할수가 있다는 것
그림의 경우 메소드명으로 2가지의 매개변수를 전달할수 있다는 소리가 아닌가??

Polymorphism에서 Poly는 multi, 즉 many라는 의미이고
morphing은 어떤 형태, 폼을 말하는 것이니
하나의 이름으로 여러가지 일을 한다는 다형성을 의미하는 셈이다

가장 Polymorphism의 간단한 예를
아래와 같이 작성하고 실행해 보시기 바란다

'크래스모듈시트를 삽입하고 크래스모듈내용을 아래와 같이 한다
Public Class SampleClass

    Public Function add(ByVal iX As Integer) As Integer
        Return iX
    End Function

    Public Function add(ByVal iX As Integer, ByVal iY As Integer) As Integer
        Return iX + iY
    End Function

    Public Function add(ByVal iX As Integer, ByVal iY As Integer, ByVal iZ As Integer) As Integer
        Return iX + iY + iZ
    End Function

End Class


위의 크래스를 생성하고 메소드를 호출할때 아래의 그림과 같이
1 OF 3 이라는 다양하게 메소드를 호출하는 선택목록이 나타나는 것이다



이것이 가장 간단한 Polymoriphism을 경험해 본 것이다
위는 Console프로젝트에서 작성해 본것이고..


너무 깊이 들어간다고 어려워서 ..
에고 내가 할 일이 아니군..하고 놓아 버릴까바 조심스럽다
그냥 상식적으로 개체지향프로그래밍의 컨셉을 알자고 하는 것이다
모두 엑셀을 더 잘하려고 하는 것이지.. 어려운 것 하려고 하는 것이 아니다

콘솔(Console)프로젝트에 위의 것을 작성하고 해보시라고 했는데..
엑셀을 사랑해야 하니까..Excel-Add-In에서 테스트해보자
공연히 이것 저것 하면 헷갈리니까..
VSTO 엑셀에드인으로 테스트해보면 아래의 그림과 같다

엑셀 add-in의 초기화 프로시져
Private Sub ThisAddIn_Startup() Handles Me.Startup
에서 개체를 생성하고 호출해보면..



이것이 개체의 Polymorphism인 것이다
하나의 인터페이스로 여러개의 작업을 할수 있게 하는 것

실은 위의 코드에서는 하나의 키워드가 생략되었다
Public Function add(ByVal iX As Integer) As Integer 은
Public OverRidable Function add(ByVal iX As Integer) As Integer

overridable 말 그대로 덮어 씌울수 있다는 소리다
다른 것으로 대체하여 사용할수도 있다는 것이다

또한 VB.Net에서 크래스모듈 시트를 별도로 삽입하고 해도 되고
위와 같이 다른 크래스모듈내에 또 삽입하여 작성해도된다
VB콤파일러는 이것을 컴파일할때 별도의 크래스모듈이던
이렇게 다른 크래스모듈에서 작성한 하나의 독립된 크래스모듈로
알아서 정리정돈하는 것이니..
각자 편리한대로 작성하면 된다

Polymorphism은 상속을 바탕(Inheritance-Based Polymorphism)으로 하여
구현하는 경우가 있고
Interface와 Implements라는 것을 바탕(Interface-Based Polymorphism)으로
구현하는 경우가 있다
상속(Inheritance)은 곧 다형성(Polymorphism)을 위한 것이라고 해도 되는 셈이다
아래의 그림과 같이 .Net FrameWork의 자원을 주욱 보다 보면
앞에 I 라는 문자가 붙어있고 아이콘이 돋보기 같이 생긴것이 있을 것이다
이것이 바로 Interface라고 개체의 유용헌 Polymoriphism을 구현하는 자원들이다



위와 같이 나타나고 하나를 선택작성하고 엔터키를 치면
메소드(함수)가 하나 달랑 자동으로 작성된다



이미 작성되어 있는 Interface를 사용하여 여러분만의 또다른 기능을

설명하기 까다로운 주제를 설명하려니 좀 그렇다..
걱정하실 것 없다
우노도 이것을 이해하느라고 참 애를 많이 먹었으니까..
지금은 긴가 민가하면서 프로그래밍을 하다 보면 어느날 갑자기
감이 팍 잡하는 것이 이런 주제들의 것이다
아무튼 상속성이던, 캡슐화이던 , 다형성이던 모두가
코드를 중복해서 작성하지 않고 어떻게 하면 구조적으로 안정되고
조직적이고 효율적인지를 구현해 보고자 하는 방법론들인 것이다
현재까지의 최선의 방법론이라고 프로그래머들이 주장하는 방법이니..
슬금..슬금 조금씩 이해하여 간다면
엑셀프로그러머로써 좀더 깊이 사물을 이해하여 가는 과정이니
지루하더라도 이해하여 보려고 노력들을 하신다면 좋겠다

좀더 사례를 만들어 가면서 가보도록 하자..