C#/기본기

[C#] 인터페이스 - 1. 인터페이스는 약속이다

파워지훈 2023. 1. 20. 19:47

인터페이스 - 약속의 의미

클래스는 객체의 청사진이라면 인터페이스는? 클래스의 청사진 

즉, 클래스가 해야하는 행동 (= 메소드)를 결정 

 

인터페이스의 실제 선언 예)

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의 객체로 취급할 수 있다