삽질의 현장/- .NET

#043_닷넷(.NET)_.Net Framework 기본 - 인터페이스 (2)

shovelman 2015. 10. 29. 16:07


안녕하세요 삽잡이입니다.


이번 시간에는 지난시간에 이어 인터페이스를 알아보려고합니다.

지난 시간부터 이어서 쓰는 글인 만큼

시간이 나신다면 이전 글도 참고해주시길 바랍니다.


시작하겠습니다.



Interface는 암묵적으로 abstract, public 형식입니다.

그 이유는 인터페이스는 '서로 소통하려고 만든 약속'이기 때문입니다.

그래서 인터페이스는 하나의 타입이지만,

클래스와 관련성이 없는 '독립적인 타입'이라는 것입니다.


예를 들어서 Eat이라는 인터페이스는

Eat 인터페이스를 가지고 있는 객체들이라면, 모두 구현할 수 있습니다.

그런데 사람만 밥먹습니까? 동물도 밥 먹습니다...

그렇다면 이 동물객체들도 Eat이라는 기능을 가질 수 있는데

Eat 인터페이스를 가지고 있게 되면 동물객체이지만 Eat 메서드를 구현할 수 있게되지요...

즉, 각 다른 타입의 객체들을 통해 하나의 인터페이스로 다룰 수 있습니다.


추상화의 하이라이트! 최고의 정점에 서있는 것이 바로 인터페이스입니다...




상속은 '클래스간에 개념을 물려받는 것'을 의미합니다.

구현은 '인터페이스를 구현하는 것'을 의미하지요...


보통 MS의 명명법에 의해서 인터페이스의 경우 접두어로 'I'를 붙입니다.

아무튼...

A라는 클래스가 있다고 해보겠습니다.

A에서 B, C 클래스는 파생된 클래스이고, 

B, C 클래스는 A를 상속받은 클래스입니다.

여기서 A클래스는 IE 인터페이스를 구현했다고 이야기할 수 있습니다.


그런데 ID 인터페이스를 살펴보겠습니다.

IE, IF 인터페이스는 ID를 상속하고 있습니다.

말 그대로 물려받는 것입니다.

인터페이스의 기능도 상속이 된다 이겁니다.


닷넷은 단일 상속만을 지원합니다.

한마디로, B, C 객체는 G라는 객체를 추가적으로 상속받을 수 없습니다.


하지만, 인터페이스는 상관 없습니다.

다중 상속이 아닌, '다중 구현'일 뿐이기 때문이지요...

인터페이스는 상속이 아닌 구현이기 때문에 다중으로 갖는것이 가능합니다.


인터페이스 안에는 내부적으로 public, abstract가 들어있습니다.

자동으로 들어가기때문에 명시할 필요가 없습니다.


여기서 잠시 쉬는겸...

추상 클래스와 인터페이스의 차이점은 무엇일까요?


클래스는 개념 정의입니다.

추상 클래스라도 개념 정의가 있고, 인터페이스는 말 그대로 인터페이스일 뿐입니다.

추상 클래스는 인스턴스를 못만들어내는 개념 정의이지만 개념을 정의할 수 있습니다.


스타크래프트 마린, 질럿, 저글링이 있다고해봅시다.

이 셋은 모두 유닛이라는 공통 분모를 가지고 있습니다.

즉, 유닛이 최상위 클래스일 때, 

유닛에 공통적인 공격, 이동, 데미지 등 개념을 정의할 수있지 않겠습니까?


물론, 유닛이라는 클래스 안에는 보이지 않겠지만,

추상클래스로 개념을 정의할 수 있다 이겁니다.

이는 인터페이스로는 만들 수 없습니다.


인터페이스와 추상 클래스는 전혀 다른 부분입니다.

추상 클래스도 추상 메서드 집합으로 만들 수는 있습니다.

하지만, 개념상 클래스는 개념정의, 인터페이스는 인터페이스자체를 정의하는 것이기 때문에

비교자체가 불가하다 이겁니다.


이 인터페이스에는

메서드, 속성 시그니처, 그리고 이벤트가 들어갈 수 있습니다.

이벤트는 나중에 알아보기로 하고...

아무튼... 인터페이스는 인스턴스화가 불가능한 사실을 기억하시길바랍니다.


구조체는 어떤 것도 상속, 파생할수 없습니다.

구조체는 무조건 value 타입으로 상속받아야되기 때문입니다.

값 타입은 또한 sealed로 되어있기 때문에 파생도 불가합니다.

그런데, 인터페이스는 가능합니다. 단지 기능만 구현한 것이기 때문입니다.


인터페이스를 표현하는 방법에는 두가지 방법이 있습니다.




<<, >> 라는 스테레오를 붙이는 첫번째 UML 표기법과

핸들링 할 수 있다는 의미를 가진 MS에서 제공해주는 두번째 표기법이 있습니다.

(1)는 구조를 보기 편하다는 장점이 있고,

(2)는 어떤 클래스가 어떤 인터페이스를 가지고 있는지 명확하게 보여주군요...



이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!