본문 바로가기

[C#] 인터페이스(Interface)

C#
·
2020. 5. 11. 16:51
반응형

인터페이스(Interface)

인터페이스는 약속입니다. 차는 우측 방향으로 통행해야 하고, 초록불일때 통행을 해야하는 것 처럼 인터페이스는 클래스가 따라야 하는 약속을 정의합니다. 즉 인터페이스는 인터페이스로부터 파생된 클래스가 어떤 메소드를 구현할지를 정의합니다. 인터페이스에서 정의한 메소드는 파생된 클래스에서 반드시 구현해야 합니다.

인터페이스는 다음과 같은 특징을 가지고 있습니다.

  • 인스턴스를 만들 수 없음
  • 접근 제한자(Access Modifier)를 사용할 수 없고 모두 public으로 선언됨
  • 메소드(Method), 이벤트(Event), 인덱서(Indexer), 프로퍼티(Property)만을 가짐
  • 파생 클래스는 인터페이스에 선언되어 있는 모든 메소드(Method), 프로퍼티(Property)를 구현해야 함
  • 인터페이스는 인터페이스를 상속할 수 있음

인터페이스 문법은 다음과 같습니다.

interface IInterfaceName
{
    int PropertyName
    {
        get;
        set;
    }

    void MethodName(int num);
}

인터페이스에있는 프로퍼티, 메소드는 모두 public입니다. 인터페이스이름은 관례상 이름 앞에 I를 붙여서 작명합니다.

이해를 돕기위해 예를 들어 보겠습니다.
Score 클래스는 점수를 저장하는 클래스이고 점수를 다양한 형태의 파일로 저장하려고 합니다. 이때 인터페이스를 활용하면 다양한 형태의 파일로 저장할 수 있습니다. 다음은 인터페이스를 활용한 예제 코드입니다.

interface IFile
{
    void Save(List<int> item);
}

// 점수를 텍스트 파일로 저장하는 클래스
class TextFile : IFile
{
    public void Save(List<int> item)
    {
        string scoreText = "";

        for(int i=0; i<item.Count; i++)
        {
            scoreText += item[i].ToString();

            if (i < item.Count - 1)
                scoreText += " ";
        }

        File.WriteAllText("score.txt", scoreText);
        Console.WriteLine("txt 파일로 저장");
    }
}

// 점수를 CSV 파일로 저장하는 클래스
class CSVFile : IFile
{
    public void Save(List<int> item)
    {
        string scoreText = "";

        for (int i = 0; i < item.Count; i++)
        {
            scoreText += item[i].ToString();

            if (i < item.Count - 1)
                scoreText += ",";
        }

        File.WriteAllText("score.csv", scoreText);
        Console.WriteLine("csv 파일로 저장");
    }
}

class Score
{
    private List<int> scores;
    private IFile file;

    public Score()
    {
        scores = new List<int>();
    }

    public void SetFileType(IFile file)
    {
        this.file = file;
    }

    public void AddScore(int score)
    {
        scores.Add(score);
    }

    public void SaveScore()
    {
        if(file != null)
            file.Save(scores);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Score score = new Score();
        score.AddScore(100);
        score.AddScore(90);
        score.AddScore(80);
        score.AddScore(70);

        TextFile textFile = new TextFile();
        CSVFile csvFile = new CSVFile();

        score.SetFileType(textFile);
        score.SaveScore();
        score.SetFileType(csvFile);
        score.SaveScore();
    }
}

Score 클래스는 어떤 파일로 저장할지에 대한 클래스를 SetFileType(IFile file) 메소드로 설정한 후, Save(List<int> item) 메소드만 호출하면 점수가 해당하는 형태의 파일로 저장됩니다.

Score 클래스는 IFile 인터페이스를 상속받은 클래스라면 내부가 어떻게 구현 되어 있던 상관없이 그저 Save(List<int> item)만 호출해주면 되기 때문에 코드의 일관성을 높일 수 있습니다.

반응형
블로그 이미지
Frontend Engineer

댓글