foreach
foreach ๋ฌธ์ for ๋ฌธ์ฒ๋ผ ์ธ๋ฑ์ค ๋ณ์๊ฐ ํ์ ์๋ค. ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ๊ฐ์ ์ปฌ๋ ์ ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
foreach ๋ฌธ์ด ๊ฐ์ฒด ๋ด์ ์์๋ฅผ ์ํํ๊ธฐ ์ํด์๋ foreach ๋ฌธ๊ณผ์ ์ฝ์์ ์ง์ผ์ผ๋ง ํ๋ค.
๊ทธ ์ฝ์์ IEnumerable ์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ ํด๋์ค ๊ตฌํ์ด๋ค.
์ฆ, ์ด๋ค ํด๋์ค๋ผ๋ IEnumerable ์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ธฐ๋ง ํ๋ฉด foreach ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค๋ ์๊ธฐ๊ฐ ๋๋ค.
IEnumerable ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ ๋ฐ๋์ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ด์ฉ์ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ ๊ฒ์ด๋ค.
IEnumerable ์ธํฐํ์ด์ค๊ฐ ๊ฐ๊ณ ์๋ ๋ฉ์๋๋ ๋จ ํ๋ ๋ฟ์ด๋ฉฐ, ์์๋ฐ๋ ํด๋์ค๋ ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
IEumerator GetEnumerator(); // IEnumerator ํ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
GetEnumerator() ๋ฉ์๋๋IEnumerator ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค.
์ง์ IEnumerator ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๊ตฌํํด๋ ๋๊ณ , ์ปดํ์ผ๋ฌ๊ฐ ์ง์ํ๋ yield ๋ฌธ์ ์ด์ฉํด๋ ๋๋ค.
๋จผ์ , yield ๋ฌธ์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์์๋ณด์.
yield ๋ฌธ
yield ๋ฌธ์ ์ฌ์ฉํ๋ฉด IEnumerator ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ฐ๋ก ๊ตฌํํ์ง ์์๋, ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ์์ฑํด์ค๋ค.
yield return
ํ์ฌ ๋ฉ์๋(GetEnumerator())์ ์คํ์ ์ผ์ ์ ์งํ๊ณ , ํธ์ถ์์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๋ฉ์๋๊ฐ ๋ค์ ํธ์ถ๋๋ฉด, ์ผ์ ์ ์ง๋ ์คํ์ ๋ณต๊ตฌํ์ฌ yield return ๋๋ yield break ๋ฌธ์ ๋ง๋ ๋๊น์ง ์์ ์ ๊ณ์ํ๋ค.
using System;
using System.Collections;
class MyEnumerator
{
private int[] numbers = { 1, 2, 3, 4 };
public IEnumerator GetEnumerator()
{
yield return numbers[0];
yield return numbers[1];
yield return numbers[2];
yield break; // yield break๋ GetEnumerator() ๋ฉ์๋๋ฅผ ์ข
๋ฃ์ํด
yield return numbers[3]; // ๋ฐ๋ผ์ ์ด ๋ถ๋ถ์ ์คํ๋์ง ์์
}
}
ํ ์คํธ๋ฅผ ์ํด ์คํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
var _object = new MyEnumerator();
foreach(int i in _object)
{
Console.WriteLine(i);
}
yield ๋ฌธ์ ์ฌ์ฉํ๋ฉด IEnumerator ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ณ๋๋ก ๊ตฌํํ ํ์์์ด, ์ด๋ ๊ฒ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ ์ฒ๋ฆฌํด์ค๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ง์ IEnumerator ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ณธ๋ค๋ฉด ์ด๋จ๊น?
IEnumerator ์ธํฐํ์ด์ค
interface IEnumerator
{
boolean MoveNext();
void Reset();
Object Current { get;}
}
- MoveNext() : ๋ค์ ์์๋ก ์ด๋. ์ปฌ๋ ์ ์ ๋์ ์ง๋ ๊ฒฝ์ฐ์๋ False, ์ด๋์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ True ๋ฆฌํด
- Current : ์ปฌ๋ ์ ์ ํ์ฌ ์์ ๋ฆฌํด
- Reset() : ์ปฌ๋ ์
์ ์ฒซ ๋ฒ์งธ ์์น "์"์ผ๋ก ์ด๋
- ์ฒซ ๋ฒ์งธ ์์น๊ฐ 0๋ฒ์ธ ๊ฒฝ์ฐ, Reset() ํธ์ถ ์ -1 ๋ฒ์ผ๋ก ์ด๋.
- ์ฒซ ๋ฒ์งธ ์์น๋ก์ ์ด๋์ MoveNext()๋ฅผ ํธ์ถํ ๋ค์์ ์ด๋ฃจ์ด์ง
์์ ์ฝ๋
using System;
using System.Collections;
namespace Enumerable
{
class MyList : IEnumerable, IEnumerator
{
private int[] array;
int position = -1; // ์ปฌ๋ ์
์ ํ์ฌ ์์น๋ฅผ ๋ค๋ฃจ๋ ๋ณ์
public MyList()
{
array = new int[3];
}
public int this[int index] // ์ธ๋ฑ์
{
get { return array[index]; }
set
{
if (index >= array.Length)
{
Array.Resize<int>(ref array, index + 1);
Console.WriteLine($"Array Resized : {array.Length}");
}
array[index] = value;
}
}
// IEnumerator ๋ฉค๋ฒ
public object Current
{
get { return array[position]; }
}
// IEnumerator ๋ฉค๋ฒ
public bool MoveNext()
{
if (position == array.Length - 1)
{
Reset();
return false;
}
position++;
return (position < array.Length);
}
// IEnumerator ๋ฉค๋ฒ
public void Reset()
{
position = -1;
}
// IEnumerable ๋ฉค๋ฒ
public IEnumerator GetEnumerator()
{
return this;
}
}
}
๊ทธ๋ฆฌ๊ณ ํ ์คํธ๋ฅผ ์ํด ๋๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค.
MyList list = new MyList();
for(int i = 0; i < 5; i++)
{
list[i] = i;
}
foreach(int i in list)
{
Console.WriteLine(i);
}
- ์ด ๊ธ์ <์ด๊ฒ์ด C#์ด๋ค> ์ฑ ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๊ธ์ ๋๋ค.