출처 : 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