본문 바로가기
IT/C#(CS)

CS 기초강좌 3. C# interface 인터페이스

by 신림83 2020. 10. 17.
반응형

CS 기초강좌 3. C# interface 인터페이스

c#에는 인터페이스라는 계념이 있습니다.

 

 일관된 형태의 라이브러리를 만들려고 할 때 관계성이 있는 클래스들이 사용하는 메서드의 이름을 약속하는 문법이다.

클래스는 만드는 사람과, 사용하는 사람이 인터페이스를 알고 있으면 메소드 들의 규칙성이 있음을 미리 알 수 있다.

 

다음 예를 보자.

자료구조를 구현할 때

using System;

class Vector
{
    public void Clear() { }
    public void Add() { }
    public void Remove() { }
}

class Queue
{
     //여기에도?
}

class Program
{
    static void Main(string[] args)
    {
        
    }
}

 위와 같이, 자료구조 클래스를 구현한다고 가정하자. Vector를 먼저 구현하고, 그다음 Queue를 구현하려 보니 이름이 같음 메소드가 필요할 것 같다. 구현은 다르겠지만, 왜냐? 자료구조를 제공할 끄으면 뭔가 일관된 규칙성이 있어야 사용자가 편할 것 아닌가. 그래서 다음과 같이 작업한다고 하자.

 

class Vector
{
    public void Clear() { }
    public void Add() { }
    public void Remove() { }
}

class Queue
{
    //여기에도?
    public void Clear() { }
    public void add() { } //a. ?? 뭔가 보이는가?
    public void Remove() { }
}

 그래서 Queue 에도 구현했다고 하자. Queue에서 add가 철자가 Vector와 다르다. 일관성이 떨어진다. 앞으로 당신이 추가적인 자료구조 스택, 리스트를 제공한다고 해도 아마도 똑같은 이름을 메소드를 제공해야 할 것이고, 이것은 어느 정도 규칙성이 가지게 될 것이다. 위와 같은 실수가 없으리라는 보장도 없고, 미리 자료구조에는 이런 규칙성이 있다고 명시적으로 표시하면 더욱 좋을 것이다.

 

이와 같은 경우에 인터페이스를 사용하면 좋다. 

아래 코드를 보자.

interface IData
{
    void Clear();
    void Add();
    void Remove();
}

class Vector : IData
{
    public void Clear() { }
    public void Add() { }
    public void Remove() { }
}

class Queue : IData
{
    public void Clear() { }
    public void Add() { }
    public void Remove() { }
}

 인터페이스를 쓰고 구현하지 않는다면, 친절하게 컴파일러가 오류를 알려준다.

 

인터페이서 선언이후 실제 메소드를 구현하지 않았을때.
특정 인터페이스가 아직 구현되지 않았다. 이름이 틀린것으로 구현한걸 찻기 그래도 쉽다.

 

c#이 인터페이스 라는 문법을 둔 이유는, 여러분은 분명 다양한 클래스를 설계하게 될 것이고, 다양성을 가진 클래스를 설계하게 될 것이다. 이럴 경우, 그들이 특정한 인터페이스를 가질 수 있는지 먼저 고민해보고, 가능하면 구현하는 것을 권장한다.

 

몇 가지 문법적 특성

interface IData
{
    void Clear();
    void Add();
    void Remove();
}

인터페이스의 메소드는 접근 지정자를 표기하지 않는다. public , proteced... 하지만 c# 8.0부터는 가능하다.

interface IData
{
    void Clear();
}

class Vector : IData
{
    public void Clear() { }
    public override void Clear() { } //x
    public virtual void Clear() { } //o
}

 인터페이스를 통하여 구현된 메소들들의 특성은 override가 아니다. 해당 메소드가 구현되어야 한다는 것이지 이미 구현된 것을 상속하는 것이 아니다. virtual은 될 수가 있다. 아니면 일반 함수로 제작해야 한다.

 

 

배우고 익혀서 건물주로..

봐주셔서 감사합니다.

 

반응형

댓글