9-2.ÀÎÅÍÆäÀ̽º È°¿ë

9-2-1.¿­°ÅÇϱâ

´å³Ý ¶óÀ̺귯¸®µµ ¸¹Àº ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϸç ÇØ´ç ±â´ÉÀ» ±¸ÇöÇÏ´Â Çʼö ¸Þ¼­µå°¡ Àß Á¤¸®µÇ¾î ÀÖ´Ù. ¹°·Ð ±¸ÇöÀº ¾ø°í ¸Þ¼­µå ¸ñ·Ï¸¸ ÀÖÀ» »ÓÀÌ´Ù. ´å³Ý ¸Å´º¾óÀ» º¸¸é Á¾Á¾ ´ÙÀ½°ú °°Àº ¹®±¸¸¦ º¼ ¼ö ÀÖ´Ù.

 

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) ÇüÅ¿©¾ß °¢ ·çÇÁ°¡ µ¶¸³ÀûÀ¸·Î µ¹¾Æ°£´Ù. Á¦¾î º¯¼ö°¡ ·çÇÁ ¼ö¸¸Å­ ÇÊ¿äÇÏ´Ï µû·Î »ý¼º °¡´ÉÇÑ ¿­°ÅÀÚ°¡ ÇÊ¿äÇÏ´Ù.

9-2-2.¹Ýº¹±â

¿­°Å ±â´ÉÀº ÀÎÅÍÆäÀ̽ºÀÇ ±ÔÄ¢´ë·Î ¸Þ¼­µå¸¸ ±¸ÇöÇÏ¸é µÇ´Ï ¾î·ÆÁö´Â ¾Ê´Ù. ´Ù¸¸ ÄÚµåÀÇ ¾çÀÌ ¸¹¾Æ ¹ø°Å·Ó°í ÀܼÕÁúÀÌ ¸¹ÀÌ °£´Ù. ±×·¡¼­ Á» ´õ °£ÆíÇÏ°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Â ¹Ýº¹±â(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·Î Çѹ濡 ¼øȸ °¡´ÉÇÏ´Ù.

¹Ýº¹Àڴ óÀ½ º¸¸é ¹«Ã´ Çò°¥¸®´Â ±¸Á¶ÀÌ´Ù. ¹Ýº¹±â´Â °³¹ßÀÚ¿¡°Ô »ç¿ë ´ë»óÀÌÁö Á÷Á¢ ¸¸µå´Â °æ¿ì´Â ÈçÄ¡ ¾Ê´Ù. ²À ÇÊ¿äÇÏ´Ù¸é À§ ¿¹Á¦ÀÇ ÄÚµåÁß ºñ½ÁÇÑ °ÍÀ» º¹»çÇØ Á¶±Ý¸¸ ¶â¾î °íÄ¡¸é µÈ´Ù. ÀÎÅÍÆäÀ̽º´Â ±¸ÇöƲµµ ºñ½ÁÇØ º¹»çÇØ ºÙÀ̱⠳»°øÀ¸·Î ±¸Çö »ó¼ÓÇÏ´Â ÀÛÀüÀÌ ¶§·Î´Â ¹«³­ÇÏ°Ô Àß ¸ÔÇô µç´Ù.

9-2-3.±íÀº º¹»ç

ÂüÁ¶ ŸÀÔ³¢¸®ÀÇ ´ëÀÔÀº Èü¿¡ ÀÖ´Â °´Ã¼ÀÇ ¹øÁö¸¦ ´ëÀÔÇÏ´Â °ÍÀ̾ °°Àº ´ë»óÀ» °¡¸®Å°¸ç ±×·¡¼­ ÇÑ ÂÊÀ» º¯°æÇÏ¸é ´Ù¸¥ Âʵµ ¿µÇâÀ» ¹Þ´Â´Ù. ´ÙÀ½ ¿¹Á¦·Î È®ÀÎÇØ º¸ÀÚ.

 

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 ¿¬»ê½ÄÀ¸·Î ±íÀº º¹»ç Áö¿ø ¿©ºÎ¸¦ È®½ÇÈ÷ ¾Ë ¼ö ÀÖ´Ù.