11-1.·çÆ® Ŭ·¡½º

11-1-1.object

°íÀü ¾ð¾î´Â ¹®¹ýÀ» Á¤ÀÇÇÏ´Â ¾ð¾î¿Í ±â´ÉÀ» Á¤ÀÇÇÏ´Â ¶óÀ̺귯¸®°¡ ºÐ¸®µÇ¾î ÀÖ´Ù. ÀÌ¿¡ ºñÇØ ´å³Ý, ÀÚ¹Ù °°Àº ÇÁ·¹ÀÓ¿öÅ©´Â ½ÇÇà ȯ°æÀ» Á¤ÀÇÇϱâ À§ÇØ ¾ð¾î¿Í ¶óÀ̺귯¸®°¡ ±ä¹ÐÇÏ°Ô ¿¬°üµÇ¾î ÀÖ´Ù. ¶óÀ̺귯¸®°¡ ¾ð¾îÀÇ ±â´ÉÀ» Á¦°øÇϴµ¥ ±âº» ŸÀÔÀÎ Á¤¼ö(int)Çü Á¶Â÷µµ ¶óÀ̺귯¸®¿¡ Á¤ÀÇµÈ Å¬·¡½ºÀÌ´Ù.

±×·¡¼­ ´å³ÝÀ» Àß È°¿ëÇÏ·Á¸é ´å³Ý Ŭ·¡½º ¶óÀ̺귯¸®(BCL)ÀÇ ±¸Á¶¸¦ Àß ÆľÇÇØ¾ß ÇÑ´Ù. BCLÀº Ŭ·¡½ºÀÇ ÁýÇÕÀ̸ç ÀÌ °èÃþÀÇ Á¦ÀÏ À§¿¡ ·çÆ® Ŭ·¡½ºÀÎ object°¡ ÀÖ´Ù. ¿ÀºêÁ§Æ®´Â °´Ã¼, Áï ¼¼»óÀÇ ¸ðµç °ÍÀ» ĪÇÑ´Ù. ´å³ÝÀÇ ¸ðµç Ŭ·¡½º´Â objectÀÇ ÈļÕÀÌ¸ç ±×·¡¼­ object¸¦ ¼Ó¼ÓµéÀÌ ºÐ¼®ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

´å³ÝÀÇ ·çÆ® Ŭ·¡½º´Â System.Object·Î Á¤ÀǵǾî ÀÖÀ¸¸ç C#Àº object¶ó´Â º°ÄªÀ» Á¦°øÇÑ´Ù. System.Object·Î ¾²´Â °ÍÀÌ ¿øÄ¢ÀÌÁö¸¸ using System ¼±¾ð¹®ÀÌ ÀÖÀ¸¸é °£´ÜÈ÷ Object·Î ¾µ ¼öµµ ÀÖ´Ù. º°ÄªÀÎ object´Â °¡´ÉÇÏÁö¸¸ System.object´Â ¾ÈµÈ´Ù.

 

System.Object Obj;                   // °¡Àå Á¤È®ÇÑ Ç¥Çö

Object Obj;                                             // ³×ÀÓ½ºÆäÀ̽º »ý·«

object Obj;                                                          // ¾ð¾îÀÇ º°Äª »ç¿ë

System.object Obj;                   // Ʋ¸° Ç¥Çö

 

C#Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇϹǷΠObject¿Í object´Â ´Ù¸¥ Ç¥ÇöÀÌÁö¸¸ using ¼±¾ð¹®ÀÌ ÀÖÀ» ¶§´Â °°´Ù. º°ÄªÀº ShiftÅ°¸¦ ¾È ´­·¯µµ µÇ´Ï Æí¸®ÇÏ´Ù. ¹®ÀÚ¿­À» Ç¥ÇöÇÏ´Â System.String°ú stringÀÇ °ü°èµµ µ¿ÀÏÇÏ´Ù. object´Â ÈļÕÀÇ ¸Þ¸ð¸® Àý¾àÀ» À§ÇØ Çʵå´Â ¾øÀ¸¸ç °´Ã¼¸¦ °ü¸®ÇÏ´Â ¸Þ¼­µå¸¸ °¡Áø´Ù.

 

¸Þ¼­µå

¼Ó¼º

¼³¸í

ToString

public virtual

°´Ã¼¸¦ ¹®ÀÚ¿­ ÇüÅ·ΠǥÇöÇÑ´Ù. µðÆúÆ®·Î Ŭ·¡½º À̸§À» ¸®ÅÏÇϴµ¥ ÇÊ¿ä½Ã ÀçÁ¤ÀÇÇÒ ¼ö ÀÖ´Ù.

GetType

public

°´Ã¼ÀÇ Å¸ÀÔ Á¤º¸¸¦ Á¦°øÇÏ´Â System.Type °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù.

MemberwiseClone

protected

°´Ã¼ÀÇ ¸â¹ö³¢¸® ÀÏ´ëÀÏ º¹»çÇÑ´Ù. ¾èÀº º¹»çÀÌ´Ù.

GetHashCode

public virtual

°´Ã¼¸¦ °Ë»öÇϱâ À§ÇÑ ÇؽðªÀ» ¸®ÅÏÇÑ´Ù.

Equals

public virtual

public static

µÎ °´Ã¼¸¦ ºñ±³ÇÏ¿© °°Àº °´Ã¼ÀÎÁö ÆǺ°ÇÑ´Ù. ³Î °´Ã¼¿Í ºñ±³ÇÒ ¼ö ÀÖ´Â Á¤Àû ¹öÀüµµ Áߺ¹ Á¤ÀǵǾî ÀÖ´Ù.

ReferenceEquals

public static

°´Ã¼°¡ °°Àº ´ë»óÀ» °¡¸®Å°°í ÀÖ´ÂÁö ºñ±³ÇÑ´Ù.

Finalize ¶Ç´Â ~Object();

protected virtual

Á¤¸® ÀÛ¾÷À» ¼öÇàÇÏ´Â Æı«ÀÚÀÌ´Ù. Finalize À̸§À» ¾²´Â ´ë½Å Ŭ·¡½º¸í¾Õ¿¡ ~¸¦ ºÙÀδÙ.

 

¼Ó¼º¿¡ virtualÀÌ Æ÷ÇÔµÈ °¡»ó ¸Þ¼­µå´Â ÆÄ»ý Ŭ·¡½º¿¡¼­ ÀçÁ¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç ÇÊ¿äÇÒ ¶§ ÀçÁ¤ÀÇÇ϶ó°í ¸¸µé¾î ³õÀº °ÍÀÌ´Ù. ƯÈ÷ °´Ã¼¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ToString ¸Þ¼­µå°¡ ÀÚÁÖ ÀçÁ¤ÀǵȴÙ. ´ÙÀ½ ¿¹Á¦´Â Time °´Ã¼¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÑ´Ù.

 

TimeToString

using System;

 

class Time {

             public int hour, min, sec;

             public Time(int h, int m, int s) { hour = h; min = m; sec = s; }

             public void OutTime() {

                           Console.WriteLine($"ÇöÀç ½Ã°£Àº {hour}½Ã {min}ºÐ {sec}ÃÊÀÌ´Ù.");

             }

             public override string ToString() {

                           return hour + "½Ã " + min + "ºÐ " + sec + "ÃÊ";

             }

}

 

class CSTest {

             static void Main() {

                           Time Now = new Time(18, 25, 55);

                           Now.OutTime();

                           Console.WriteLine(Now);

             }

}

½ÇÇà°á°ú

ÇöÀç ½Ã°£Àº 18½Ã 25ºÐ 55ÃÊÀÌ´Ù.

18½Ã 25ºÐ 55ÃÊ

 

WriteLineÀº TimeÀÇ ±¸Á¶¸¦ ¸ð¸£¸ç TimeÀ» Àμö·Î ¹ÞÁöµµ ¾Ê´Â´Ù. ÇÏÁö¸¸ TimeÀÌ ToString ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© ½º½º·ÎÀÇ Á¤º¸¸¦ ¹®ÀÚ¿­·Î º¯È¯Çϸé WriteLineÀ¸·Î Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. WriteLineÀº object ŸÀÔÀÇ Àμö¸¦ ¹Þ¾Æ ToStringÀ» È£ÃâÇÏ¿© ¹®ÀÚ¿­·Î º¯È¯ÇÏ¿© Ãâ·ÂÇÑ´Ù.

ToString ¸Þ¼­µå´Â object ¼Ò¼ÓÀ̾ ¸ðµç Ŭ·¡½º¿¡ Ç×»ó Á¸ÀçÇϸç Ŭ·¡½ºÀÇ À̸§À» Ãâ·ÂÇÑ´Ù. À§ ¿¹Á¦ÀÇ ToStringÀ» Á¦°ÅÇصµ Àß ÄÄÆÄÀϵÇÁö¸¸ º¸¿©ÁÖ´Â Á¤º¸°¡ ½Ç¿ëÀûÀÌÁö ¸øÇÏ´Ù. °´Ã¼ÀÇ ½ÇÁ¦ ³»¿ëÀ» »ó¼¼ÇÏ°Ô Ãâ·ÂÇÏ°í ½ÍÀ» ¶§ ToStringÀ» ÀçÁ¤ÀÇÇÑ´Ù. °´Ã¼ ½º½º·Î ÀÚ½ÅÀÇ Á¤º¸¸¦ ¹®ÀÚ¿­·Î Ç¥ÇöÇÏ¸é ·Î±×¸¦ ³²±â°Å³ª µð¹ö±ëÇÒ ¶§ À¯¿ëÇÏ´Ù.

11-1-2.°´Ã¼ÀÇ ºñ±³

object¿¡´Â °´Ã¼ÀÇ µ¿ÀϼºÀ» ºñ±³ÇÏ´Â ¼¼ °³ÀÇ ¸Þ¼­µå°¡ ÀÖ´Ù. ´å³Ý ¶óÀ̺귯¸®´Â °´Ã¼ ºñ±³°¡ ÇÊ¿äÇÒ ¶§ ÀÌ ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù. ÀÌ Áß Equals ¸Þ¼­µå´Â ÀçÁ¤ÀÇ °¡´ÉÇÏ¿© Ŭ·¡½º¿¡ µû¶ó °íÀ¯ÇÑ ºñ±³ ¹æ¹ýÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

 

public virtual bool Equals (Object obj)

°¡»ó ¸Þ¼­µåÀ̸ç A.Equals(B) Çü½ÄÀ¸·Î »ç¿ëÇÑ´Ù. µðÆúÆ® ±¸ÇöÀº ÂüÁ¶°¡ °°ÀºÁö, Áï µÎ °´Ã¼°¡ °¡¸®Å°´Â ¹øÁö°¡ °°ÀºÁö ºñ±³ÇÑ´Ù. ÆÄ»ý Ŭ·¡½º¿¡¼­ ÂüÁ¶°¡ ¾Æ´Ñ ½ÇÁ¦ Ŭ·¡½ºÀÇ ³»¿ëÀ» ºñ±³ÇÏ°í ½Í´Ù¸é ÀÌ ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÑ´Ù.

public static bool Equals (Object objA,Object objB)

Á¤Àû ¸Þ¼­µåÀ̸ç object.Equals(A, B) Çü½ÄÀ¸·Î »ç¿ëÇÑ´Ù. ºñÁ¤Àû ¸Þ¼­µå´Â A.Equals(null)Àº °¡´ÉÇÏÁö¸¸ null.Equals(B)´Â ¾ÈµÈ´Ù. ±×·¡¼­ object.Equals(null, B) ½ÄÀ¸·Î È£ÃâÇÏ´Â Á¤Àû ¸Þ¼­µå°¡ ÇÊ¿äÇÏ´Ù. µÑ ´Ù nullÀ̸é true¸¦ ¸®ÅÏÇÏ°í µÑ Áß Çϳª¸¸ nullÀ̸é false¸¦ ¸®ÅÏÇÑ´Ù. µÑ ´Ù nullÀÌ ¾Æ´Ï¸é °¡»ó Equals¸¦ È£ÃâÇÑ´Ù.

public static bool ReferenceEquals (Object objA,Object objB)

Á¤Àû Equals¿Í ¸¶Âù°¡Áö·Î ÂüÁ¶ ´ë»óÀ» ºñ±³ÇÑ´Ù. Á¤Àû Equals¿Í ±âº» µ¿ÀÛÀº °°Áö¸¸ ÀçÁ¤ÀÇÇÒ ¼ö ¾ø¾î Ç×»ó ÂüÁ¶·Î ºñ±³ÇÑ´Ù.

 

Á¤Àû Equals´Â ºñ±³ °´Ã¼ Áß Çϳª°¡ nullÀÎ °æ¿ì¸¦ À§ÇØ Á¸ÀçÇϹǷΠ½ÇÁ¦·Î´Â µÎ °³ÀÇ ºñ±³ ¸Þ¼­µå°¡ ÀÖ´Â ¼ÀÀÌ´Ù. ÀÌ µÑÀº ÀçÁ¤ÀÇ °¡´É¼ºÀÌ ´Ù¸£´Ù. ´ÙÀ½ ¿¹Á¦´Â Time Ŭ·¡½ºÀÇ °´Ã¼¸¦ µÎ ¸Þ¼­µå·Î ºñ±³ÇÑ´Ù.

 

TimeEquals

using System;

 

class Time {

             public int hour, min, sec;

             public Time(int h, int m, int s) { hour = h; min = m; sec = s; }

             public override bool Equals(object obj) {

                           Time Other = (Time)obj;

                           return (Other.hour == hour && Other.min == min && Other.sec == sec);

             }

}

 

class CSTest {

             static void Main() {

                           Time A = new Time(1, 2, 3);

                           Time B = new Time(1, 2, 3);

                           Time C = A;

                           Console.WriteLine("Equals(A, B) = " + Equals(A, B));

                           Console.WriteLine("Equals(A, C) = " + Equals(A, C));

                           Console.WriteLine("ReferenceEquals(A, B) = " + ReferenceEquals(A, B));

                           Console.WriteLine("ReferenceEquals(A, C) = " + ReferenceEquals(A, C));

             }

}

½ÇÇà°á°ú

Equals(A, B) = True

Equals(A, C) = True

ReferenceEquals(A, B) = False

ReferenceEquals(A, C) = True

 

object·ÎºÎÅÍ »ó¼Ó¹ÞÀº °¡»ó Equals¸¦ ÀçÁ¤ÀÇÇÏ¿© °´Ã¼ÀÇ ³»¿ëÀ» ºñ±³ÇÑ´Ù. ½ÃºÐÃÊ Çʵ尡 ¸ðµÎ ÀÏÄ¡ÇÏ¸é °°°í ¼Â Áß Çϳª¶óµµ ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é ´Ù¸¥ °ÍÀÌ´Ù. A¿Í B¸¦ ¶È°°Àº ½Ã°£À¸·Î ÃʱâÈ­ÇÏ°í C¿¡ A¸¦ ´ëÀÔÇÏ¿© °°Àº ´ë»óÀ» ÂüÁ¶Çϵµ·Ï ÇØ ³õ°í °¢ °´Ã¼¸¦ ºñ±³Çß´Ù.

°´Ã¼ÀÇ ½ÇÁ¦ ³»¿ëÀ» ºñ±³Çϵµ·Ï Equals¸¦ ÀçÁ¤ÀÇÇßÀ¸¹Ç·Î A, C »Ó¸¸ ¾Æ´Ï¶ó A, Bµµ °°Àº °ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù. ÇÏÁö¸¸ ReferenceEquals´Â A, C´Â °°´Ù°í Æò°¡ÇÏÁö¸¸ A, B´Â Èü»óÀÇ À§Ä¡°¡ ÀÏÄ¡ÇÏÁö ¾Ê¾Æ ´Ù¸£´Ù°í Æò°¡ÇÑ´Ù. Equals ¸Þ¼­µå ÀçÁ¤Àǹ®À» »èÁ¦ÇØ ¹ö¸®¸é Equals(A, B)µµ false¸¦ ¸®ÅÏÇÑ´Ù.

== ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ¿© ³»¿ëÀ» ºñ±³ÇÒ ¼öµµ ÀÖ´Ù. == ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇϸé Equals ¸Þ¼­µåµµ °°ÀÌ ÀçÁ¤ÀÇÇØ¾ß ÇÏ¸ç ±×·¸Áö ¾ÊÀ¸¸é ºñ±³ÀÇ ÀÏ°ü¼ºÀÌ ÈÑ¼ÕµÇ¾î °æ°í°¡ ¹ß»ýÇÑ´Ù. Equals¿Í == ¿¬»êÀÚ´Â Ç×»ó ½ÖÀ¸·Î ÀçÁ¤ÀÇÇØ¾ß ÇÏ¸ç ¶Ç ==À» ÀçÁ¤ÀÇÇϸé !=µµ °°ÀÌ ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù. Time Ŭ·¡½º°¡ ¿Ïº®ÇØÁö·Á¸é ´ÙÀ½ µÎ ¿¬»êÀÚ°¡ ´õ ÇÊ¿äÇÏ´Ù.

 

public static bool operator ==(Time A, Time B) {

         return (A.hour == B.hour && A.min == B.min && A.sec == B.sec);

}

public static bool operator !=(Time A, Time B) {

         return !(A == B);

}

 

°´Ã¼¸¦ ¸Ê¿¡ ÀúÀåÇÒ ¶§ ÀúÀå À§Ä¡¸¦ ã´Â GetHashCode ¸Þ¼­µåµµ ÀçÁ¤ÀÇÇ϶ó´Â °æ°í°¡ ¹ß»ýÇÑ´Ù. ºñ±³ ¹æ¹ýÀÌ ¹Ù²î¸é Çؽà Äڵ尡 ¿µÇâÀ» ¹Þ±â ¶§¹®ÀÌ´Ù. ¸Ê¿¡ ÀúÀåÇÒ °èȹÀÌ ¾ø´Ù¸é ¹«½ÃÇصµ »ó°ü¾ø´Âµ¥ ÀÚ¼¼ÇÑ °ÍÀº ¸Ê¿¡¼­ ¿¬±¸ÇØ º¸ÀÚ.

== ¿¬»êÀÚ°¡ ´õ ª°í ½¬¿îµ¥ object´Â ¿Ö ±»ÀÌ ºñ±³ ¸Þ¼­µå¸¦ Á¦°øÇÏ´Â °ÍÀϱî? »ç½Ç ==¸¸ ¿À¹ö·ÎµùÇصµ ¿øÇϴ´ë·Î ºñ±³ÇÒ ¼ö ÀÖ¾î ºñ±³ ¸Þ¼­µå°¡ ±»ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù. ¾Æ¹«·¡µµ Equals(A, B) º¸´Ù A == B°¡ ´õ º¸±â ÁÁ´Ù. C#¸¸ ¾´´Ù¸é Equals´Â ÀüÇô ÇÊ¿äÄ¡ ¾Ê´Ù.

ºñ±³ ¹æ¹ýÀÌ Áߺ¹ Á¦°øµÇ´Â ÀÌÀ¯´Â ´å³Ý °øÅë ¾ð¾î ±Ô¾à(CLS)¿¡ ¿¬»êÀÚ ¿À¹ö·ÎµùÀÌ Àǹ« »çÇ×ÀÌ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. ºñÁÖ¾ó º£ÀÌÁ÷ÀÌ == ¿¬»êÀÚ¸¦ È°¿ëÇÏÁö ¸øÇÏ´Ï ·çÆ®°¡ ¾î¿ ¼ö ¾øÀÌ ÀçÁ¤ÀÇ °¡´ÉÇÑ ¸Þ¼­µå¸¦ Á¦°øÇÏ´Â ¼ö¹Û¿¡ ¾ø´Ù. ´å³ÝÀÇ ¾ð¾î µ¶¸³¼º È®º¸¸¦ À§ÇÑ ºñ¿ëÀÎ ¼ÀÀÌ´Ù.

11-1-3.¸®Ç÷º¼Ç

¸®Ç÷º¼Ç(Reflection)Àº ½ÇÇàÁß¿¡ Ŭ·¡½º³ª °´Ã¼ÀÇ Å¸ÀÔ Á¤º¸¸¦ Á¶»çÇÏ´Â ±â´ÉÀÌ´Ù. ŸÀÔ Á¤º¸´Â ÄÄÆÄÀÏÁß¿¡¸¸ »ç¿ëµÇ¸ç ±â°è¾î·Î ¹Ù²î¸é »ç¶óÁö´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ±×·¯³ª C#Àº ŸÀÔ¿¡ ´ëÇÑ ¸ÞŸ µ¥ÀÌÅ͸¦ ½ÇÇà ÆÄÀÏ¿¡ ±â·ÏÇØ ³õÀ¸¸ç ÀÌ Á¤º¸¸¦ ÅëÇØ ´Ù¸¥ ¸ðµâÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö ÀÖ°í ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼öµµ ÀÖ´Ù.

ŸÀÔ Á¤º¸´Â Type Ŭ·¡½º·Î Ç¥ÇöÇÑ´Ù. Ŭ·¡½ºÀÇ Á¤º¸¸¦ Ç¥ÇöÇÏ´Â °Íµµ Ŭ·¡½ºÀÌ´Ù. TypeÀº Ãß»ó Ŭ·¡½ºÀ̸ç ŸÀÔÀ» Ç¥ÇöÇÏ´Â ´ëÇ¥ Ŭ·¡½º ¿ªÇÒ¸¸ ÇÏ°í ½ÇÁ¦ Á¤º¸´Â Type ÆÄ»ý Ŭ·¡½º°¡ °¡Áø´Ù. ŸÀÔ Á¤º¸ ¸ðµÎ Àбâ Àü¿ëÀ̾ Á¶»ç¸¸ ÇÒ ¼ö ÀÖ°í º¯°æÇÒ ¼ö´Â ¾ø´Ù. Type °´Ã¼´Â ´ÙÀ½ ¼¼ °¡Áö ¹æ¹ýÀ¸·Î ¾ò´Â´Ù.

 

l objectÀÇ GetType ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù. Time ÇüÀÇ Now °´Ã¼°¡ ÀÖÀ» ¶§ Now.GetType()À» È£ÃâÇϸé Type °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù.

l TypeÀÇ Á¤Àû ¸Þ¼­µåÀÎ GetTypeÀ» »ç¿ëÇÑ´Ù. °´Ã¼°¡ ¾Æ´Ñ ¹®ÀÚ¿­ Çü½ÄÀÇ Å¸ÀÔ À̸§À» Àμö·Î Àü´ÞÇÏ¸ç ´ë¼Ò¹®ÀÚ ±¸ºÐ ¿©ºÎ¿Í ŸÀÔÀÌ ¹ß°ßµÇÁö ¾ÊÀ» ¶§ ¿¹¿Ü ó¸® ¿©ºÎ¸¦ Ãß°¡·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. À̸§¸¸ Àü´ÞÇÏ¸é ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏ¸ç ¿¹¿Ü´Â ´øÁöÁö ¾Ê´Â´Ù. Time Ŭ·¡½ºÀÇ Á¤º¸¸¦ ÀÐ°í ½Í´Ù¸é Type.GetType("Time")À» È£ÃâÇÑ´Ù.

l typeof ¿¬»êÀÚ¸¦ »ç¿ëÇϸç Àμö·Î Ŭ·¡½º¸íÀ» Àü´ÞÇÑ´Ù. Time Ŭ·¡½ºÀÇ °æ¿ì typeof(Time)À¸·Î Type °´Ã¼¸¦ ¾ò´Â´Ù. ¾ð¾î°¡ Á¦°øÇÏ´Â ¿¬»êÀÚ¿©¼­ °¡Àå °£´ÜÇÏ´Ù.

 

¸®ÅϵǴ °´Ã¼´Â TypeÀÇ ÆÄ»ý ŸÀÔÀ̹ǷΠType ÇüÀÇ °´Ã¼·Î ¹ÞÀ¸¸é µÈ´Ù. ŸÀÔ¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â ÇÁ·ÎÆÛƼ¿Í ¸Þ¼­µå°¡ Á¦°øµÈ´Ù. ¸ÕÀú ÇÁ·ÎÆÛƼ ¸ñ·ÏºÎÅÍ º¸µÇ ÀÚÁÖ »ç¿ëÇÏ´Â ¸î °¡Áö¸¸ Á¤¸®Çß´Ù. ¿ÏÀüÇÑ ¸ñ·ÏÀº ·¹ÆÛ·±½º¸¦ Âü°íÇϱ⠹ٶõ´Ù.

 

ÇÁ·ÎÆÛƼ

ŸÀÔ

¼³¸í

Name

string ¨Þ

ŸÀÔÀÇ À̸§

NameSpace

string ¨Þ

Æ÷ÇÔµÈ ³×ÀÓ½ºÆäÀ̽ºÀÇ À̸§

FullName

string ¨Þ

³×ÀÓ½ºÆäÀ̽º¸¦ Æ÷ÇÔÇÑ À̸§

BaseType

Type ¨Þ

ºÎ¸ð Ŭ·¡½ºÀÇ Å¸ÀÔ

UnderlyingSystemType

Type ¨Þ

CLRÀÌ Á¦°øÇÏ´Â ³»ºÎ ½Ã½ºÅÛ Å¸ÀÔÀÇ À̸§

IsAbstract

bool ¨Þ

Ãß»ó Ŭ·¡½º ¿©ºÎ

IsArray

bool ¨Þ

¹è¿­ ¿©ºÎ

IsEnum

bool ¨Þ

¿­°ÅÇü ¿©ºÎ

IsNested

bool ¨Þ

Æ÷ÇÔµÈ ³»ºÎ ŸÀÔÀÎÁö¸¦ Á¶»çÇÑ´Ù.

IsGeneric

bool ¨Þ

Á¦³×¸¯ ŸÀÔÀÎÁö Á¶»çÇÑ´Ù.

IsInterface

bool ¨Þ

ÀÎÅÍÆäÀ̽º ¿©ºÎ

IsPrimitive

bool ¨Þ

±âº» ŸÀÔ Áß ÇϳªÀÎÁö¸¦ Á¶»çÇÑ´Ù.

IsSealed

bool ¨Þ

ºÀÀÎ ¿©ºÎ

IsValueType

bool ¨Þ

°ª ŸÀÔ ¿©ºÎ

 

ŸÀÔÀÇ À̸§°ú ¼Ò¼ÓµÈ ³×ÀÓ½ºÆäÀ̽º´Â ¹°·ÐÀÌ°í ºÎ¸ð Ŭ·¡½º¿Í ³»ºÎ ŸÀÔÀÇ À̸§±îÁö Á¶»çÇÒ ¼ö ÀÖ´Ù. Is·Î ½ÃÀ۵Ǵ ÇÁ·ÎÆÛƼ´Â ŸÀÔÀÌ Æ¯Á¤ ¼Ó¼ºÀ» °¡Áö´ÂÁö Á¶»çÇÑ´Ù. ¸Þ¼­µåµµ ¼ö½Ê°³³ª Á¤ÀǵǾî Àִµ¥ ÀÌ ¸Þ¼­µå¸¦ »ç¿ëÇÏ¸é ¾î¶² ¸â¹ö°¡ ÀÖ´ÂÁö »ó¼¼ÇÏ°Ô Á¶»çÇÒ ¼ö ÀÖ´Ù. ´ëÇ¥ÀûÀ¸·Î GetFields ¸Þ¼­µå¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.

 

public FieldInfo[] GetFields ()

 

°³º° Çʵ忡 ´ëÇÑ Á¤º¸´Â FieldInfo Ŭ·¡½º·Î Ç¥ÇöÇϸç FieldInfoÀÇ ¹è¿­·Î ¸ðµç ÇʵåÀÇ Á¤º¸¸¦ ¸®ÅÏÇÑ´Ù. FieldInfo´Â ¶Ç ´Ù¸¥ Ŭ·¡½ºÀε¥ ÇʵåÀÇ Á¤º¸¸¦ Á¶»çÇÏ´Â ÇÁ·ÎÆÛƼ¿Í ¸Þ¼­µå°¡ ¸â¹ö·Î Æ÷ÇԵǾî ÀÖ´Ù. NameÀº ÇʵåÀÇ À̸§ÀÌ°í IsPublic, IsPrivate, IsStaticÀº ÇʵåÀÇ ÁöÁ¤ÀÚ¸¦ Á¶»çÇÑ´Ù.

FieldType ÇÁ·ÎÆÛƼ´Â ÇʵåÀÇ Å¸ÀÔ¿¡ ´ëÇÑ ¶Ç ´Ù¸¥ Type °´Ã¼ÀÌ´Ù. Ŭ·¡½ºÀÇ Å¸ÀÔ Á¤º¸·ÎºÎÅÍ ÇÊµå ¸ñ·ÏÀ» ±¸Çߴµ¥ ÇʵåÀÇ Å¸ÀÔÀÌ ¶Ç ´Ù¸¥ ŸÀÔ Á¤º¸¿©¼­ Àç±ÍÀûÀÌ´Ù. ±×·¡¼­ ŸÀÔÀ» Á¶»çÇÏ´Â °úÁ¤Àº ¿©·¯ ´Ü°è·Î ÁßøµÈ´Ù. °³º° Çʵ带 Á¶»çÇÒ ¶§´Â ´ÙÀ½ ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù.

 

public abstract FieldInfo GetField (string name,BindingFlags bindingAttr)

 

ù ¹ø° Àμö´Â ÇʵåÀÇ À̸§ÀÌ¸ç µÎ ¹ø° Àμö´Â ´ë¼Ò¹®ÀÚ ±¸ºÐ ¿©ºÎ, °Ë»ö ´ë»ó ÁöÁ¤ÀÚÀÌ´Ù. GetEvent(s), GetProperty(ies), GetInterface(s), GetConstructor(s), GetMember(s) µîÀÇ ¸Þ¼­µåµµ ŸÀÔ¸¸ ´Ù¸¦ »Ó GetField(s)¿Í »ç¿ë ¹æ¹ýÀº °°´Ù.

ŸÀÔ Á¤º¸·ÎºÎÅÍ ¸ðµç ¸â¹öÀÇ Á¤º¸¸¦ ½Ã½ÃÄÝÄÝÇÏ°Ô Á¶»çÇÒ ¼ö ÀÖ¾î Ŭ·¡½º ¼±¾ð¹®À» º¹¿øÇس¾ ¼ö ÀÖÀ» Á¤µµ´Ù. ´ÙÀ½ ¿¹Á¦´Â Time Ŭ·¡½ºÀÇ Á¤º¸¸¦ Á¶»çÇÏ¿© Ãâ·ÂÇÑ´Ù. Time Ŭ·¡½º´Â Áö±Ý±îÁö ÁÙ°ð »ç¿ëÇØ¿ÔÀ¸¹Ç·Î ´Ã»ó ºÁ¿À´ø ±×´ë·ÎÀÌµÇ ³×ÀÓ½ºÆäÀ̽º ¾È¿¡ ¼±¾ðÇß´Ù.

 

TimeInfo

½ÇÇà°á°ú

using System;

using System.Reflection;

 

namespace MySpace {

             class Time {

                           public int hour, min, sec;

                           public Time(int h, int m, int s) { hour = h; min = m; sec = s; }

                           public void OuTimeTypeime() {

                                        Console.WriteLine($"ÇöÀç ½Ã°£Àº {hour}½Ã {min}ºÐ {sec}ÃÊÀÌ´Ù.");

                           }

             }

}

 

class CSTest {

             static void Main() {

                           MySpace.Time Now = new MySpace.Time(1, 2, 3);

                           Type TimeType = Now.GetType();

                           //Type TimeType = Type.GetType("MySpace.Time");

                           //Type TimeType = typeof(MySpace.Time);

 

                           Console.WriteLine(TimeType.Name);

                           Console.WriteLine(TimeType.FullName);

                           Console.WriteLine(TimeType.Namespace);

                           Console.WriteLine(TimeType.BaseType.Name);

                          Console.WriteLine(TimeType.UnderlyingSystemType.Name);

                           if (TimeType.IsValueType) { Console.WriteLine("°ª ŸÀÔÀÔ´Ï´Ù."); }

 

                           FieldInfo[] TimeField = TimeType.GetFields();

                           for (int i = 0; i < TimeField.Length; i++) {

                                        Console.WriteLine($"{i}¹ø° Çʵå = {TimeField[i].Name}");

                           }

 

                           MethodInfo[] TimeMethod = TimeType.GetMethods();

                           for (int i = 0; i < TimeMethod.Length; i++) {

                                        Console.WriteLine($"{i}¹ø° ¸Þ¼­µå = {TimeMethod[i].Name}");

                           }

             }

}

Time

MySpace.Time

MySpace

Object

Time

0¹ø° Çʵå = hour

1¹ø° Çʵå = min

2¹ø° Çʵå = sec

0¹ø° ¸Þ¼­µå = OuTimeTypeime

1¹ø° ¸Þ¼­µå = GetType

2¹ø° ¸Þ¼­µå = ToString

3¹ø° ¸Þ¼­µå = Equals

4¹ø° ¸Þ¼­µå = GetHashCode

 

¸®Ç÷º¼Ç °ü·Ã Ŭ·¡½º°¡ ¼±¾ðµÈ System.Reflection¿¡ ´ëÇØ using ¼±¾ðÀ» ÇØ¾ß ÇÑ´Ù. Time °´Ã¼ Now¸¦ »ý¼ºÇÏ°í NowÀÇ GetType ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© Type °´Ã¼ TimeTypeÀ» Á¶»çÇß´Ù. ¾Æ·¡ÂÊÀÇ ÁÖ¼® ó¸®µÈ µÎ Ç൵ ¶È°°Àº µ¿ÀÛÀ» Çϴµ¥ À̸§À» Àü´ÞÇÒ ¶§´Â ¼Ò¼Ó ³×ÀÓ½ºÆäÀ̽ºµµ °°ÀÌ ¹àÈù´Ù. Á¶»çµÈ TimeTypeÀ¸·Î Ŭ·¡½º ÀÚü¿Í Çʵå, ¸Þ¼­µåÀÇ Á¤º¸¸¦ Á¶»çÇØ Ãâ·ÂÇß´Ù.

ÇÁ·ÎÆÛƼ¸¦ Àоî À̸§, ³×ÀÓ½ºÆäÀ̽º, ºÎ¸ð Ŭ·¡½º µîÀ» Á¶»çÇÏ°í GetFields¿Í GetMethods ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© Çʵå¿Í ¸Þ¼­µåÀÇ ¸ñ·ÏÀ» Á¶»çÇß´Ù. »ó¼Ó¹ÞÀº ¸â¹öµµ ¸ðµÎ Á¶»çµÈ´Ù. Time Ŭ·¡½º´Â ±¸Á¶°¡ °£´ÜÇØ ÀÌ Á¤µµÁö¸¸ ³»ºÎ ŸÀÔÀ» ÁßøÇϰųª Æ÷ÇÔµÈ °´Ã¼°¡ ÀÖ´Ù¸é ÈξÀ º¹ÀâÇÏ´Ù.

¸®Ç÷º¼ÇÀº ½Ã½ºÅÛÀÌ »ç¿ëÇÏ´Â °ÍÀ̾ ¼¼ºÎÀûÀÎ »çÇ×±îÁö »ó¼¼ÇÏ°Ô ¿¬±¸ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¹°·Ð °¡²ûÀº ¸®Ç÷º¼ÇÀ» Á÷Á¢ ÇØ¾ß ÇÒ °æ¿ìµµ Àִµ¥ ÇÊ¿äÇÒ ¶§ ¿¬±¸ÇØ º¸¾Æ¶ó. °ü·Ã Ŭ·¡½º°¡ ¿ö³« ¸¹°í ¹æ´ëÇØ ·¹ÆÛ·±½º¸¦ Âü°íÇϸ鼭 »ç¿ëÇØ¾ß ÇÑ´Ù. Áß¿äÇÑ °ÍÀº ´å³Ý¿¡¼­´Â ½ÇÇàÁß¿¡ ŸÀÔÀÇ Á¤º¸¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ̸ç ÀÌ·Î ÀÎÇØ ¿©·¯ °¡Áö ¾ÈÁ¤ÀûÀΠŸÀÔ °ü·Ã ÀÛ¾÷ÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù.

¾î¶² ÀÛ¾÷ÀÌ °¡´ÉÇÑÁö ¾Õ Ç×ÀÇ TimeEquals ¿¹Á¦¸¦ ÅëÇØ ¾Ë¾Æº¸ÀÚ. ÀÌ ¿¹Á¦´Â Equals¸¦ ÀçÁ¤ÀÇÇÏ¿© ½Ã°£ °´Ã¼ÀÇ ³»¿ë³¢¸® ºñ±³Çϴµ¥ EqualsÀÇ º»Ã¼ Äڵ尡 ³Ê¹« ´ëÃæ ÀÛ¼ºµÇ¾î ÀÖ¾î À§ÇèÇÏ´Ù. MainÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ®ÇØ º¸ÀÚ.

 

class CSTest {

         static void Main() {

                      Time A = new Time(1, 2, 3);

                      Time B = null;

                      A.Equals(B);

         }

}

 

ºñ±³ ´ë»ó °´Ã¼ÀÎ B¸¦ null·Î ÃʱâÈ­ÇÑ ÈÄ Equals·Î Àü´ÞÇß´Ù. ÄÄÆÄÀÏ ¿¡·¯´Â ¾Æ´ÏÁö¸¸ Equals´Â Àμö·Î ¹ÞÀº obj¸¦ (Time)À¸·Î ¹«Á¶°Ç ij½ºÆÃÇÏ¿© ´Ù¿îµÇ¾î ¹ö¸°´Ù. A.Equals("¾ðÁ¦µçÁö") ó·³ ¾û¶×ÇÑ °´Ã¼¸¦ Àü´ÞÇصµ ´Ù¿îµÈ´Ù. ¹®Á¦´Â Àü´Þ¹ÞÀº Àμö¸¦ °­Á¦ ij½ºÆÃÇѴٴµ¥ ÀÖ´Ù. Time Other = (Time)obj ¹®¿¡¼­ obj°¡ ¹Ýµå½Ã TimeÀÇ °´Ã¼À̸ç nullÀÌ ¾Æ´Ï¶ó´Â º¸ÀåÀÌ ¾ø´Ù. ¾î¶² °æ¿ì¶óµµ ´Ù¿îµÇÁö ¾Êµµ·Ï ÇÏ·Á¸é objÀÇ Å¸ÀÔ Á¤º¸¸¦ ½ÇÇàÁß¿¡ Á¶»çÇØ¾ß ÇÑ´Ù.

 

public override bool Equals(object obj) {

         if (obj == null || obj.GetType() != this.GetType()) return false;

         Time Other = (Time)obj;

         return (Other.hour == hour && Other.min == min && Other.sec == sec);

}

 

obj°¡ nullÀ̰ųª ÀÌ Å¬·¡½º¿Í ´Ù¸¥ ŸÀÔÀ̸é false¸¦ ¸®ÅÏÇϵµ·Ï ¿¡·¯ ó¸®Çß´Ù. ÀÌ·± Á¶°Ç 󸮰¡ °¡´ÉÇÏ·Á¸é objÀÇ Å¸ÀÔ Á¤º¸¸¦ ½ÇÇàÁß¿¡ Á¶»çÇØ¾ß Çϴµ¥ ÀÌ ±â´ÉÀÌ ¹Ù·Î ¸®Ç÷º¼ÇÀÌ´Ù. ¿¬»êÀÚ¸¦ »ç¿ëÇϸé Á» ´õ °£´ÜÇÏ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

 

public override bool Equals(object obj) {

         Time Other = obj as Time;

         if (Other == null) return false;

         return (Other.hour == hour && Other.min == min && Other.sec == sec);

}

 

as ¿¬»êÀڷΠij½ºÆÃÇÏ¿© nullÀ̸é Time °´Ã¼°¡ ¾Æ´Ï´Ù. is, as °°Àº ¿¬»êÀÚ°¡ µ¿ÀÛÇÒ ¼ö ÀÖ´Â ÀÌÀ¯µµ ¸®Ç÷º¼Ç ´öºÐÀÌ´Ù. as ¿¬»êÀÚ´Â ³»ºÎÀûÀ¸·Î ¸®Ç÷º¼ÇÀ» ÅëÇØ objÀÇ Å¸ÀÔ Á¤º¸¸¦ Á¶»çÇÏ¿© obj°¡ TimeÀÇ °´Ã¼ÀÎÁö ÆǺ°ÇÑ´Ù. is, as ¿¬»êÀÚ¸¸ Àß ½á¸Ô¾îµµ ¸®Ç÷º¼ÇÀÇ ÀÌÁ¡À» ÃæºÐÈ÷ È°¿ëÇÒ ¼ö ÀÖ´Ù.

11-1-4.nameof ¿¬»êÀÚ

¸íĪÀº ÄÄÆÄÀÏÁß¿¡¸¸ »ç¿ëµÇ¸ç ½ÇÇà ÆÄÀÏ·Î ¹Ù²î¸é ´õ ÀÌ»ó »ç¿ëÇÒ ÀÏÀÌ ¾ø´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ÇÏÁö¸¸ ·Î±×¸¦ Ãâ·ÂÇϰųª »ç¿ëÀÚ¿¡°Ô º¯¼ö°ªÀ» Á÷Á¢ º¸¿©ÁÙ ¶§°¡ Àִµ¥ º¸Åë ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

 

int value = 15;

Console.WriteLine("value = " + value);

 

¹®ÀÚ¿­ ¾È¿¡ º¯¼ö À̸§À» Á÷Á¢ ÀûÀ¸¸é µÈ´Ù. ÀÌ »óÅ¿¡¼­ value º¯¼öÀÇ À̸§À» ¹Ù²Ù¸é ¹®ÀÚ¿­¾ÈÀÇ À̸§µµ ¹Ù²ã¾ß ÇÑ´Ù. º¯¼ö¸¸ ¹Ù²Ù°í ¹®ÀÚ¿­ ¾ÈÀ» ±×´ë·Î µÎ¸é ÄÄÆÄÀÏ¿¡´Â ÀÌ»óÀÌ ¾øÁö¸¸ Á¤È®ÇÏÁö ¾ÊÀº Á¤º¸¸¦ Ãâ·ÂÇÏ´Â ¼ÀÀÌ´Ù. ÀÌ·² ¶§ nameof ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸é º¯¼ö¸íÀ» ¹®ÀÚ¿­ ÇüÅ·Π±¸ÇØÁØ´Ù.

 

int value = 15;

Console.WriteLine(nameof(value) + " = " + value);

 

nameof(value)°¡ ¸®ÅÏÇÏ´Â °ªÀº "value"ÀÌ´Ù. ¹®ÀÚ¿­·Î Á÷Á¢ À̸§À» ÁöÁ¤ÇÏ´Â °Í°ú Å« Â÷ÀÌ´Â ¾øÁö¸¸ º¯¼ö¸íÀÌ ¹Ù²î¸é ¿¡·¯ 󸮵Ǿî Ç×»ó Á¤È®ÇÑ À̸§À» Ç¥±âÇϵµ·Ï °­Á¦ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. nameof ¿¬»êÀÚ´Â ¼Ò¼ÓÀº »ý·«ÇÏ°í ¸¶Áö¸·ÀÇ ¸íĪ¸¸ ¸®ÅÏÇÑ´Ù.

 

string name = nameof(System.Console.WriteLine);

Console.WriteLine(name);

 

System.Console ¼Ò¼ÓÀº »©°í WriteLine À̸§¸¸ Ãâ·ÂÇÑ´Ù. ÄÚµå»ó¿¡¼­ ¸íĪÀ» Á÷Á¢ ÂüÁ¶ÇÒ ÀÏÀº ¹«Ã´ µå¹°´Ù. nameof ¿¬»êÀÚ´Â ½ÇÇàÁß¿¡ ¸íĪÀÇ À̸§À» ±¸ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÄÄÆÄÀÏÁß¿¡ ¹Ì¸® ġȯµÇ±â ¶§¹®¿¡ ¸®Ç÷º¼Çº¸´Ù ºü¸£´Ù.