VB.NET 2008/VB - 개체지향

개체지향 - 인터페이스(interface)를 사용해야 하는 이유

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

 

 

인터페이스의 역할

 

인터페이스는 클래스에서 구현할 수 있는 속성, 메서드 및 이벤트를 정의한다. 인터페이스는 클래스와 마찬가지로 속성, 메서드 및 이벤트를 정의하지만 클래스와 달리 구현을 제공하지 않는다. 인터페이스는 클래스에 의해 구현되며 클래스와 별개로 정의된다.

 

인터페이스는 계약을 나타내므로 인터페이스를 구현하는 클래스는 해당 인터페이스에서 정의한 모든 부분을 그대로 정확하게 구현해야 한다.

 

인터페이스를 사용하면 서로 밀접하게 관련된 멤버들의 작은 그룹으로 여러 기능을 정의할 수 있다. 기존의 코드를 손상시키지 않고 인터페이스에 대한 확장 구현을 개발할 수 있으므로 호환성 문제를 최소화시킬 수 있다. 이렇게 하면 기존 코드를 손상시키지 않고도 인터페이스의 확장 구현을 개발할 수 있으므로 호환성 문제가 줄어든다. 또한, 언제든지 추가적인 인터페이시의 구현을 개발하여 새 기능을 추가할 수 있다.

 

인터페이스 구현을 발전시킬 수는 있지만 인터페이스 자체는 게시된 이후에 변경될 수 없다. 게시된 인터페이스를 변경하면 기존에 구현된 클래스가 손상된다. 인터페이스는 하나의 계약으로 해당 계약의 양 당사자에게는 지켜야 할 의무가 있다. 즉, 인터페이스의 게시자는 해당 인터페이스를 변경하지 않을 것에 동의하며, 구현자는 해당 인터페이스를 디자인된 그대로 정확히 구현할 것에 동의한다.

 

 

 

인터페이스의 선언

 

인터페이스는 Interface 문과 End Interface 문 내에 포함된다.

 

Public Interface IClass

    ' 이벤트 정의

    Event PressEnterKey(ByVal sender As Object, ByVal e As KeyEventArgs)

    ' 메소드 정의

    Sub GetRadioButtonValue()

End Interface

 

 

Interface 문 다음에는 하나 이상의 상속된 인터페이스를 나열하는 선택적 Inherits 문을 추가할 수 있다. Inherits 문은 주석을 제외하고 선언에 포함된 모든 문 앞에 와야 한다.

 

인터페이스에는 구현 코드나 구현 코드와 관련된 문(예: End Sub, End Property 등)은 포함될 수 없다.

 

 

 

인터페이스의 구현 클래스 정의

 

인터페이스의 구현은 Implements 키워드를 사용하여 구현된다. Implements 키워드는 두 가지 방식으로 사용되는데, 클래스 또는 구조체에서 인터페이스를 구현한다는 것을 나타내고, 클래스의 멤버 또는 구조체 멤버가 특정 인터페이스 멤버를 구현한다는 것을 나타낸다.

 

클래스 또는 구조체에서 인터페이스를 구현할 경우 Class 또는 Structure 문 바로 뒤에 Implements 문을 사용하여 구현할 인터페이스 목록을 쉼표로 구분해 지정한다. 또한, 클래스 또는 구조체는 Implements 키워드를 사용하여 모든 인터페이스 멤버를 구현해야 한다.

 

Public Class ClassA

    Implements IClass

 

    Public Event PressEnterKey(ByVal sender As Object, ByVal e As KeyEventArgs) _

        Implements IClass.PressEnterKey

 

    Public Sub GetRadioButtonValue() Implements IClass.GetRadioButtonValue

        Return RadioButton1.Value

    End Sub

 

End Class

 

 

멤버를 구현할 때는 매개 변수 형식과 반환 형식이 인터페이스의 선언과 일치해야 한다. 인터페이스의 요소를 구현하는 가장 일반적인 방법은 앞의 예제와 같이 해당 인터페이스와 동일한 이름의 멤버를 사용하는 것이다.

 

인터페이스 멤버의 구현을 선언할때는 Overloads, Overrides, Overridable, Public, Private, Protected, Friend 등 선언에 유효한 특성을 사용할 수 있다.

 

 

 

인터페이스를 사용할 때 얻을 수 있는 장점

 

인터페이스는 개체를 생성할 때 포괄적인 방법을 제공한다. 구체적인 구현 개체를 선언하지 않고 인터페이스를 통해 구현 개체를 접근할 수 있기 때문이다.

 

Dim obj As IClass = New ClassA()

 

즉, 인터페이스에 정의된 멤버에만 접근할 수 있는 제한된 접근 방법과 구현된 개체를 변경해도 일관된 방법으로 처리할 수 있는 장점을 얻을 수 있다.

 

 

 

인터페이스와 상속의 장단점

 

인터페이스는 개체의 정의와 구현을 분리할 수 있는 강력한 프로그래밍 도구이다. 인터페이스를 사용하는 방법과 클래스를 상속하는 방법에는 장단점이 있으므로 프로젝트에서 이 둘을 함께 사용하는 것이 좋다.

 

그렇다면 언제 인터페이스를 사용하고 언제 상속을 사용해야 하는가?

 

상속을 사용해야 할 때는

  • 상속 계층 구조가 '포함' 관계가 아니라 '동등' 관계를 나타내는 경우. (예: 사람으로 치면 철수, 영희 등)
  • 기본 클래스의 코드를 다시 사용할 필요가 있는 경우.
  • 다른 데이터 형식에 같은 클래스 및 메서드를 적용해야 하는 경우.
  • 클래스 계층 구조가 비교적 얕으며 다른 개발자들이 더 많은 수준을 추가할 가능성이 적은 경우.
  • 기본 클래스를 변경하여 파생 클래스 전체를 변경하고자 하는 경우.

구현을 사용해야 할 때는

  • 응용 프로그램에서 특정 기능을 제공하기 위해 서로 관련되지 않은 여러 가지 개체 형식이 필요로 하는 경우.
  • 인터페이스의 경우 한번만 구현을 정의하여도 여러 개의 인터페이스가 구현되므로 기본 클래스보다 좀 더 융통성이 있다.
  • 기본 클래스에서 구현을 상속해야 할 필요가 없는 경우.
  • 인터페이스는 클래스를 상속할 수 없는 경우 유용하다. (예: 구조체는 상속될 수 없지만 인터페이스 구현은 가능)