인터페이스는 상속 받을 클래스에 기능이나 속성을 지정하는 역할을 합니다. 일반적인 상속관계와 비슷하다고 볼 수 있지만 살짝 다른 개념입니다. 우선 C#에서는 C++과 다르게 하나의 부모 클래스만 상속 받을 수 있습니다. 따라서 여러가지 기능들을 사용할 경우 하나의 부모 클래스에서 기능을 상속 받아 자식 클래스에서 정의를 하게 됩니다.
하지만 이런 경우 부모 클래스에 너무 많은 기능이 들어가게 되고, 이런 경우 부모 클래스가 무슨 기능을 하는 클래스인지 명확하게 구분하기 어려워집니다. 그렇기 때문에 C#에서는 인터페이스를 이용하여 기능을 추가적으로 구현할 수 있게 도와줍니다.
예를 들면 자동차라는 클래스가 부모 클래스이고, 자동차라는 클래스를 상속 받아서 여러 회사의 자동차를 만든다고 가정해보겠습니다. 부모 클래스인 자동차에는 기본적인 기능만 들어가게 됩니다. 예를 들면 가속, 감속, 핸들 조종과 같은 자동차가 가져야할 기본적인 기능들이 자동차 클래스에 있는 것입니다.
여기에 각 회사별로 특별한 기능들이 있겠죠? 이런 기능들은 인터페이스로 정의를 하는 것입니다. 예를 들면 크루즈 모드는 라는 인터페이스를 만들어서 A, B라는 회사에서 나오는 자동차들은 크루즈 모드가 있기 때문에 크루즈 모드 인터페이스를 상속 받게 됩니다. 또 B, C라는 회사에서 출시되는 자동차에는 자율주행이라는 기술이 들어가 있다고 하면, 자율 주행 인터페이스를 만들어서 B, C 자동차 클래스에 상속을 하게 됩니다.
그럼 이제 코드로 한번 살펴보겠습니다. 우선 자동차 클래스입니다.
이런 식으로 추상 클래스로 BaseCar라는 클래스를 구현할 수 있겠죠. 이제 각 제조사마다 자동차들은 이 BaseCar라는 클래스를 상속받아 자신들의 고유한 자동차를 만들 것인데요. 이때 인터페이스로 두가지 기능을 미리 선언해주겠습니다. 첫 번째 인터페이스는 크루져 모드, 두 번째 인터페이스는 자율주행입니다.
이렇게 두가지 인터페이스를 구현하였습니다. 인터페이스는 실제 기능은 구현하지 않고 이런 기능을 사용할 것이다라는 정의만 하고 실제 구현은 클래스에 구현하게 됩니다.
이제 A 자동차를 구현하도록 하겠습니다. A 자동차는 BaseCar와 ICruiserable를 상속받는데요.
이런식으로 구현합니다. 이때 에러가 나는 것을 볼 수 있는데요. BaseCar에 함수와 ICruiserable의 함수를 A_Car에서 구현하지 않았기 때문에 이런 에러가 생기는 것입니다.
이런식으로 구현을 해주면 에러가 안나게 됩니다. 이때 빨간줄이 나온 곳에 마우스를 올려놓고 Ctrl + . 을 누르게 되면 쉽게 자동으로 구현해줍니다. throw new NotImplementedException() 을 지워주고 원하는 기능을 구현하면 됩니다. 이런 방법으로 자동차 A, B, C를 구현하면 됩니다.
여기서부터는 클래스 구조를 잘 잡아 필요한 기능을 미리 구현하고 상속 받도록 하여 중복된 개발이 되지 않으면서 클래스가 잘 구현되도록 해야합니다. 그리고 C#에서 인터페이스를 사용하면서 좋은 점은 해당 클래스를 인터페이스로 구분 할 수 있어요.
예를 들면 ICruiserable만 상속받은 자동차들만 함수로 입력을 받고 싶을때 Type을 ICruiserable로 하면 해당 클래스에서 ICruiserable이 없는 클래스는 입력을 받을 수 없게 됩니다. 또 함수 내부에서는 Type을 비교하여 Boxing/ UnBoxing이 가능하기 때문에 마치 여러 클래스를 상속받아 사용하는 것과 같은 효과를 볼 수 있습니다. C#에서는 다중 상속이 불가능하기 때문에 인터페이스를 잘 활용한다면 큰 도움이 됩니다.
'C# Programming' 카테고리의 다른 글
C# - sealed class 들어봤니? (0) | 2019.07.12 |
---|---|
C# - 추상 클래스, 가상 클래스 - abstract, virtual 사용법 (2) | 2019.07.11 |
C# - ConcurrentBag 사용법, 안전하게 데이터 관리하기 (0) | 2019.07.09 |
C# - Parallel 사용법, 병렬처리 쉽게 하기 (0) | 2019.07.08 |
[C# Dictionary] 딕셔너리 활용법 (0) | 2019.06.29 |