본문 바로가기

C#

인터페이스 Interface

인터페이스 Interface

interface 선언 방법:

interface 인터페이스이름
{
	반환_형식 메소드이름1 (매개변수_목록);
    	반환_형식 메소드이름2 (매개변수_목록);
}

인터페이스의 선언은 클래스와 비슷하지만 메소드, 이벤트, 인덱서, 프로퍼티만을 가질 수 있다.

interface ILogger
{
	void WriteLog(string message)
}

인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있는데 그나마도 구현부가 없다.

그리고 클래스는 접근 한정자로 수식하지 않으면 기본적으로 private 로 선언되지만, 인터페이스는 접근 제한 한정자를 사용할 수 없고 모든 것이 public 으로 선언된다. 그리고 인터페이스는 인스턴스를 만들 수가 없다.

 

 

1. 선언된 모든 메소드를 구현해줘야 하며, 이 메소드들은 public으로 수식해야 한다.

 

 

2. 퍼블릭으로 수식하지 않았을 때나, 인터페이스에서 선언한 함수를 구현하지 않으면 오류가 뜬다.

 

3. 인터페이스는 객체를 만들 수 없다.

이 코드에 나타난 것처럼 인터페이스는 인스턴스를 못 만들지만, 참조는 만들 수 있다. 참조에 파생 클래스의 객체의 위치를 담는 것이다. 파생 클래스는 기반 클래스와 같은 형식으로 간주하기 때문에 이것은 인터페이스와 인터페이스를 상속한 클래스의 관계에도 적용된다. 즉, ConsoleLogger의 객체는 ILogger의 객체로 취급할 수 있다.

 

 

요약

- 인터페이스는 메소드, 인벤트, 인덱서 프로퍼티만 가질 수 있다.

- 모든 것이 public으로 선언된다.

- 인터페이스의 인스턴스는 만들 수 없다. 다만, 상속받은 클래스의 객체를 넣어 인터페이스의 인스턴스인 것 처럼 사용할 수 있다.

- 선언된 모든 메소드를 구현해줘야 하며, 이 메소드들은 public으로 수식해야 한다.

 

 

인터페이스 예시

class Program
    {
        static void Main(string[] args)
        {
            IsekaiIdol IseDol = new IsekaiIdol(new Logger());
            IseDol.start();
        }    
    }

    interface ILogger
    {
        void WriteLog(string message);
    }

    class Logger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine(message);
        }
    }
    class IsekaiIdol
    {
        ILogger logger;
        public IsekaiIdol(ILogger logger)
        {
            this.logger = logger;
        }

        public void start()
        {
            while (true)
            {
                Console.WriteLine("원픽을 입력하세요");
                string name = Console.ReadLine();
                if (name == "")
                {
                    break;
                }
                logger.WriteLog($"제 원픽은: {name} 입니다");
            }
        }
    }

 

 

 

참조: 이것이 C#이다.

'C#' 카테고리의 다른 글

인터페이스 interface - 3 인터페이스의 기본 구현 메소드  (0) 2022.05.16
인터페이스 interface - 2 인터페이스를 상속하는 인터페이스  (0) 2022.05.16
튜플  (0) 2022.05.13
구조체 struct  (0) 2022.05.13
확장 메소드  (0) 2022.05.13