VB.NET 2008/VB - 개체지향

Visual Basic의 개체 지향 프로그래밍

본클라쓰 2011. 4. 15. 09:37

 

개체와 클래스의 개념

 

개체는 하나의 단위로 취급할 수 있는 코드 및 데이터의 조합입니다. 개체는 컨트롤이나 폼과 같은 응용 프로그램의 부분이 될 수 있으며, 응용 프로그램 전체가 하나의 개체로 될 수도 있습니다. Visual Basic에서 수행하는 거의 모든 작업은 개체와 관련되어 있습니다.

 

개체를 사용하면 변수 및 프로시저를 선언한 다음 필요할 때마다 다시 사용할 수 있습니다. 예를 들어, 맞춤법 검사기를 응용 프로그램에 추가하려는 경우 맞춤법 검사 기능을 제공하기 위한 모든 변수 및 지원 함수를 정의할 수 있습니다. 맞춤법 검사기를 하나의 클래스로 만들 경우에는 컴파일된 어셈블리에 참조를 추가하여 다른 응용 프로그램에서도 해당 맞춤법 검사기를 다시 사용할 수도 있습니다. 뿐만 아니라 다른 사람이 이미 개발한 맞춤법 검사기 클래스를 사용하여 작업 시간을 줄일 수도 있습니다. 

 

클래스는 개체의 변수, 속성, 프로시저 및 이벤트를 설명합니다. 개체는 클래스의 인스턴스입니다. 따라서 일단 클래스를 정의한 후에 필요한 만큼 개체를 만들 수 있습니다. 개체와 클래스 간의 관계를 이해하려면 쿠키 커터와 쿠키를 생각하면 됩니다. 쿠키 커터는 클래스에 해당하고 쿠키 커터는 크기 및 모양이 같은 각 쿠키의 특징을 정의합니다. 클래스는 개체를 만드는데 사용됩니다. 또한 개체는 쿠키에 해당합니다.

 

개체는 개체 지향 프로그래밍의 기본 단위입니다. 개체는 클래스 인스턴스를 나타내는 응용 프로그램 요소이고 필드, 속성, 메서드 및 이벤트는 개체의 빌딩 블록이며 멤버를 구성합니다.

 

 

 

 

 

개체 지향 프로그래밍의 특성

 

 

진정한 개체 지향 프로그래밍을 위해서는 개체에서 캡슐화, 상속, 다형성을 지원해야 합니다.

 

 

1) 캡슐화

 

캡슐화는 서로 관련된 속성, 메서드 및 기타 멤버의 그룹을 하나의 단위나 개체로 취급하는 것을 말합니다. 개체는 속성의 변경 방법과 메서드의 실행 방법을 제어할 수 있습니다. 예를 들어, 개체는 속성 값이 유효한지 확인한 다음 속성 변경을 허용할 수 있습니다. 캡슐화를 사용하면 개체의 구현 세부 사항을 숨길 수 있으므로, 나중에 구현을 쉽게 변경할 수 있습니다.

 

 

2) 상속

 

상속은 기존 클래스를 기반으로 새로운 클래스를 만들 수 있는 능력을 나타냅니다. 새로운 클래스의 속성, 메서드 및 이벤트를 모두 상속 받으며 추가 속성 및 메서드를 사용자 지정할 수 있습니다. 예를 들어, "Car" 클래스를 기반으로 "Truck" 이라는 새 클래스를 만들 수 있습니다. "Truck" 클래스는 "Car" 클래스에서 "Color" 속성을 상속 받으며 "FourWhellDrive"와 같은 추가 속성을 가질 수 있습니다.

 

 

3) 다형성

 

다형석은 동일한 속성 또는 메서드를 각각 다른 방식으로 구현하는 여러 클래스를 서로 교체하여 사용할 수 있음을 의미합니다. 다형성이 제공될 경우 현재 사용되고 있는 개체 형식에 관계없이 동일한 이름을 갖는 여러 항목을 사용할 수 있으므로 개체 지향 프로그래밍 방식에서 다형성이 필요합니다. 예를 들어 "Car"라는 기본 클래스가 제공될 경우 프로그래머는 다형성을 활용하여 모든 파생 클래스에 대해 다른 "StartEngine" 메서드를 정의할 수 있습니다. 다른 프로시저 또는 메서드는 현재 사용되고 있는 "Car" 개체의 형식에 관계없이 동일한 방법으로 파생 클래스의 "StartEngine" 메서드를 사용할 수 있습니다.

 

 

 

 

 

클래스 용어 

 

 

1) 필드 (또는 속성(Property))

 

필드는 직접 읽거나 설정할 수 있기 때문에 변수와 비슷합니다. 예를 들어 'Car'라는 개체가 있는 경우 'Color'라는 필드에 해당 색을 지정할 수 있습니다. 속성 또한 필드처럼 검색되고 설정됩니다. 그러나 값이 설정되고 반환되는 방식이 보다 강력하게 제어할 수 있도록 하는 속성 Get 또는 Set 프로시저를 통해 구현됩니다. 저장되는 값과 이 값을 사용하는 프로시저 간의 간접 참조 계층을 사용하면 데이터를 쉽게 격리할 수 있을 뿐만 아니라 값을 지정하거나 검색하기 전에 해당 값이 유효한지 여부를 확인할 수 있습니다.

 

 

2)  메서드

 

메서드는 개체에서 수행할 수 있는 동작을 나타냅니다. 예를 들어 'Car'개체는 'StartEngin', 'Drive' 등의 메서드를 가질 수 있습니다. 클래스에 Sub 루틴 또는 Function 함수에 해당하는 프로시저를 추가하여 메서드를 정의합니다.

 

 

3) 이벤트

 

이벤트는 개체가 다른 개체나 응용 프로그램에서 받거나 다른 개체나 응용 프로그램으로 전송하는 알람입니다. 이벤트를 사용하면 특정 상황이 발생할 때마다 개체가 동작을 수행할 수 있습니다.

 

 

 

 

클래스의 개념

 

클래스는 개체를 기호로 나타낸 것입니다. 클래스와 개체라는 단어가 쉽게 혼돈되는데, 클래스는 개체의 구조를 설명하는 프로그래밍 코드로 정의된 것이라면 개체는 사용 가능한 클래스의 인스턴스를 나타냅니다. 각 인스턴스는 해당 클래스의 동일하면서도 고유한 복사본입니다. 개체는 클래스의 인스턴스이므로 개체를 만드는 작업을 인스턴스화라고 합니다. 

 

클래스가 다음과 같다면

 

Public Class Car

    Public Sub Go()

        ' Something to do.

    End Sub

End Class

 

 

개체는 다음과 같습니다.

 

Dim car As New Car()

 

 

즉, 청사진이 빌딩을 구성하는 항목을 설명하는 것과 마찬가지로 클래스는 개체를 구성하는 속성, 필드, 메서드 및 이벤트를 설명합니다. 여러 빌딩을 만드는데 하나의 청사진을 사용할 수 있는 것처럼 단일 클래스를 사용하여 원하는 수의 개체를 만들 수 있습니다. 청사진에 사람들이 액세스할 수 있는 빌딩의 특정 부분이 정의되어 있는 것처럼 클래스는 캡슐화를 통해 개체 항목에 대한 사용자의 액세스를 제어할 수 있습니다. 청사진에 비유한다면 클래스는 청사진이고 개체는 해당 청사진을 사용하여 만든 빌딩입니다.

 

대부분의 경우 한 개체의 데이터를 변경해도 다른 개체의 데이터는 변경되지 않습니다. 한 가지 예외로 Shared 한정자로 선언된 클래스 공유 멤버를 들 수 있습니다. 이 멤버는 특정 인스턴스와 독립적으로 존재합니다.

 

 

 

 

클래스를 통한 개체 생성


개체는 클래스의 인스턴스입니다. 클래스 멤버를 사용하려면 먼저 해당 클래스에서 개체를 만들어야 합니다. New 키워드를 사용하여 해당 클래스의 새 인스턴스를 초기화합니다. 이제 NextCustomer 개체 변수를 통해 클래스의 멤버에 액세스할 수 있습니다.

 

Dim nextCustomer As New Customer

 

nextCustomer.accountNumber = lastAccountNumber + 1

 

 

 

 

개체간의 관계

 

개체는 여러 방법으로 서로 연관될 수 있습니다. 기본적인 관계 유형으로는 계층 관계와 포함 관계가 있습니다.

 

 

1) 계층관계

 

클래스가 더 기본적인 클래스에서 파생된 경우 두 클래스는 계층 관계에 있다고 합니다. 클래스 계층 구조는 좀 더 일반적인 클래스의 하위 형식에 해당하는 항목을 설명할 때 유용합니다. 예를 들어, System.Windows.Forms 네임스페이스에 Label과 TextBox 클래스는 모두 Control 클래스에서 파생되었습니다. 파생 클래스는 기반하는 클래스에서 멤버를 상속하므로 클래스 계층 구조를 점점 더 복잡하게 형성할 수 있습니다. 

 

 

2) 포함관계

 

포함관계는 다른 개체는 논리적으로 캡슐화합니다. 예를 들어 OperationSystem 개체는 Version 속성을 통해 반환되는 Version 개체를 논리적으로 포함합니다. 컨테이너 개체에 다른 개체가 실제로 포함되는 것은 아니다.

 

 

 

 

Visual Basic에서 개체 지향

 

개체는 Form 또는 Label과 같은 클래스의 인스턴스를 나타냅니다. 비공유 멤버에 액세스하려면 먼저 개체를 만들어야 합니다. 이렇게 하려면 New 키워드를 사용하여 개체를 만들 클래스를 지정하고 개체 변수에 새 개체를 할당합니다.

 

Dim warningLabel As New System.Windows.Forms.Label

 

멤버에 액세스 할 때는 개체 이름, 마침표(.) 및 멥머 이름 순으로 지정하여 개체의 멤버에 액세스합니다. 다음 예제에서는 Label 개체의 Text 속성을 설정합니다.

 

warningLabel.Text = "Data not saved"

 

필드 및 속성은 개체에 저장된 정보를 나타냅니다. 이 값을 검색하고 설정하려면 프로시저의 지역 변수를 검색하고 설정할 때와 동일한 방법으로 대입문을 사용합니다. 다음 예제에서는 Label 개체의 Width 속성을 검색하고 ForeColor 속성을 설정합니다.

 

Dim warningWidth As Integer = warningLabel.Width

warningLabel.ForeColor = System.Drawing.Color.Red

 

메서드는 개체에서 수행할 수 있는 작업입니다. 예를 들어, Add는 콤보 상자에 새 항목을 추가하는 ComboBox 개체의 메서드입니다. 다음 예제에서는 Timer 개체의 Start 메서드를 보여 줍니다.

 

Dim safetyTimer As New System.Windows.Forms.Timer

safetyTimer.Start()

 

이벤트는 마우스 클릭 또는 키 누르기 등 개체에서 인식하고 코드를 작성하여 응답할 수 있는 작업입니다. 이벤트는 사용자 동작 또는 프로그램 코드의 결과로 발생하거나 시스템에 의해 발생될 수 있습니다. 이벤트에 대한 신호를 보내는 코드를 가리켜 이벤트를 발생시킨다고 하고, 이 신호에 응답하는 코드를 가리켜 이벤트를 처리한다고 합니다.

 

Visual Basic 2008에서는 데이터 형식에 대한 클래스 정의를 작성하지 않고 개체를 만들 수 있는 익명 형식이 도입되었습니다. 대신 컴파일러가 클래스를 생성합니다. 이 클래스는 사용할 수 있는 이름이 없고 Object에서 직접 상속하며 개체를 선언할 때 지정하는 속성을 포함합니다. 데이터 형식의 이름이 지정되어 있지 않기 때문에 이를 익명 형식이라고 합니다.

 

다음 예제에서는 변수 product를 Name 및 price라는 두 개의 속성을 가지는 익명 형식의 인스턴스로 선언합니다.

 

Dim product = New With {Key .Name = "paperclips", .price = 1.29 }

 

쿼리 식에서는 익명 형식을 사용하여 쿼리에서 선택한 데이터 열을 결합합니다. 특정 쿼리에서 선택할 수 있는 열을 예측할 수 없으므로 결과 형식을 미리 정의할 수 없습니다. 익명 형식을 사용하면 열을 그 수나 순서에 제한없이 선택하는 쿼리를 작성할 수 있습니다. 컴파일러에서 지정된 속성 및 지정된 순서와 일치하는 데이터 형식을 만듭니다.

 

Dim namePriceQuery = From prod In products _

                              Select prod.Name, prod.Price