ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기술 면접 공부] 인터페이스
    기술 면접 공부 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) 클래스의 차이점과 장단점

    • 한 클래스가 다수의 추상 클래스를 상속받을 수 없지만 여러 개의 인터페이스를 가질 수 있다
    • 추상 클래스는 추상 메서드 이외에 실제 구현된 메서드나 필요한 필드들을 가질 수 있고 이를 파생 클래스에서 사용하게 할 수 있다
    • 추상 클래스보다 인터페이스를 많이 쓰는 이유는 가독성 때문이다. 추상 클래스는 필드를 가질 수 있어 코드를 봤을 때 살펴보아야 할 것들이 여러 가지이지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있다

     

Designed by Tistory.