티스토리 뷰

C#(.NET)

[C#] IEnumerable Interface 열거자 인터페이스

열혈허슬러 상추님 2018.04.07 10:25

[C#] IEnumerable Interface 열거자 인터페이스

 C#은 다중상속이 문법적으로 불가능한 개발언어입니다. 그대신 인터페이스가 존재하며 인터페이스를 통한 간접적인 다중 상속이 가능합니다. 그 중에서 IEnumerable 인터페이스를 한번 알아보게 습니다.

IEnumerable

 위 코드 내용을 전체적으로 살펴보면, Person 즉 사람 객체가 있고 사람객체를 Student, Professor (학생, 교수) 이 두 객체가 상속해서 클래스를 구현해둔 모습을 알 수 있습니다. 

Interface

 학생객체 및 교수객체는 부모클래스 멤버 매소드인 Print매서드를 오버라이드해서 재 구현해주고 있습니다. 그렇게되면 부모객체배열(사람배열)을 생성해서 자식인 학생,교수 객체를 각각 넣어준뒤에 Print()해주면 각각 재정의해준 Print매서드가 동작하는 것을 확인할 수 있습니다.

 여기까지는 우리가 알고 있는 foreach문을 사용한 배열순회방식이었는데 여기서 알아보고 싶은게 도대체 어떻게 foreach 구문이 작동되는 것이냐 입니다.

 정답은 바로.. 맞습니다. IEnumerable 인터페이스를 구현해주고 있기에 가능한거랍니다. 명시적으로는 상속(구현)하지 않았지만 Person[] 내부적으로 구현이 되어있기에 가능한거라고 생각해도 무방할것같네요.

인터페이스

 사용 방법은 위와 같습니다. 우선 IEnumerable 객체를 하나 생성해줍니다. 그리고 우리가 열거시킬 객체가 IEnumerable 인터페이스를 구현하고 있는지 as구문으로 확인해줍니다. 이때 만약 구현하고 있다면 null이 아니기에 반복을 실행합니다.

 IEnumerable객체의 매서드인 GetEnumerator()매서드는 컬렉션을 반복할 수 있는 이터레이터(?)를 반환해주게됩니다. 이 이터를 이용해서 컬렉션을 순회하게 되는 것이죠.

 처음에는 Reset() 매서드를 통해서 첫번째 원소의 하나 앞을 가리키게되며, MoveNext()매서드를 통해서 이터레이터를 다음 인덱스로 이동시키면서 이때 Current()매서드를 통해서 현재 요소를 파악하며 우리가 원하는 작업을 실행해주면 되겠습니다.

 이와 같이 foreach문이 내부적으로 어떻게 돌아가는지 그나마 파악할 수 있었고 인터페이스의 효율성에 대해서도 알게되었습니다.

 if (perArray is IEnumerable ie)
            {
                IEnumerator iter = ie.GetEnumerator();
                iter.Reset();//초기화 수행
                while (iter.MoveNext())//다음요소로 이동. 없으면 false
                {
                    (iter.Current as Person).Print();
                }
            }

 참고로 위 구문을 간단하게 위와 같이 바꾸어줄 수 있습니다. is 구문 뒤에 바로 ie(변수)를 지정해서 사용할 수 있는 것 같습니다. 기능들이 아주 많은 것 같네요.

code.cs

댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함