C# – Collection : IEnumerable 인터페이스 상속 과 구현

 IEnumerable , IEnumerator

일반적으로 한 번에 많은 자료를 다루기 위해서 Array ,List 및 Dictionary  처럼  배열 구조를 가지는 Collection 객체들을  활용한다.   그리고 그 객체들을 순차/반복적인 접근하기위해   foreach 와 같은 함수를 활용하여 접근을 하는데,  내가만든 Collection(클래스) 객체도  foreach 에서 순차적으로 접근하여
처리 할 수 있도록 IEnumerable 인터페이스를 상속하여 구현해보자.

[IEnumerable] 컬렉션의 인터페이스[IEnumerator]  열거자 인터페이스
namespace System.Collections
{
    public interface IEnumerable
    {
            IEnumerator GetEnumerator();
    }
}
namespace System.Collections
{
    public interface IEnumerator
    {
        object? Current { get; }
        bool MoveNext();
        void Reset();
    }
}

IEnumerable 인터페이스는 GetEnumrator() 메서드를 통해
IEnumerator (인터페이스) 를 리턴하기때문에 ,  사용자는 foreach 구문과 같은 반복분을 통해
linked 타입의 Collection 을 만들기 위해서는 IEnumerable 인터페이스를 상속 하면된다.

//————————————————————————–
//    회원 정보  관리를 위한  Member 클래스 

class Member {

    string name;
    string job;

    int age;

    public Member(string name , string job , int age)
    {
        this.name = name;
        this.job = job;
        this.age = age;
    }
    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }
    public string Job
    {
        get { return this.job; }
        set { this.job = value; }
    }
    public int Age
    {
        get { return this.age; }
        set { this.age = value; }
    }
}

//————————————————————————–
//    회원 정보 처리를 위한  MemberManager 클래스

class MemberManager

          ArrayList _memberList;

 

         public MemberManager()      // public 이어야,   MemberManager mm = new MemberManager()
         {                                             //  new MemberManager() 생성자 호출가능해짐
                 this._memberList = new ArrayList();
         }         
        public add(Member m)
        {
            this._memberList.add(m);
        }
}

//————————————————————————–
public void main()
{
    MemberManager mm = new MemberManager();

    mm.add( new Member(“이순신” , “군인” , 20);
    mm.add( new Member(“홍길동” , “백수” , 30);
    mm.add( new Member(“아이공룡” , “동물” , 20);

    foreach(Member m in mm)       // 오류  mm 에 MemeberManager 가 IEnumerable 상속 & 구현이 안되있음
    {                                                // GetEnumerator() 메소드가 있어야함
      console.WriteLine(m.name);
    }

}

[클래스 수정]
————————————————————————————————
// IEnumerable를 상속받고 GetEnumerator()  메서드 구현

class MemberManager : IEnumerable

          ArrayList _memberList;

 

         public MemberManager()      // public 이어야,   MemberManager mm = new MemberManager()
         {                                             //  new MemberManager() 생성자 호출가능해짐
                 this._memberList = new ArrayList();
         }         
        public add(Member m)
        {
            this._memberList.add(m);
        }
        public IEnumerator GetEnumerator()
        {
                // GetEnumerator() 메서드를 새로 코드로 구현한다기보다
                // ArrayList 객체인 _memberList 자체가 이미 가지고있는 _memberList.GetEnumerator() 
                // 를 리턴해주면 IEnumerator 인터페이스 타입의 객체를 리턴함
                return this._memberList.GetEnumerator();
        }
}


// 위에 소스를 다시실행해 보면 정상적으로 실행됨

답글 남기기

이메일 주소는 공개되지 않습니다.