반응형

출처 : http://itkang.egloos.com/tb/516166


VB.NET에서의 객체지향 프로그래밍


VB.NET은 JAVA처럼 완벽한 객체지향을 지원한다.  VB.NET에서 어떠한 식으로 객체지향프로그래밍이 이루어지는지 예를 들어 살펴보기로 하자.

1-1. 네임스페이스, 클래스, 객체, 모듈

   ✱ 네임스페이스

VB.NET에서는 특정한 목적을 가진 클래스나 데이터 구조체들을 네임스페이스의 형태로 묶는다. 프로그래머는 단순하게 네임스페이스를 임포트(Import)함으로써, 네임스페이스의 클래스들을 사용할 수 있다. Imports라는 키워드를 사용하여 네임스페이스를 프로젝트에 임포트 한다. .NET프레임워크는 다양한 네임스페이스를 통하여 많은 클래스들을 지원하고 있다. 본 예제에서는 System이라는 네임스페이스를 사용한다.

Imports System


    ✱ 클래스

우리는 이미 클래스와 객체에 대하여 잘 알고 있다. 간단히 말하자면 클래스는 실생활에 존재하는 객체(Object)의 정의이다. 예를 들면 Human이라는 클래스는 인간을 표현하는 클래스이고, Dog이라는 클래스는 모든 개들을 표현하는 클래스이다. VB.NET에서는 아래의 예처럼 클래스를 정의한다. VB.NET에서의 클래스는 함수(Function), 변수, 속성(Property)등을 포함할 수 있다.


Imports System

Namespace Animals

Class Dog

   Function Bark()

      Console.Writeline ("Dog is barking")

   End Function

End Class

End Namespace


    ✱ 객체

객체는 클래스의 인스턴스(사례)이다. 예를 들면 Jimmy는 Dog의 한 개체이다. 클래스란 하나의 틀이고, 이틀을 이용하여 객체를 찍어내어 사용한다고 볼 수 있다. 다음과 같이 객체들을 생성하고 사용한다..








Public Module modMain

Sub Main()


Dim Jimmy as Animals.Dog

Jimmy = new Animals.Dog()


Dim Merry as Animals.Dog

Merry = new Animals.Dog


Jimmy.Bark()  ‘ --> Dog 클래스내의 Bark함수 호출

Merry.Bark()

End Sub

End Module


마치 변수를 선언하듯 Dog이라는 형태의 Jimmy변수와 Merry변수를 선언한다. Animals란 네임스페이스내의 Dog이라는 클래스가 있기 때문에 Animals.Dog이라는 표현을 사용하였다.

Jimmy = new Animals.Dog와 Merry = new Animals.Dog에서 객체를 생성한다. 


   ✱ 모듈

앞의 예제에서 우리는 모듈을 이미 사용하였다. 우리는 공통 함수(Function과 Sub)을 작성하기 위하여 모듈을 사용한다. 즉 모듈은 함수들의 집합체이다. public으로 선언된 함수들은 어디서든지 사용될 수 있다. 모듈에 작성된 여러 함수들 중 Main()함수를 제일 먼저 실행한다.


1-2. 접근형식

주된 접근형식으로는 Public, Private, Friend 그리고 Protected가 있다. 앞에서 언급 했듯이 클래스는 함수와 변수 등을 포함할 수 있는데, 우리는 함수와 변수 앞에 접근형식을 선언할 수 있다. 만약 접근형식이 Public으로 선언되었다면, 객체를 생성함으로써 해당 함수나 변수를 사용할 수 있다. Private나 Protected로 선언된 함수나 변수는 클래스 내의 함수들만 사용할 수 있다. Private와 Protected의 다른점은 Protected는 클래스를 상속하면 사용할 수 있다는 것이다. Friend는 동일 프로젝트내에서는 접근이 가능하다. 아래의 예는 Public과 Private의 사용 예를 보여준다.


Imports System

Namespace Animals

Public Class Dog

   Public AgeOfDog as Integer  ‘  --> Public변수

   Public Function Bark()       '  --> Public 함수 Bark

       Console.Writeline ("Dog is barking")

   End Function


   Private Function Walk()    ' --> Private 함수 Walk

        Console.Writeline ("Dog is walking")

   End Function

End Class

End Namespace


Public Module modMain

Sub Main()

    ourFunction()
End Sub


Function ourFunction()

    Dim Jimmy as Animals.Dog

    Jimmy = new Animals.Dog()

    Jimmy.Bark   '--> Bark가 Public으로 선언되어 있기 때문에 실행된다.

    Jimmy.AgeOfDog = 10  ‘ --> AgeOfDog이 Public으로 선언되어 있으므로 실행된다.

    Jimmy.walk           ‘ --> walk가 Private로 선언되어 있으므로 오류 발생

End Function

End Module 


1-3. Shared 함수

클래스내의 Shared멤버는 객체를 생성하지 않고도 사용할 수 있다.


Imports System

Namespace Animals

Public Class Dog

   Public Shared Function Bark()       '  --> Public 함수 Bark

       Console.Writeline ("Dog is barking")

   End Function


   Private Function Walk()    ' --> Private 함수 Walk

        Console.Writeline ("Dog is walking")

   End Function

End Class

End Namespace


Public Module modMain

Sub Main()

    Animals.Dog.Bark()  ‘--> Bark함수가 Shared로 선언되었기 때문에 객체를 생성하지
                         ’않고도 함수를 실행할 수 있다.

    Dim Jimmy as Animals.Dog

   Jimmy = new Animals.Dog()

   Jimmy.walk()  ' --> walk는 shared로 선언되지 않았기 때문에 객체생성후 사용

End sub

End Module 


우리가 지금 까지 사용한 Writeline함수는 Shared함수 이기 때문에 객체를 생성하지 않고 사용할 수 있다.


1-4. 오버로딩

오버로딩이란 동일한 이름을 갖는 함수를 파라미터를 다르게 줌으로써 각각 다른 함수처럼접근할 수 있도록 해주는 기술이다.


Imports System

Class Adder

   Overloads Public Sub Add(A as Integer, B as Integer)

       Console.Writeline ("Adding Integers: " + Convert.ToString(a + b))

   End sub


   Overloads Public Sub Add(A as String, B as String)

       Console.Writeline ("Adding Strings: " + a + b)

   End sub

   Shared Sub Main()

      Dim AdderObj as Adder

      AdderObj = new Adder

      AdderObj.Add(10, 20)

      AdderObj.Add("hello", " how are you")

   End sub

End Class


위의 예제를 보면 Add라는 이름을 갖는 두개의 함수가 존재하나 각각의 인자(Parameter)가 서로 다르기 때문에 별개의 함수로 인식된다. 오버로딩을 사용하기 위해서는 함수 앞에 Overloads라는 키워드를 사용하여야 한다. Main함수를 클래스 내부에 작성할 때는 Shared키워드를 사용하여 객체를 생성하지 않고 실행될 수 있도록 해 주어야 한다.


1-5 상속

상속이란 프로그램의 재사용성을 높이기 위한 객체지향프로그래밍의 핵심적 기술이다. 다시 말하면 이미 만들어진 클래스를 다시 이용하는 방법을 말한다. 클래스를 상속받은 클래스(Derived Class)는 부모클래스(Base Class)의 속성을 그대로 물려받는다.


Imports System

Class Human

   Public sub Walk()

       Console.Writeline ("Walking")

    end Sub

End Class


Class Programmer

   Inherits Human

   Public sub Programming()
       Console.Writeline ("Programming")

   End Sub

End Class


Class MainClass

   Shared Sub Main()

      Dim Tom as Programmer

      Tom = new Programmer

      Tom.walk()   '--> Programmer클래스가 Human클래스를 상속했으므로 Human클래스의

                  ‘-->  함수를 이용할 수 있음

      Tom.Programming()

   End Sub

End Class       

1-6. 오버라이딩

기본적으로 상속받은 클래스는 부모클래스(Base Class)의 함수를 상속 받는다. 상속받은 함수를 재정의 하여 사용할 수도 있는데 이를 오버로딩이라고 한다.


Imports System

Class Human

   Overridable Public Sub Speak()

      Console.Writeline ("Speaking")

   End Sub

End Class


Class Korean

    Inherits Human

    Overrides Public Sub Speak()

       Console.Writeline ("Speaking Korean")

    End Sub

End Class


Class MainClass

   Shared Sub Main()

      Dim Lee as Human

      Lee = new Human

      Dim Kim as Korean

      Kim = new Korean

      Lee.Speak()

      Kim.Speak()

   End Sub

End Class


1-7. 생성자(Constructor)와 소멸자(Destructor)


생성자는 객체가 생성될때 자동으로 실행되는 특별한 함수의 하나이다. 생성자도 오버로딩하여 사용할 수 있는데 생성자에서는 Overloads란 키워드를 사용하지 않는다. 소멸자는 객체가 소멸될 때 자동으로 실행되는 특별한 함수이다.



Class Dog

   Private Age as Integer

   Public Sub New()   ' --> 생성자

      Console.Writeline ("Dog is created with age zero")

      Age = 0

   End Sub


   Public Sub New (Val as Integer)

      Console.Writeline("Dog is Created with age " + Convert.ToString(Val))

      Age = Val

   End Sub


   Overrides Protected Sub Finalize()  ' --> 소멸자

      Console.Writeline("Dog is destroyed")

   End Sub


   Shared Sub Main()
      Dim Jimmy, Jacky as Dog

      Jimmy = new Dog      '--> 디폴트 생성자를 실행

      Jacky = new Dog(10) ‘--> 인수를 갖고있는 생성자를 실행

   End Sub

   ‘ --> 프로그램 끝날 때 소멸자 실행

End Class


1-8. 속성(Property)

객체에 정보를 저장하기 위해 속성과 필드를 사용한다. 필드는 단순한 Public변수를 의미하나, 속성은 Get/Set키워드를 사용한다.


Imports System

Public Class Dog

   Private AgeOfDog as Integer

   Public Property Age() As Integer

     Get

        Console.Writeline("Getting Property")

        Return AgeOfDog

     End Get


     Set(ByVal Val As Integer)

        Console.Writeline("Setting Property")

        AgeOfDog = Val

     End Set

   End Property

End Class 


Class MainClass

   Shared Sub Main()
      Dim Jimmy as Dog

      Jimmy = new Dog

      Jimmy.Age = 30    '--> AgeOfDog변수를 직접 핸들링할 수 없다(Private) 그래서

                       ‘--> Age() Property루틴을 사용한다.

      Dim curAge = Jimmy.Age() ‘--> Age Get루틴이 실행된다.

   End Sub

End Class

+ Recent posts