[C#] 8.1.4 인터페이스에 캡슐화 가능한 멤버

인터페이스에는 메서드 외에도 속성, 이벤트, 인덱서를 멤버로 캡슐화할 수 있습니다. 속성과 인덱서는 get블록과 set블록은 원하는 블록만 것을 선택적으로 약속할 수 있으며 이벤트에 대해서는 9장 대리자와 이벤트에서 다루기로 하겠습니다.

다음은 인터페이스에 멤버 속성과 멤버 인덱서를 캡슐화하는 예제 코드입니다. 인터페이스 IMemo에서는 기록할 수 있는 메모의 최대 개수를 가져올 수 있는 MaxCount 속성과 원하는 위치에 메모를 설정하거나 가져올 수 있는 인덱스를 약속하였습니다.

▶ 인터페이스에 멤버 속성과 인덱스를 캡슐화

interface IMemo
{
    int MaxCount
    {
        get;
    }
    string this[int index]
    {
        get;
        set;
    }
}

이번에는 IMemo를 구현 약속하는 Note 클래스를 만듭시다. Note 클래스에는 IMemo에서 약속된 멤버들을 구체적으로 구현해야 합니다.

▶ 속성과 인덱스를 캡슐화한 인터페이스를 구현 약속

class Note : IMemo
{
    public int MaxCount
    {
        get
        {
            return 0;
        }
    }
    public string this[int index]
    {
        get;
        set;
    }
}

Note 클래스 생성자에서는 노트의 페이지 수를 입력 인자로 받아 최대 보관할 수 있는 메모의 개수를 정하고 메모를 남길 수 있는 페이지들을 생성합시다. 이를 위해 MaxCount의 set 블록을 추가하고 메모를 남길 수 있는 페이지를 위해 문자열 배열을 멤버로 추가할게요. 물론, set 블록은 노트 내부에서만 접근할 수 있게 private으로 접근 지정해야겠지요. 그리고 인덱서에서는 접근하려고 하는 index가 유효하면 남겨진 메모를 설정하거나 가져오기를 할 수 있게 구현합시다.

▶ Note 클래스 구현

class Note : IMemo
{
    string[] pages = null;

    public int MaxCount  //IMemo에서 약속한 속성 구현
    {
        get; //IMemo에서 약속한 블록
        private set; //IMemo에서 약속하지 않은 블록이지만 추가했음
    }
    public string this[int index] //IMemo에서 약속한 인덱서 구현
    {
        get
        {
            if (AvailIndex(index))
            {
                return pages[index];
            }
            return null;
        }
        set
        {
            if (AvailIndex(index))
            {
                pages[index] = value;
            }
        }
    }
    public Note(int max_memo)
    {
        MaxCount = max_memo;
        pages = new string[max_memo];
    }
    private bool AvailIndex(int index)
    {
        return (index >= 0) && (index < MaxCount);
    }
}

다음은 Note 클래스를 사용하는 간단한 예제입니다.

▶ Note 클래스 사용 예

class Program
{
    static void Main(string[] args)
    {
        Note note = new Note(3);
        Console.WriteLine("최대 {0}개의 메모를 남길 수 있습니다. ", note.MaxCount);
        note[0]="1시 강의";
        note[1]="5시 미팅";
        Console.WriteLine("메모 리스트");
        for (int i = 0; i < note.MaxCount; i++)
        {
            Console.WriteLine("{0}:{1}", i + 1, note[i]);
        }
    }
}

▶ 실행 결과

최대 3개의 메모를 남길 수 있습니다.
1:1시 강의
2:5시 미팅
3: