인터페이스 - 약속의 의미
클래스는 객체의 청사진이라면 인터페이스는? 클래스의 청사진
즉, 클래스가 해야하는 행동 (= 메소드)를 결정
인터페이스의 실제 선언 예)
interface ILogger
{
void WriteLog( string Message ); //구현부가 없다!
}
- 선언할 떄 주로 인터페이스 이름 앞에 I를 붙이는 것이 관례
- 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있는데 구현부가 없다.
- 클래스는 접근 제한 한정자로 수식하지 않으면 기본적으로 private으로 선언되지만,
인터페이스는 접근 제한 한정자를 사용할 수 없고 모든 것이 public으로 선언된다
- 그리고 인터페이스는 인스턴스도 만들 수 없다
- 하지만, 이 인터페이스를 상속받는 클래스의 인스턴스를 만드는 것은 가능하다
- 이 때, 파생클래스는 인터페이스에 선언된 모든 메소드(및 프로퍼티)를 구현해줘야 하며(사실상 오버라이딩이다)
, 이 메소드들은 public한정자로 수식해야 한다. (인터페이스가 모두 public으로 선언되니까)
그래서
인터페이스는 클래스가 따라야 하는 약속이자 클래스의 청사진인 것!
이 '약속'은 인터페이스로부터 파생될 클래스가 어떤 메소드를 구현해야 할지를 정의한다
ILogger 인터페이스를 상속받는 파생 클래스의 예)
class ConsoleLogger : ILogger
{
public void WriteLog(string message)
{
Console.WriteLine("{0} {1}",
DateTime.Now.ToLocalTime(),message);
}
}
이처럼 상속받는 파생클래스는 ILogger의 WriteLog()를 반드시 구현하도록 강제받는다
이렇게 선언한 클래스는 다음과 같이 인스턴스화 가능(=> 부모인터페이스 형식으로 파생클래스의 인스턴스 생성)
ILogger logger = new ConsoleLogger();
logger.Writelog( "Hello, World");
=> 이 코드에 나타난 것처럼 인터페이스는 인스턴스를 못 만들지만, 참조는 만들 수 있다
이 참조에 파생클래스의 객체의 위치를 담는 것.
클래스 형변환에서 파생클래스는 기반 클래스와 같은 형식으로 간주한다고 했다.(자동 업캐스팅)
이것은 인터페이스와, 상속받는 클래스의 관계에도 그대로 적용
=> ConsoleLogger의 객체는 ILogger의 객체로 취급할 수 있다