-
[기술 면접 공부] 인터페이스기술 면접 공부 2021. 1. 6. 20:59
요약
- 추상 멤버만 갖는 추상 기본 클래스와 같다
- 인터페이스를 구현하는 모든 클래스, 구조체는 모든 멤버를 구현해야 한다
- 직접 인스턴스화 할 수 없고, 인터페이스를 구현하는 클래스, 구조체에 의해 구현된다
- 클래스, 구조체는 여러 인터페이스를 구현할 수 있다
인터페이스 (Interface)
정의
- 메서드 원형들의 집합에 이름을 붙인 것, 작은 논리적인 메서드 집합
- 클래스 및 구조체로 구현할 수 있는 규약
- 구현 객체의 같은 동작을 보장하기 위한 목적
특징
- 선언(Declaration)은 있고, 정의(Definition)는 없다
- 다중 상속이 가능하다
- C#의 Property는 내부적으로 메서드로 구현되기 때문에 포함할 수 있다
- C#의 컴파일러는 인터페이스 메서드를 구현할 때, public으로 선언하도록 요구한다
- 인터페이스를 상속 받을 경우 모든 멤버에 대한 구현을 제공해야 한다
- 인터페이스 자체는 new로 인스턴스화가 불가하지만 인터페이스 배열은 만들 수 있다
제약
- 생성자 메서드를 정의할 수 없다
- 정적 멤버를 정의할 수 없다
- 다른 인터페이스를 상속받을 수 있지만 구조체/클래스를 상속받을 수는 없다
사용해야 하는 이유
- 인터페이스가 상속보다 더욱 유연한 다형성을 제공한다
- 다형성이란 하나의 객체를 여러 타입으로 바라보는 것인데 여러 개를 동시에 가질 수 있는 인터페이스는 상속에 비해 더 큰 유연함을 제공한다
- 클래스 간의 결합도를 줄임으로써 유지보수성을 향상시킬 수 있다
- 해당 클래스가 인터페이스에 정의된 메서드를 사용하는 객체라는 것이 보장되어 있기 때문에 클래스 내부의 수정이 일어나도 외부 수정은 불필요하다
명시적 인터페이스 구현
클래스가 시그니처가 동일한 멤버를 포함하는 두 인터페이스를 구현하는 경우, 해당 멤버를 클래스에 구현하면 양쪽 모두가 해당 멤버를 구현에 사용한다.
public interface IControl { void Paint(); } public interface ISurface { void Paint(); } public class SampleClass : IControl, ISurface { // Both ISurface.Paint and IControl.Paint call this method. public void Paint() { Console.WriteLine("Paint method in SampleClass"); } }
SampleClass sample = new SampleClass(); IControl control = sample; ISurface surface = sample; // The following lines all call the same method. sample.Paint(); control.Paint(); surface.Paint(); // Output: // Paint method in SampleClass // Paint method in SampleClass // Paint method in SampleClass
이때 두 인터페이스의 멤버가 동일한 기능을 수행하지 않을 경우, 둘 중 하나 또는 둘 다 잘못 구현될 수 있다. 이런 상황에서 인터페이스를 통해서만 호출되고 해당 인터페이스에만 관련되는 클래스 멤버를 만드는 방식으로 인터페이스 멤버를 명시적으로 구현할 수 있다.
public class SampleClass : IControl, ISurface { void IControl.Paint() { System.Console.WriteLine("IControl.Paint"); } void ISurface.Paint() { System.Console.WriteLine("ISurface.Paint"); } }
이 경우 Paint() 메서드는 인터페이스를 통해서만 사용할 수 있고 클래스에서 직접 사용할 수 없다.
SampleClass obj = new SampleClass(); //obj.Paint(); // Compiler error. IControl c = obj; c.Paint(); // Calls IControl.Paint on SampleClass. ISurface s = obj; s.Paint(); // Calls ISurface.Paint on SampleClass. // Output: // IControl.Paint // ISurface.Paint
자주 나오는 질문
인터페이스와 추상(abstract) 클래스의 차이점과 장단점
- 한 클래스가 다수의 추상 클래스를 상속받을 수 없지만 여러 개의 인터페이스를 가질 수 있다
- 추상 클래스는 추상 메서드 이외에 실제 구현된 메서드나 필요한 필드들을 가질 수 있고 이를 파생 클래스에서 사용하게 할 수 있다
- 추상 클래스보다 인터페이스를 많이 쓰는 이유는 가독성 때문이다. 추상 클래스는 필드를 가질 수 있어 코드를 봤을 때 살펴보아야 할 것들이 여러 가지이지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있다
'기술 면접 공부' 카테고리의 다른 글
[기술 면접 공부] C#의 메모리 구조 (0) 2021.01.07 [기술 면접 공부] C#의 메모리 관리 (0) 2021.01.07 [기술 면접 공부] 싱글톤 패턴 (0) 2021.01.06 [기술 면접 공부] 추상 클래스, abstract (0) 2021.01.06 [기술 면접 공부] 가상 함수, virtual (0) 2021.01.06