인터페이스에는 메서드 외에도 속성, 이벤트, 인덱서를 멤버로 캡슐화할 수 있습니다. 속성과 인덱서는 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: