´å³Ý ¶óÀ̺귯¸®µµ ¸¹Àº ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϸç ÇØ´ç ±â´ÉÀ» ±¸ÇöÇÏ´Â Çʼö ¸Þ¼µå°¡ Àß Á¤¸®µÇ¾î ÀÖ´Ù. ¹°·Ð ±¸ÇöÀº ¾ø°í ¸Þ¼µå ¸ñ·Ï¸¸ ÀÖÀ» »ÓÀÌ´Ù. ´å³Ý ¸Å´º¾óÀ» º¸¸é
Á¾Á¾ ´ÙÀ½°ú °°Àº ¹®±¸¸¦ º¼ ¼ö ÀÖ´Ù.
S ±â´ÉÀ» ±¸ÇöÇÏ°í ½Í¾î? T ÀÎÅÍÆäÀ̽º¸¦
»ó¼Ó¹Þ¾Æ X, Y, Z ¸Þ¼µå¸¦ ±¸ÇöÇØ ºÁ
ÀÌ Áö½Ã´ë·Î Ŭ·¡½º¸¦ ¸¸µé¸é S ±â´ÉÀ» º¸À¯ÇÏ°Ô µÈ´Ù. °è¾à´ë·Î ±¸ÇöÇØ ³õÀ¸¸é ´å³Ý ¶óÀ̺귯¸®°¡ ÀÌ °´Ã¼ÀÇ S ±â´ÉÀÌ ÇÊ¿äÇÒ
¶§ X, Y, Z ¸Þ¼µå¸¦ È£ÃâÇÑ´Ù. ÀÎÅÍÆäÀ̽º´Â °è¾àÀ»
Á¤ÇüÈÇÏ¿© ¾à¼ÓÀ» ÁöÅ°Áö ¾ÊÀ¸¸é ¿¡·¯ ¸Þ½ÃÁö·Î ÀÀ¡ÇÑ´Ù.
ÀÎÅÍÆäÀ̽º È°¿ë¿¹·Î ¿°Å °¡´ÉÇÑ Å¬·¡½º¸¦ ¸¸µé¾î º¸ÀÚ. ¸â¹ö³ª ¿ä¼Ò¸¦
¼øȸÇÏ´Â foreach ±¸¹®ÀÌ µ¿ÀÛÇÏ·Á¸é óÀ½°ú ³¡Àº ¾îµðÀÎÁö, ¾î¶²
¼ø¼·Î ¼øȸÇÒ °ÍÀÎÁö¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. ÀÌ °è¾à¸¸ Àß ÁöÅ°¸é »ç¿ëÀÚ Á¤ÀÇ Å¬·¡½ºµµ foreach ±¸¹®À» ¾µ ¼ö ÀÖ´Ù. Ŭ·¡½º¿¡ ¿°Å ±â´ÉÀ» ÀÛ¼ºÇÏ·Á¸é
µÎ °³ÀÇ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. IEnumerable ÀÎÅÍÆäÀ̽º´Â ¿°ÅÀÚ °´Ã¼¸¦ ±¸ÇÏ´Â GetEnumerator ¸Þ¼µå¸¦ Á¤ÀÇÇÑ´Ù. ÀÚ½ÅÀ» ¿°ÅÇÏ´Â µµ¿ì¹Ì
Ŭ·¡½º¸¦ ¼±¾ðÇÏ°í GetEnumerator ¸Þ¼µå¿¡¼ ¿°ÅÀÚ¸¦ »ý¼ºÇÏ¿© ¸®ÅÏÇÏ¸é µÈ´Ù.
µµ¿ì¹Ì °´Ã¼´Â ÇÁ·ÎÆÛƼ Çϳª¿Í ¸Þ¼µå µÑÀ» °¡Áö´Â IEnumerator ÀÎÅÍÆäÀ̽º¸¦
»ó¼Ó¹Þ¾Æ ±¸ÇöÇÑ´Ù. foreach¹®Àº ¿°Å Áß¿¡ ÀÌ ¸Þ¼µå¸¦ È£ÃâÇÏ¿© °´Ã¼ ³»ºÎ¸¦ ¼øȸÇÑ´Ù. °¢ ¸Þ¼µå´Â ¾à¼Ó¿¡ µû¶ó ±×¸®°í Ŭ·¡½ºÀÇ ³»ºÎ ±¸Á¶¿¡ ¸Â°Ô ±¸ÇöÇÑ´Ù.
¸Þ¼µå |
¼³¸í |
object Current |
ÇöÀç°ªÀ» ±¸ÇÑ´Ù. ¿°Å ´ë»óÀÌ ÀÓÀÇ Å¸ÀÔÀ̹ǷΠobject¸¦ ¸®ÅÏÇÑ´Ù. |
bool MoveNext() |
´ÙÀ½°ªÀ¸·Î À̵¿ÇÏ¸ç ³¡¿¡ µµ´ÞÇϸé false¸¦ ¸®ÅÏÇÑ´Ù. |
void Reset() |
¿°Å¸¦ óÀ½ »óÅ·Πµ¹¸°´Ù. ÃÖÃÊ ¾Æ¹«°Íµµ °¡¸®Å°Áö ¾Ê´Â »óÅ¿©¾ß ÇÑ´Ù. |
ÀÓÀÇÀÇ Å¬·¡½ºµµ ¿°ÅÇÒ ´ë»óÀÌ ÀÖ´Ù¸é ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¸é µÈ´Ù. Time
Ŭ·¡½ºÀÇ ½Ã, ºÐ, ÃÊ ¼¼ ¿ä¼Ò¸¦ ¼ø¼ÀÖ´Â ÁýÇÕÀ¸·Î
°£ÁÖÇÏ¿© ¿°ÅÇØ º¸ÀÚ.
TimeEnum |
½ÇÇà°á°ú |
using
System; using
System.Collections; class Time :
IEnumerable { public
int hour, min, sec; public
Time(int h, int m, int s) { hour = h; min = m; sec = s; } public
IEnumerator GetEnumerator() { return
new TimeEnum(this); } } class
TimeEnum : IEnumerator { private
Time T; private
int element; public
TimeEnum(Time aT) { T
= aT; Reset(); } public
bool MoveNext() { if
(element < 2) { element++; return
true; }
else { return
false; } } public
object Current { get
{ switch
(element) { case
0: return T.hour; case
1: return T.min; case
2: return T.sec; default:
return null; } } } public
void Reset() { element
= -1; } } class CSTest
{ static
void Main() { Time
Now = new Time(18, 25, 55); foreach
(int hms in Now) { Console.WriteLine(hms); } } } |
18 25 55 |
Time Ŭ·¡½º´Â IEnumerableÀ»
»ó¼Ó¹Þ¾Æ GetEnumerator¸¦ ±¸ÇöÇÑ´Ù. TimeEnum °´Ã¼¸¦
»ý¼ºÇÏ¿© ¸®ÅÏÇϴµ¥ ÀÌ °´Ã¼°¡ ¿°ÅÀÚÀÌ´Ù. TimeEnumÀº
IEnumerator·ÎºÎÅÍ »ó¼Ó¹ÞÀº ¸Þ¼µå¿Í ÇÁ·ÎÆÛƼ¸¦ ±¸ÇöÇÑ´Ù. »ý¼ºÀÚ´Â ¿°Å ´ë»ó °´Ã¼¸¦
¹Þ¾Æ T¿¡ ÀúÀåÇÑ´Ù. element ´Â ¾î¶² ¿ä¼Ò¸¦ °¡¸®Å°°í
ÀÖ´ÂÁö ±â¾ïÇϴ ÷ÀÚÀÌ´Ù. Reset¿¡¼ -1·Î ÃʱâÈÇÏ¿©
ÃÖÃÊ ¾Æ¹« ¿ä¼Òµµ °¡¸®Å°Áö ¾Ê´Ù°¡ MoveNext°¡ 1 Áõ°¡½ÃÄÑ
´ÙÀ½ ¿ä¼Ò·Î À̵¿ÇÏ°í ¸¶Áö¸· ¿ä¼ÒÀÎ 2À̸é false¸¦ ¸®ÅÏÇÑ´Ù.
element´Â -1¿¡¼ MoveNext¿¡ ÀÇÇØ 0, 1, 2·Î Áõ°¡ÇÑ´Ù. Current ÇÁ·ÎÆÛƼ´Â element À§Ä¡ÀÇ ¿ä¼Ò¸¦ Àдµ¥ 0, 1, 2¿¡ ´ëÇØ °¢°¢ ½Ã, ºÐ,
Ãʸ¦ ¸®ÅÏÇÑ´Ù. ¿ä¼ÒÀÇ ¼ø¼´Â ¸¶À½´ë·Î Á¤ÇÒ ¼ö ÀÖÁö¸¸ Å« ´ÜÀ§ºÎÅÍ ÀÛÀº ´ÜÀ§·Î ¼øȸÇÏ´Â
°ÍÀÌ ÀÚ¿¬½º·´´Ù. foreach¹®À¸·Î Now °´Ã¼¸¦ ¼øȸÇϸé
°¢ ¿ä¼Ò°¡ hms¿¡ Á¶»çµÇ¸ç ÀÌ °ªÀ» ȸ鿡 Ãâ·ÂÇß´Ù. ½Ã, ºÐ, ÃÊ ¿ä¼Ò°¡ Â÷·Ê´ë·Î Ãâ·ÂµÈ´Ù.
°¢ ¸Þ¼µåÀÇ ¿ªÇÒÀ» ÀÌÇØÇÏ¸é ³»ºÎ¿¡¼ ¹«½¼ ÀÏÀÌ ÀϾ´ÂÁö ´ëÃæ ÁüÀÛÇÒ ¼ö ÀÖ´Ù. ¾Æ¸¶
´ÙÀ½°ú ºñ½ÁÇÒ °ÍÀÌ´Ù.
static void Main() {
Time
Now = new Time(18, 25, 55);
IEnumerator
E = Now.GetEnumerator();
E.Reset();
while
(E.MoveNext()) {
Console.WriteLine((int)E.Current);
}
}
GetEnumerator¸¦ È£ÃâÇÏ¿© ¿°ÅÀÚ °´Ã¼¸¦ ±¸ÇÏ°í ¿°ÅÀÚÀÇ ResetÀ» È£ÃâÇÏ¿© ¼øȸ Áغñ¸¦ ÇÑ´Ù. MoveNext·Î ´ÙÀ½ ¿ä¼Ò·Î
À̵¿ÇÏ¸é¼ Current ÇÁ·ÎÆÛƼ¸¦ Àд´Ù. ÀÌ °úÁ¤À» MoveNext°¡ false¸¦ ¸®ÅÏÇÒ ¶§±îÁö, Áï ¸ðµç ¿ä¼Ò¸¦ ´Ù ¼øȸÇÒ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. foreachÀÇ ³»ºÎ
µ¿ÀÛÀÌ ÀÌ·¯ÇÔÀ¸·Î ¿°Å °¡´É °´Ã¼´Â ¾à¼Ó´ë·Î ¿°ÅÀÚ¿Í ¿°Å °ü·Ã ¸Þ¼µå¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. ¿°Å ¹æ½ÄÀº
Ŭ·¡½º°¡ ¸¶À½´ë·Î °áÁ¤ÇÒ ¼ö ÀÖÁö¸¸ ¿°Å ´É·Â ÀÚü´Â ²À ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ´É·Â¿¡ ´ëÇÑ ¸í¼¼°¡ ÀÎÅÍÆäÀ̽ºÀÌ´Ù.
GetEnumerator ¸Þ¼µå¸¦ ÁÖ¼® ó¸®Çϸé Çʼö ¸Þ¼µå¸¦ ±¸ÇöÇÏÁö
¾Ê¾Æ ¿¡·¯ 󸮵ȴÙ. Time Ŭ·¡½º ¼±¾ð¹®ÀÇ IEnumerableÀ»
»© ¹ö¸®¸é TimeÀº ÄÄÆÄÀϵÇÁö¸¸ foreach¿¡¼ ÀÚ°Ý
¹Ì´ÞÀÎ °´Ã¼´Â ¿°ÅÇÒ ¼ö ¾ø´Ù°í ¡¡´ë¸ç Æľ÷ÇØ ¹ö¸°´Ù. ¿Ö ÀÎÅÍÆäÀ̽º¸¦ °è¾àÀ̶ó°í ÇÏ´ÂÁö ÀÌÇØµÉ °ÍÀÌ´Ù.
TimeEnum Ŭ·¡½º´Â Time °´Ã¼ÀÇ
¿°Å¸¦ À§Çؼ¸¸ »ç¿ëµÈ´Ù. ºÐ¼® ÆíÀÇ»ó ¿ÜºÎ¿¡ ¼±¾ðÇßÁö¸¸ Çü½Ä¼ºÀ» µûÁø´Ù¸é Time Ŭ·¡½ºÀÇ ³»ºÎ ŸÀÔÀ¸·Î ¼±¾ðÇÏ°í private·Î ¼û±â´Â °ÍÀÌ
¹Ù¶÷Á÷ÇÏ´Ù. ÇÊ¿äÇÑ Å¸ÀÔÀ» ³»ºÎ¿¡ Ç°°í ÀÖÀ¸¸é ±âµ¿¼ºÀÌ ÁÁ¾ÆÁø´Ù.
class Time : IEnumerable {
private
class TimeEnum : IEnumerator {
....
¿°Å °ü·Ã ÀÎÅÍÆäÀ̽º°¡ µÑ·Î ³ª´©¾îÁ® ÀÖ´Â ÀÌÀ¯´Â ¹»±î? ¹ø°Å·Ó°Ô
¿°ÅÀÚ °´Ã¼¸¦ µû·Î µÑ ÇÊ¿ä ¾øÀÌ TimeÀÌ Á÷Á¢
IEnumerator¸¦ ±¸ÇöÇÒ ¼öµµ ÀÖ´Ù. ÀÌÀ¯¾øÀÌ º¹ÀâÇÏ°Ô ¸¸µé¾î ³ùÀ» ¸®´Â ¾øÀ» °ÍÀÌ°í
ºÐ¸í ±×·²¸¸ÇÑ »çÁ¤ÀÌ ÀÖ´Ù. ¿°ÅÀÚ°¡ ²À ÇÊ¿äÇÑ ÀÌÀ¯´Â ÀÌÁß ·çÇÁ ¶§¹®ÀÌ´Ù.
foreach (int hms in Now) {
foreach
(int hms2 in Now) {
....
ÀÌÁß ·çÇÁ´Â °¢ ·çÇÁÀÇ ¼øȸ À§Ä¡¸¦ ·çÇÁº°·Î °ü¸®ÇØ¾ß ÇÑ´Ù. TimeÀÌ
Á÷Á¢ ¼øȸ¸¦ °üÀåÇϸé element Çʵ尡 Çϳª ¹Û¿¡ ¾ø¾î µÎ À§Ä¡¸¦ µû·Î ±â¾ïÇÒ ¼ö ¾ø´Ù. ÀÌ·± °æ¿ì¸¦ À§ÇØ element¸¦ µÎ ¹ú ¸¸µé¸é µÇÁö ¾Ê³Ä±¸? ±×·³ »ïÁß ·çÇÁ´Â? °á±¹ ·çÇÁº°·Î ÇöÀç À§Ä¡¸¦ µû·Î °ü¸®ÇÒ µ¶¸³µÈ
¿°ÅÀÚ°¡ ÇÊ¿äÇÏ´Ù.
ÀÌ »óȲÀÌ Àß ÀÌÇصÇÁö ¾ÊÀ¸¸é ÀÏ¹Ý ·çÇÁ¸¦ »ý°¢ÇØ º¸ÀÚ. for (a) for
(a)´Â Áßø ·çÇÁÀÇ Á¦¾î º¯¼ö°¡ °°¾Æ Á¤»ó µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. for (a) for (b) ÇüÅ¿©¾ß
°¢ ·çÇÁ°¡ µ¶¸³ÀûÀ¸·Î µ¹¾Æ°£´Ù. Á¦¾î º¯¼ö°¡ ·çÇÁ ¼ö¸¸Å ÇÊ¿äÇÏ´Ï µû·Î »ý¼º °¡´ÉÇÑ ¿°ÅÀÚ°¡ ÇÊ¿äÇÏ´Ù.
¿°Å ±â´ÉÀº ÀÎÅÍÆäÀ̽ºÀÇ ±ÔÄ¢´ë·Î ¸Þ¼µå¸¸ ±¸ÇöÇÏ¸é µÇ´Ï ¾î·ÆÁö´Â ¾Ê´Ù. ´Ù¸¸
ÄÚµåÀÇ ¾çÀÌ ¸¹¾Æ ¹ø°Å·Ó°í ÀܼÕÁúÀÌ ¸¹ÀÌ °£´Ù. ±×·¡¼ Á» ´õ °£ÆíÇÏ°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Â ¹Ýº¹±â(Iterator)¶ó´Â »õ·Î¿î ¿°Å ¹æ¹ýÀ» µµÀÔÇß´Ù. ¹Ýº¹±â´Â ¿°Å
´ë»ó ¿ä¼Ò¸¦ ¼ø¼´ë·Î »ý¼ºÇÏ´Â ±¸¹®ÀÌ´Ù. ¿°Å ¹æ¹ýº¸´Ù ´ë»ó¿¡ ÃÊÁ¡À» µÎ¾î ´ÙÀ½ ¼ø¼°¡ ¹ºÁö¸¸ ÁöÁ¤Çϸé
³ª¸ÓÁö µÞ󸮴 ÄÄÆÄÀÏ·¯°¡ ÇØ ÁØ´Ù. ¾Õ ¿¹Á¦¸¦ ¹Ýº¹±â·Î ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ.
TimeIterator |
½ÇÇà°á°ú |
using
System; using
System.Collections; class Time { public
int hour, min, sec; public
Time(int h, int m, int s) { hour = h; min = m; sec = s; } public
IEnumerator GetEnumerator() { yield
return hour; yield
return min; yield
return sec; } } class CSTest
{ static
void Main() { Time
Now = new Time(18, 25, 55); foreach
(int hms in Now) { Console.WriteLine(hms); } } } |
18 25 55 |
Time Ŭ·¡½º´Â
GetEnumerator ¸Þ¼µå ¾È¿¡ ¹Ýº¹±â ºí·ÏÀ» ÀÛ¼ºÇÑ´Ù. ±æÀ̴ ªÁö¸¸ µ¿ÀÛÀº °°Àºµ¥
¾ÐÃàµÈ Äڵ忩¼ Á÷°üÀûÀ¸·Î ÀÌÇØÇϱ⠾î·Æ´Ù. ¹Ýº¹±â ºí·ÏÀº ¹®¹ýº¸´Ù´Â Àǹ̷ÐÀûÀ¸·Î Á¤ÀǵǸç ÄÄÆÄÀÏ·¯°¡
Àǵµ¸¦ ºÐ¼®ÇÏ¿© ÇÊ¿äÇÑ Äڵ带 »ý¼ºÇÑ´Ù. ¸Þ¼µå³ª ¿¬»êÀÚ, get Á¢±ÙÀÚ°¡
¹Ýº¹±â ºí·ÏÀÌ µÇ´Âµ¥ ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇØ¾ß Èù´Ù.
¨ç ³»ºÎ¿¡ °ªÀ» »ý¼ºÇÏ´Â yield ¸í·ÉÀÌ ÀÖ¾î¾ß ÇÏ¸ç ´ÙÀ½ µÎ °¡Áö
ÇüÅ·Π»ç¿ëÇÑ´Ù. yield¸¦ ¾µ ¼ö ÀÖ´Â À§Ä¡´Â Á¦¾à »çÇ×ÀÌ ¸¹´Ù.
finally ºí·ÏÀ̳ª catch°¡ ÀÖ´Â try ºí·Ï, ÀÍ¸í ¸Þ¼µå, ¾ÈÀüÇÏÁö ¾ÊÀº Äڵ忡¼´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.
yield return °ª : ¿°Å°ªÀ»
»ý¼ºÇÑ´Ù. ¿ä¼ÒÀÇ Å¸ÀÔÀº µ¿ÀÏÇØ¾ß ÇÑ´Ù.
yield break : °ª »ý¼ºÀ» Á¾·áÇÑ´Ù.
¨è ÇÔ¼öÀÇ ¸®ÅÏ Å¸ÀÔÀº ´ÙÀ½ 4°¡Áö Áß Çϳª¿©¾ß ÇÑ´Ù. Á¦³×¸¯ ¹öÀü°ú ºñÁ¦³×¸¯ ¹öÀüÀÇ ÀÎÅÍÆäÀ̽º Áß Çϳª¸¦ ¸®ÅÏÇÑ´Ù. ºñÁ¦³×¸¯
¹öÀüÀÌ ¸®ÅÏÇϴ ŸÀÔÀº objectÀ̸ç Á¦³×¸¯ ¹öÀüÀÌ ¸®ÅÏÇϴ ŸÀÔÀº ŸÀÔ ÀμöÀÎ TÀÌ´Ù.
System.Collections.IEnumerator
System.Collections.Generic.IEnumerator<T>
System.Collections.IEnumerable
System.Collections.Generic.IEnumeraable<T>
¨é ¿°Å ¹üÀ§³ª ¹æ¹ýÀ» Àü´Þ¹Þ±â
À§ÇÑ Àμö¸¦ ÃëÇÒ ¼ö ÀÖÁö¸¸ »ç¿ëÀÚ°¡ È£ÃâÇÏ´Â ¸Þ¼µå°¡ ¾Æ´Ï¾î¼ ref, out Àμö´Â ÃëÇÒ ¼ö ¾ø´Ù. ÄÄÆÄÀÏ·¯°¡ ´Ü°èÀûÀ¸·Î ½ÇÇàÇϹǷΠreturn ¹®À» ¾µ ¼ö ¾øÀ¸¸ç yield ¹®À¸·Î ¿°Å ´ë»ó °ªÀ» »ý¼ºÇÏ´Â Äڵ常 ÀÖ¾î¾ß ÇÑ´Ù.
¿¹Á¦ÀÇ GetEnumerator ¸Þ¼µå´Â IEnumerator ŸÀÔÀ» ¸®ÅÏÇÏ¸ç ¼¼ ½Ã°£ ¿ä¼Ò¸¦ yield ¸í·ÉÀ¸·Î
Â÷·Ê´ë·Î ¸®ÅÏÇÏ¿© ¿°ÅÇÑ´Ù. yield ¸í·ÉÀº ÇѲ¨¹ø¿¡ ½ÇÇàµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ¼ø¼´ë·Î
È£ÃâµÇ¸ç ´ÙÀ½ È£Ãâ À§Ä¡¸¦ ±â¾ïÇØ µÐ´Ù.
Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¹Ýº¹±â ºí·ÏÀÌ ¹ß°ßµÇ¸é ÄÄÆÄÀÏ·¯°¡ ¿°ÅÀÚ Å¬·¡½º¸¦ ¸¸µç´Ù.
private ¼Ó¼ºÀÇ ³»ºÎ ŸÀÔÀ¸·Î Á¤ÀÇÇÏ¿© °´Ã¼¸¦ »ý¼ºÇÏ°í °ü¸®ÇÑ´Ù. ÀÌ Å¬·¡½º¿¡´Â foreach¹®ÀÌ ¿ä±¸ÇÏ´Â Current ÇÁ·ÎÆÛƼ, MoveNext, Dispose ¸Þ¼µå µîÀÌ Æ÷ÇԵȴÙ. ´Ü, Reset ¸Þ¼µå´Â ¾ø¾î ¼øÂ÷ ¼øȸ¸¸ °¡´ÉÇÏ´Ù. ÄÄÆÄÀÏ·¯´Â À§ ¿¹Á¦¸¦
´ÙÀ½°ú °°ÀÌ º¯ÇüÇÏ¿© ÄÄÆÄÀÏÇÑ´Ù.
class Time {
public
int hour, min, sec;
public
Time(int h, int m, int s) { hour = h; min = m; sec = s; }
public
IEnumerator GetEnumerator() {
return
new __Enumerator ();
}
private
class __Enumerator() { //
ÄÄÆÄÀÏ·¯°¡ »ý¼ºÇϴ Ŭ·¡½º
int
__state;
object
__current;
public
object Current { ... }
public
bool MoveNext { ... }
public
void Dispose { ... }
}
}
__Enumerator ³»ºÎ Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í GetEnumerator ¸Þ¼µå´Â ÀÌ Å¬·¡½ºÀÇ °´Ã¼ÀÎ ¿°ÅÀÚ¸¦ »ý¼ºÇÏ¿© ¸®ÅÏÇÑ´Ù. ¿°ÅÀÚ Å¬·¡½º´Â »óŸ¦ °ü¸®ÇÏ´Â __state Çʵ带 °¡Áö¸ç before, suspended, running, after ³× °¡Áö »óŸ¦ À¯ÁöÇÑ´Ù. MoveNext³ª Current´Â »óÅ¿¡ µû¶ó ´ÙÀ½ µ¿ÀÛÀ» °áÁ¤Çϸç
»óŸ¦ º¯°æÇÏ¿© ´ÙÀ½ È£Ãâ °¡´ÉÇÑ ¸í·ÉÀ» ±¸ºÐÇÑ´Ù.
»óÅ °ü¸®³ª ¿ä¼Ò¸¦ ±¸ÇÏ´Â ¹æ½ÄÀÌ ½ºÆå ¹®¼¿¡ ±â¼úµÇ¾î ÀÖÁö¸¸ ±»ÀÌ ´Ù ¾Ë ÇÊ¿ä´Â ¾øÀ¸¸ç ¾Ë¾Æ¼ Àß ¸¸µé¾î ³ù°Ú°Å´Ï
»ý°¢Çصµ ¹«¹æÇÏ´Ù. ±ÔÄ¢¿¡ ¸Â°Ô ¹Ýº¹±â ºí·Ï¸¸ ÀÛ¼ºÇØ ³õÀ¸¸é
foreach¿Í ÄÄÆÄÀÏ·¯°¡ ´Ù ¾Ë¾Æ¼ ÇÑ´Ù. °¢ ¿°ÅÀÚ°¡ »óŸ¦ °ü¸®ÇØ ÀÌÁß ·çÇÁµµ °¡´ÉÇÏ´Ù.
´ÙÀ½ ¿¹Á¦´Â ÇÑ°ÀÇ ´Ù¸®¸¦ µ¿ÂÊ¿¡¼ ¼ÂÊÀ¸·Î ¿°ÅÇÑ´Ù. ¿°ÅÇÒ ¿ä¼Ò°¡
¸¹¾Æ Á¤Àû ¹è¿¿¡ ´Ù¸® À̸§À» ÀúÀåÇØ µÎ°í ·çÇÁ¸¦ µ¹¸ç Çϳª¾¿ ¸®ÅÏÇÑ´Ù. ÇÑ° ´Ù¸®¿¡ ¹øÈ£°¡ ºÙ¾î ÀÖ´Â
°ÍÀº ¾Æ´Ï¹Ç·Î ¼ø¼´ë·Î ¹è¿¿¡ ¸ô¾Æ ³õ°í µ¹¸®´Â ¼ö¹Û¿¡ ¾ø´Ù. ¿°ÅÀÚ °´Ã¼´Â ·çÇÁÀÇ Ã·ÀÚ iµµ Çʵå·Î Æ÷ÇÔÇÏ¿© ´ÙÀ½ ¹Ýº¹ ´ë»óÀ» ±â¾ïÇÑ´Ù.
EnumBridge |
½ÇÇà°á°ú |
using
System; using
System.Collections; class
HanBridge { static
string[] Bridge = {"ÆÈ´ç", "°µ¿", "±¤Áø", "õȣ", "¿Ã¸²ÇÈ", "Àá½Ç", "û´ã", "¿µµ¿", "¼º¼ö", "µ¿È£", "Çѳ²", "¹ÝÆ÷", "µ¿ÀÛ", "ÇÑ°", "¿øÈ¿", "¸¶Æ÷", "¼°", "¾çÈ", "¼º»ê", "°¡¾ç", "¹æÈ", "ÇàÁÖ", "±èÆ÷", "ÀÏ»ê"}; public
IEnumerator GetEnumerator() { for
(int i = 0; i < Bridge.Length; i++) { yield
return Bridge[i]; } } } class CSTest
{ static
void Main() { HanBridge
hb = new HanBridge(); foreach
(string b in hb) { Console.WriteLine(b); } } } |
ÆÈ´ç °µ¿ ±¤Áø õȣ ¿Ã¸²ÇÈ Àá½Ç û´ã ¿µµ¿ ¼º¼ö µ¿È£ Çѳ² ¹ÝÆ÷ µ¿ÀÛ ÇÑ° ¿øÈ¿ ¸¶Æ÷ ¼° ¾çÈ ¼º»ê °¡¾ç ¹æÈ ÇàÁÖ ±èÆ÷ ÀÏ»ê |
ÇÑ° ´Ù¸® À̸§ÀÌ ¼ø¼´ë·Î Ãâ·ÂµÈ´Ù. °´Ã¼°¡ ¾Æ´Ñ ¸Þ¼µå·Îµµ ¹Ýº¹±â¸¦
±¸ÇöÇÒ ¼ö ÀÖ´Ù. À̸§ÀÖ´Â ¹Ýº¹±â´Â IEnumerable ÀÎÅÍÆäÀ̽º¸¦
¸®ÅÏÇÏ´Â ¸Þ¼µåÀÌ´Ù. ¸Þ¼µå´Â Àμö¸¦ ¹Þ¾Æ °ªÀ» ¼øȯÇÏ´Â ¹æ¹ýÀ» °áÁ¤ÇÒ ¼ö ÀÖ°í ¿À¸§Â÷¼ø, ³»¸²Â÷¼ø µî ¿©·¯ °¡Áö ¹æ½ÄÀ¸·Î ¿°ÅÇÏ´Â ¹Ýº¹±â¸¦ °¢°¢ ¸¸µé¾î ³õ°í ¹ø°¥¾Æ °¡¸ç »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÇÑ° ´Ù¸® À̸§À» ¿°ÅÇÏ´Â µÎ °³ÀÇ ¹Ýº¹±â ¸Þ¼µå¸¦ Á¤ÀÇÇÑ´Ù.
EnumBridge2 |
using
System; using
System.Collections; class
HanBridge { static
string[] Bridge = {"ÆÈ´ç", "°µ¿", "±¤Áø", "õȣ", "¿Ã¸²ÇÈ", "Àá½Ç", "û´ã", "¿µµ¿", "¼º¼ö", "µ¿È£", "Çѳ²", "¹ÝÆ÷", "µ¿ÀÛ", "ÇÑ°", "¿øÈ¿", "¸¶Æ÷", "¼°", "¾çÈ", "¼º»ê", "°¡¾ç", "¹æÈ", "ÇàÁÖ", "±èÆ÷", "ÀÏ»ê"}; public
IEnumerable EastToWest() { for
(int i = 0; i < Bridge.Length; i++) { yield
return Bridge[i]; } } public
IEnumerable WestToEast() { for
(int i = Bridge.Length - 1; i >= 0; i--) { yield
return Bridge[i]; } } } class CSTest
{ static
void Main() { HanBridge
hb = new HanBridge(); foreach
(string b in hb.EastToWest()) { Console.WriteLine(b); } foreach
(string b in hb.WestToEast()) { Console.WriteLine(b); } } } |
foreach¹®¿¡¼ À̸§ÀÖ´Â ¹Ýº¹±â¸¦ Ä÷º¼Çó·³ ÁöÁ¤ÇÏ¿© ¿°ÅÇÑ´Ù. ÇÑ° ´Ù¸® À̸§ÀÌ µ¿¿¡¼ ¼·Î, ¼¿¡¼ µ¿À¸·Î µÎ ¹ø Ãâ·ÂµÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â À̸§ÀÖ´Â ¹Ýº¹±â·Î ±¸±¸´Ü ¿¹Á¦¸¦ ¸¸µç´Ù.
GuGuEnum |
using
System; using
System.Collections; class CSTest
{ public
static IEnumerable IntIterator(int s, int e) { for
(int i = s; i <= e; i++) yield return i; } static
void Main() { foreach
(int x in IntIterator(1, 9)) foreach
(int y in IntIterator(1, 9)) Console.WriteLine($"{x}
* {y} = {x * y}"); } } |
IntIterator ¸Þ¼µå´Â
s~e »çÀÌÀÇ Á¤¼ö¸¦ ¿°ÅÇÏ´Â Á¤¼ö ¿°ÅÀÚÀÌ´Ù. foreach¿¡¼ ÀÌ °´Ã¼¸¦ ¿°ÅÇÏ¿© 1~9 »çÀ̸¦ °¢°¢ ¼øȸÇÏ¸é¼ °öÀ» Ãâ·ÂÇÑ´Ù. ÀÌ·± ½ÄÀ̶ó¸é ¼Ò¼ö¸¸
¸®ÅÏÇÏ´Â ¹Ýº¹±â³ª ÇǺ¸³ªÄ¡ ¼ö¿À» ¿°ÅÇÏ´Â ¹Ýº¹±âµµ ¸¸µé ¼ö ÀÖ´Ù. ÀÌ·± ¾à¼Ó¿¡ ÀÇÇØ foreach ±¸¹®ÀÌ °¡´ÉÇØÁø´Ù. Ŭ·¡½º¸¦ ¸¸µå´Â °³¹ßÀÚ´Â ÀÎÅÍÆäÀ̽º
±¸ÇöÇÏ·ª ¹Ýº¹±â ¸¸µé·ª Èûµé°ÚÁö¸¸ ÃÖÁ¾ »ç¿ëÀÚ´Â foreach·Î Çѹ濡 ¼øȸ °¡´ÉÇÏ´Ù.
¹Ýº¹Àڴ óÀ½ º¸¸é ¹«Ã´ Çò°¥¸®´Â ±¸Á¶ÀÌ´Ù. ¹Ýº¹±â´Â °³¹ßÀÚ¿¡°Ô »ç¿ë
´ë»óÀÌÁö Á÷Á¢ ¸¸µå´Â °æ¿ì´Â ÈçÄ¡ ¾Ê´Ù. ²À ÇÊ¿äÇÏ´Ù¸é À§ ¿¹Á¦ÀÇ ÄÚµåÁß ºñ½ÁÇÑ °ÍÀ» º¹»çÇØ Á¶±Ý¸¸
¶â¾î °íÄ¡¸é µÈ´Ù. ÀÎÅÍÆäÀ̽º´Â ±¸ÇöƲµµ ºñ½ÁÇØ º¹»çÇØ ºÙÀ̱⠳»°øÀ¸·Î ±¸Çö »ó¼ÓÇÏ´Â ÀÛÀüÀÌ ¶§·Î´Â
¹«³ÇÏ°Ô Àß ¸ÔÇô µç´Ù.
ÂüÁ¶ ŸÀÔ³¢¸®ÀÇ ´ëÀÔÀº Èü¿¡ ÀÖ´Â °´Ã¼ÀÇ ¹øÁö¸¦ ´ëÀÔÇÏ´Â °ÍÀÌ¾î¼ °°Àº ´ë»óÀ» °¡¸®Å°¸ç ±×·¡¼ ÇÑ ÂÊÀ» º¯°æÇϸé
´Ù¸¥ Âʵµ ¿µÇâÀ» ¹Þ´Â´Ù. ´ÙÀ½ ¿¹Á¦·Î È®ÀÎÇØ º¸ÀÚ.
Shallow |
|
using
System; class C { public
int v; public
C(int av) { v = av; } } class CSTest
{ static
void Main() { C
a = new C(1234); C
b = a; b.v
= 5678; Console.WriteLine("a
= {0}, b = {1}", a.v, b.v); } } |
|
½ÇÇà°á°ú |
a = 5678, b =
5678 |
C Ŭ·¡½º¿¡´Â Á¤¼öÇü Çʵå v¿Í
»ý¼ºÀÚ°¡ ÀÖ´Ù. C ŸÀÔÀÇ °´Ã¼ a¸¦ 1234·Î ÃʱâÈÇÏ°í ´Ù¸¥ C ŸÀÔÀÇ °´Ã¼ b¿¡ a¸¦ ´ëÀÔÇÑ ÈÄ bÀÇ v¸¦ 5678·Î ¼öÁ¤Çß´Ù. º¹»çµÈ
»çº»À» ¼öÁ¤ÇßÁö¸¸ ¿øº»ÀÎ aµµ ¿µÇâÀ» ¹Þ´Â´Ù.
¹øÁö¸¸ º¹»çÇÒ »Ó ½ÇÁ¦ ³»¿ëÀ» º¹»çÇÏÁö ¾Ê´Â ¹æ½ÄÀ» ¾èÀº º¹»ç¶ó°í ÇÑ´Ù. ´ëÀÔ¿¡
ÀÇÇØ ¿ÏÀüÈ÷ µ¶¸³ÀûÀÎ »çº»À» »ý¼ºÇÏ·Á¸é ICloneable ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ Clone ¸Þ¼µå¸¦ ±¸ÇöÇÏ¿© ±íÀº º¹»ç¸¦ ÇØ¾ß ÇÑ´Ù.
Object Clone ()
Àμö´Â ÃëÇÏÁö ¾ÊÀ¸¸ç ÀڽŰú ¶È°°Àº ŸÀÔÀÇ °´Ã¼¸¦ ¸¸µé¾î ¸®ÅÏÇÑ´Ù. ÀÓÀÇÀÇ
ŸÀÔ¿¡ ´ëÇØ »çº»À» »ý¼ºÇϱâ À§ÇØ ¸®ÅÏ Å¸ÀÔÀº objectÀÌ´Ù.
Clone |
|
using
System; class C :
ICloneable { public
int v; public
C(int av) { v = av; } public
object Clone() { return
new C(v); } } class CSTest
{ static
void Main() { C
a = new C(1234); C
b = (C)a.Clone(); b.v
= 5678; Console.WriteLine("a
= {0}, b = {1}", a.v, b.v); } } |
|
½ÇÇà°á°ú |
a = 1234, b =
5678 |
Clone¿¡¼ ÀÚ½ÅÀÇ °ª°ú °°Àº »õ·Î¿î °´Ã¼¸¦ »ý¼º ¹× ¸®ÅÏÇÏ¿© ¿ÏÀüÇÑ
»çº»À» ¸¸µç´Ù. b¸¦ aÀÇ »çº»À¸·Î ¸¸µé°í ½Í´Ù¸é aÀÇ Clone ¸Þ¼µå¸¦ È£ÃâÇÏ¿© »õ °´Ã¼¸¦ »ý¼ºÇÏ°í ¿øÇϴ ŸÀÔÀ¸·Î
ij½ºÆÃÇÑ´Ù. b¸¦ ¾î¶»°Ô ¼öÁ¤ÇÏ´õ¶óµµ ¿øº»ÀÎ a´Â ¿µÇâÀ»
¹ÞÁö ¾Ê´Â´Ù.
C Ŭ·¡½º´Â Á¤¼öÇü ¸â¹ö Çϳª »ÓÀÌ¾î¼ »çº» »ý¼ºÀÌ ½±Áö¸¸ ³»ºÎ¿¡
ÂüÁ¶ ¸â¹ö°¡ ÀÖÀ¸¸é °¢ ¸â¹öµµ ±íÀº º¹»ç¸¦ ÇØ¾ß ÇϹǷΠº¹ÀâÇÑ Äڵ尡 ÇÊ¿äÇÏ´Ù. ±×·¯³ª »ç¿ëÀÚ´Â Clone¸¸ È£ÃâÇÏ¸é »çº»À» »ý¼ºÇÏ´Â ¸ðµç 󸮰¡ ³»ºÎ¿¡¼ ¿ÏÀüÇÏ°Ô Ã³¸®µÇ¾î Æí¸®ÇÏ´Ù.
¶óÀ̺귯¸® Â÷¿ø¿¡¼ ±»ÀÌ ICloneable ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÏ´Â
¸ñÀûÀº ±íÀº º¹»çÀÇ Çʿ伺À̳ª ¹æ¹ýÀ» ¾Ë·Á ÁÖ·Á´Â °ÍÀÌ ¾Æ´Ï¶ó ¸Þ¼µå¸íÀ» CloneÀ¸·Î ÅëÀÏÇÏÀÚ´Â ¶æÀÌ´Ù. ICloneable ÀÎÅÍÆäÀ̽º´Â ¾Æ¹« Äڵ嵵 ¾ø´Â ÅÖÅÖ ºó ²®µ¥±â¿¡ ºÒ°úÇÏ´Ù.
ÇÏÁö¸¸ À̸§À» Á¤ÇØ ³õÀ¸¸é Obj is ICloneable ¿¬»ê½ÄÀ¸·Î ±íÀº º¹»ç Áö¿ø ¿©ºÎ¸¦
È®½ÇÈ÷ ¾Ë ¼ö ÀÖ´Ù.