[C# Basic] 인터페이스 사용법

업데이트:

C#의 기초부터 차근차근 다시 한 번 짚어보자.

이번에는 인터페이스를 작성하고 활용하는 방법에 대해 알아보자


* 인터페이스 선언
interface BonoBono{
    string Name {get; set;}
    
    void Talk();
    void Walk();
}
  • 인터페이스는 interface 키워드를 사용해 선언한다
  • 클래스와 비슷해 보이지만 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다.
  • 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티의 구현부가 없다.

  • 접근제한 한정자를 사용할 수 없고 클래스는 접근한정자가 없으면 private이지만, 인터페이스는 모두 public으로 선언된다.
* 인터페이스 사용
class Bono : BonoBono{
    public string Name {get; set;}
    
    public void Talk(){
        Console.WriteLine("Talk");
    }
    public void Walk(){
        Console.WriteLine("Walk");
    }
}
  • 인터페이스를 상속받는 클래스는 인터페이스의 모든 멤버를 구현해야 한다
  • 이 때 구현된 멤버들은 모두 public이어야 한다.
BonoBono bono = new Bono();  // 인터페이스를 이용한 참조 만들기
bono.Talk();
  • 인터페이스는 인스턴스를 못만들지만, 참조는 만들 수 있다.
  • 파생 클래스는 기반 클래스와 같은 형식으로 간주한다는 클래스의 규칙에 따라, 인터페이스를 상속받는 파생클래스는 인터페이스와 같은 형식으로 간주된다. 즉 위 예제에서 BonoBono 인터페이스와 Bono 클래스는 같은 형식으로 간주된다.
  • 인터페이스는 자신을 상속한 클래스가 반드시 어떤 멤버들을 구현하도록 강제한다. 즉 프로그래밍 시 하나의 약속을 정해놓는것이라 볼 수 있다.
* 인터페이스를 상속하는 인터페이스
interface Animal{
    // 내용
}

interface BonoBono : Animal{
    // 추가할 내용
}
  • 인터페이스 상속은 인터페이스를 수정할 수 없는 경우 사용해야 한다.
  • 상속하려는 인터페이스가 소스코드가 아닌 어셈블리로만 제공되는 경우. (.NET Framework SDK에서 제공하는 인터페이스 등) 어셈블리 안에 있으면 직접 수정할 수 없다. 따라서 인터페이스에 기능을 추가하고싶다면 상속받아서 기능을 추가해야 한다.
  • 상속하려는 인터페이스를 이미 많은 클래스가 사용하는 경우. 이 경우 인터페이스를 수정하고 되면 클래스들도 모두 수정해야 한다. (클래스는 인터페이스를 모두 구현해야 하므로) 기존 코드에 영향이 없게 하려면 인터페이스를 상속받는것이 나을 수 있다.
* 인터페이스 다중상속
  • 클래스는 여러 클래스를 한 번에 상속할 수 없다. 그 이유는 상속받는 클래스들의 메소드 이름이 동일한 경우 어떤것을 물려받을지 모호하기 때문이다.
  • 인터페이스를 상속받는 경우 여러 인터페이스를 상속받는 것이 가능하다. 그 이유는 인터페이스는 구현이 아닌 실체가 없는 약속에 불과하기 때문이다. 이름이 중복되더라도 단지 그것을 클래스에서 구현만 하면 된다.
  • 상속은 구현을 위한 장치가 아닌 다형성을 위한 장치로써 다양한 버전의 모습을 가질 수 있도록 한다.
* 추상클래스
abstract class Animal{
    public abstract void Talk();  // 추상메소드
    
    public void Walk(){
        Console.WriteLine("Walk");
    }
}

class BonoBono : Animal{
    public override void Talk(){
        Console.WriteLine("Talk");
    }
    
    public void Walk(){
        Console.WriteLine("Walk");
    }
    
}
  • 추상클래스는 인터페이스와 달리 구현을 가질 수 있다. 하지만 클래스와 달리 인스턴스는 가질 수 없다.
  • 추상클래스는 abstract 키워드로 선언한다.
  • 추상클래스는 추상메소드를 가질 수 있다. 동일하게 abstract 키워드를 사용한다.
  • 추상클래스는 상속받은 클래스는 추상메소드를 반드시 override 해야한다.
  • 추상클래스는 클래스와 같이 접근한정자가 없으면 private이다. 하지만 추상메소드는 파생클래스에서 반드시 구현해야하므로 public, protected, internal, protected internal 중 하나로 수식하지 않으면 C# 컴파일러가 수정하라고 말해줄 것이다.

  • 추상클래스가 추상클래스를 상속받은 경우 추상메소드는 구현하지 않아도 된다. 추상메소드는 인스턴스를 생성할 클래스에서 구현하면 된다

인터페이스와 추상클래스는 그것을 사용하는 프로그래머가 어떠한 구현을 만들도록 강제하는 역할을 한다.

카테고리:

업데이트: