C#에는 C++, Java에서는 볼 수 없었던, 사실 그 이전이라고 볼 수 있는 Basic에서 자주(?) 애용하던, 사실 Basic을 아주 Basic하게만 한 수준이라, ASP에서 좀 더 친근한 foreach문이 다시 돌아왔다... 오호라.. 돌아왔다니.. 지금 C#이 나온지 얼마나 됐는데... -_-
쨌든... foreach가 먼지 모르고 아직도 나빠(Naver)형님을 찾는 이들을 위해 간단한 예제를 들어 보겠다.. 오홍~
string[] str = new string[4] { "jungun", "shiri", "kong", "eung" };
for (int i = 0; i < str.Length; i++)
Console.WriteLine(str[i]);
foreach (string s in str)
Console.WriteLine(s);
기존의 for문을 사용해서 배열을 출력하는 모습과, foreach문을 사용해서 출력하는 모습이다..
그렇다... foreach문을 사용하면 그 귀찮은 배열의 인덱스 str.Length + 1을 할지.. 그냥
str.Length를 할지 <를 할지 <=를 할지.. 를 고민하면서 벌여야 했던 시간을 단축시킬 수가 있다... 우하하.. 적어도 코더의 입장에서 본다면 아주 편하다 !! -_-
그렇다 이제부터 foreach만 써야한다고 나는 당연히 주장한다!! 라고 하면 돌 엄청 날아올 것으로 예상된다.. 음 -_-
사실 foreach는 쓰기는 쉽지만 내부적으로는 아주(?) 복잡하게 이루어져 있다..
어떻게??? 요렇게...
IEnumerator e = str.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine(e.Current);
}
그렇다.. 저렇게 못알아먹는 -_- 것들로 이루어져 있는것이다.. 아싸 머리야 -_-
말이 너무 길어질 것 같아 거두절미하고.... Array, List형태의 미리정의된 타입들은 자연스럽게
foreach문을 사용할 수가 있다... 그것은 Array나 List 클래스들은 IEnumerable, IEnumerator 인터페이스로 부터 구현상속을 하였기 때문이다. 하지만 사용자 정의 타입의 예를 들면 사용자가 Person이라는 클래스를 구현하여..
foreach (string str in persons) {
Console.WriteLine(str);
}
이라고 쓰려고 한다면 엇 안된다.... 이런 ... 그래서 사용자는 Person클래스 제작(?)시에 IEnumerator와 IEnumerable을 상속받아, override를 하여야 한다..
이런 얼마나 힘들일 인가.
쨌든...사용자 정의 클래스에서 foreach문을 사용하기 위해서는 두가지 인터페이스를 구현상속해야 한다는 의미이다.
그 방법은 아래와 같다.. The following example .... ( 헙 <--- msdn 꺼 흉내내봐따 ..)
class PersonList : IEnumerable
{
private string[] _name = new string[4] { "mcJunGun", "Djshiri", "Kong45", "McEung" };
public string this[int index]
{
get { return _name[index]; }
set { _name[index] = value; }
}
public int Length
{
get { return _name.Length; }
}
public IEnumerator GetEnumerator()
{
return new PListEnumerator(this);
}
}
class PListEnumerator : IEnumerator
{
private PersonList _persons;
private int _index;
public PListEnumerator(PersonList persons)
{
_persons = persons;
_index = -1;
}
public object Current
{
get { return _persons[_index]; }
}
public bool MoveNext()
{
_index++;
return _index < _persons.Length;
}
public void Reset()
{
_index = -1;
}
}
class Class1
{
static void Main()
{
PersonList persons = new PersonList();
foreach (string str in persons)
{
Console.WriteLine(str);
}
}
}
캬 ~ 이런 복잡한 과정이 숨어있었다니 -_- Class1이라는 사용자는 너무 쉽게 foreach문을 사용하고 있지만 사실 뒤에 숨은 저 코드들을 보면 -_- 분명히 이해하고 넘어갔음에도 다시 짤때 버벅거리는 센스 -_- 정말 바본지 -_- 으~~~
그래서~~~
C# 2.0 에서는 나같은 사람을 위해 준비한 비장의 무기가 있다... !!!
우하하 Iterator!! 기대하시라... 그건 담에 또 기회가 될 때... Generics 클래스와 함께
짜쟌 하고 설명할 기회를 만들겠뜨아~~~
'[ Program ] > C#' 카테고리의 다른 글
【 C# 】 컬렉션의 기본 인터페이스_# (0) | 2012.09.17 |
---|---|
IEnumerable 과 IEnumerator 인터페이스 (0) | 2012.09.17 |
vs2010 에서 WCF REST 프로젝트 무작정 만들기 (0) | 2012.09.17 |
커스텀 열거자(IEnumerable, IEnumerator) (0) | 2012.09.17 |
스레드의 상태 (0) | 2012.09.17 |
댓글