12-3.¾îÆ®¸®ºäÆ®

12-3-1.°øÅë ¾îÆ®¸®ºäÆ®

¾îÆ®¸®ºäÆ®(Attribute)´Â ÄÄÆÄÀÏ·¯¿¡°Ô Äڵ忡 ´ëÇÑ Ãß°¡ Á¤º¸¸¦ Á¦°øÇÑ´Ù. ÀÌ Á¤º¸´Â ÄÄÆÄÀÏ ¹æ½Ä¿¡ ¿µÇâÀ» Áְųª ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇÔµÇ¾î ¸®Ç÷º¼ÇÀ¸·Î Á¶»çÇÒ ¼ö ÀÖÀ¸¸ç ÄÚµå ¹®¼­È­¿¡µµ »ç¿ëµÈ´Ù. °³¼ö³ª È°¿ë ¿ëµµ¿¡ ´ëÇÑ Á¦¾àÀº ¾ø´Ù. Àû¿ë ´ë»ó¾Õ¿¡ [ ]°ýÈ£¿Í ÇÔ²² ¾îÆ®¸®ºäÆ® ¸íÀ» Àû°í ( ) °ýÈ£ ¾È¿¡ Àμö¸¦ ÁöÁ¤ÇÑ´Ù. À̸§¾ø´Â(unnamed, positional) Àμö¿Í À̸§ÀÖ´Â(named) Àμö°¡ Àִµ¥ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÌ Á¶±Ý ´Ù¸£´Ù. ±âº» Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

 

 [SomeAttribute(Àμö)]

Ŭ·¡½º, ¸Þ¼­µå, ÇÁ·ÎÆÛƼ, Àμö µîµî

 

½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â °øÅë ¾îÆ®¸®ºäÆ®¿Í »ç¿ëÀÚ°¡ Á¤ÀÇÇÏ´Â Ä¿½ºÅÒ ¾îÆ®¸®ºäÆ®°¡ ÀÖ´Ù. °øÅë ¾îÆ®¸®ºäÆ®´Â ÁÖ·Î ÄÄÆÄÀÏ ¹æ½Ä¿¡ ¿µÇâÀ» ÁØ´Ù.

Conditional

¸Þ¼­µåÀÇ ÄÄÆÄÀÏ ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. Àμö·Î ÁöÁ¤ÇÑ ½Éº¼ÀÌ ÀÖÀ¸¸é ¸Þ¼­µå¸¦ ÄÄÆÄÀÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ¹«½ÃÇÑ´Ù. ½Éº¼Àº #define¹®À¸·Î Á¤ÀÇÇÑ´Ù. ¸Þ¼­µå Á¤ÀǺΠ»Ó¸¸ ¾Æ´Ï¶ó È£ÃâºÎ±îÁö °°ÀÌ Á¶°ÇºÎ ó¸®ÇÏ¿© ¾Æ¿¹ ¾ø´Â ÇÔ¼ö·Î ¸¸µé ¼ö ÀÖ´Ù. ´ÙÀ½ Á¶°Ç¿¡ ºÎÇÕÇÏ´Â ¸Þ¼­µå¿¡¸¸ ¾µ ¼ö ÀÖ´Ù.

 

l ÀÎÅÍÆäÀ̽º ¼Ò¼ÓÀÇ ¸Þ¼­µå¿¡´Â ¾µ ¼ö ¾ø´Ù. ÀÎÅÍÆäÀ̽º´Â È®Á¤µÈ °è¾àÀ̱⠶§¹®¿¡ Á¶°ÇºÎ·Î ÄÄÆÄÀÏÇؼ­´Â ¾ÈµÈ´Ù.

l °¡»ó ¸Þ¼­µå¿¡´Â ¾µ ¼ö ÀÖÁö¸¸ ÀçÁ¤ÀǵǴ ¸Þ¼­µå¿¡´Â ¾µ ÇÊ¿ä°¡ ¾ø´Ù. °¡»ó ¸Þ¼­µå°¡ Á¶°ÇºÎÀ̸é ÀçÁ¤ÀÇµÈ ¸Þ¼­µåµµ ÀÚµ¿À¸·Î Á¶°ÇºÎÀÌ´Ù.

l ¸Þ¼­µå°¡ ¾ø¾îµµ ´Ù¸¥ ºÎºÐÀÌ ¿µÇâÀ» ¹Þ¾Æ¼­´Â ¾ÈµÈ´Ù. À־ ±×¸¸ ¾ø¾îµµ ±×¸¸À̾î¾ß Çϸç ÇÙ½É ¸Þ¼­µå°¡ Á¶°ÇºÎ¿©¼­´Â ¾ÈµÈ´Ù. ¸®ÅÏ Å¸ÀÔÀº void¿©¾ß Çϸç Ãâ·Â¿ë Àμöµµ °¡Áú ¼ö ¾ø´Ù.

 

´ÙÀ½ ¿¹Á¦´Â ¼Î¾î¿þ¾î ÇÁ·Î±×·¥ÀÇ ÇÑ ¿¹Àε¥ TRIAL ½Éº¼ÀÇ Á¤ÀÇ ¿©ºÎ¿¡ µû¶ó TrialMessage ¸Þ¼­µåÀÇ ÄÄÆÄÀÏ ¿©ºÎ°¡ °áÁ¤µÈ´Ù.

 

Trial

#define TRIAL

using System;

using System.Diagnostics;

 

class CSTest {

             [Conditional("TRIAL")]

             static void TrialMessage() {

                           Console.WriteLine("ÀÌ Á¦Ç°Àº 30ÀÏ°£¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.");

                           Console.WriteLine("Á¤Ç°À» ±¸ÀÔÇϽ÷Á¸é ¾î¼°í Àú¼°í.\n");

             }

             static void Main() {

                           TrialMessage();

                           Console.WriteLine("°ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù.");

             }

}

½ÇÇà°á°ú

ÀÌ Á¦Ç°Àº 30ÀÏ°£¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

Á¤Ç°À» ±¸ÀÔÇϽ÷Á¸é ¾î¼°í Àú¼°í.

 

°ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù.

 

TrialMessage ¸Þ¼­µå´Â Conditional ¾îÆ®¸®ºäÆ®¿¡ ÀÇÇØ TRIAL ½Éº¼ÀÌ Á¤ÀǵǾî ÀÖÀ» ¶§¸¸ ÄÄÆÄÀϵȴÙ. ÀÌ´ë·Î ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇϸé TrialMessageµµ °°ÀÌ ÄÄÆÄÀϵǸç ÇÁ·Î±×·¥ ½ÃÀÛ Àü¿¡ °øÂ¥ »ç¿ëÀÚ¸¦ ±ÍÂú°Ô ÇÏ´Â ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù.

¼Ò½º ¼±µÎÀÇ #define TRIALÀ» ÁÖ¼® ó¸®Çϸé TrialMessage ¸Þ¼­µå´Â ÄÄÆÄÀÏ ´ë»ó¿¡¼­ Á¦¿ÜµÇ¸ç È£Ãâ Äڵ嵵 °°ÀÌ Á¦°ÅµÈ´Ù. ¸Þ½ÃÁö°¡ Ãâ·ÂµÇÁö ¾Ê°í °ð¹Ù·Î °ÔÀÓÀÌ ½ÃÀ۵ȴÙ. µÎ °³ÀÇ Á¶°ÇÀ» °°ÀÌ ±â¼úÇÏ¸é µÑ Áß Çϳª¶óµµ Á¤ÀǵǾî ÀÖÀ» ¶§ ÄÄÆÄÀϵȴÙ.

 

[Conditional("TRIAL"), Conditional("FREE")]

static void TrialMessage() { ... }

 

TRIALÀ̳ª FREE µÑ Áß Çϳª¶óµµ Á¤ÀǵǾî ÀÖÀ¸¸é ¸Þ½ÃÁö´Â Ãâ·ÂµÈ´Ù. Áï, µÎ Á¶°ÇÀº OR·Î ¿¬°áµÈ´Ù. µÎ Á¶°ÇÀ» AND·Î ¿¬°áÇÏ´Â ¹æ¹ýÀº Á¶±Ý ±î´Ù·Î¿îµ¥ µÎ °³ÀÇ ¸Þ¼­µå¸¦ Á¤ÀÇÇÏ°í ÇÑ ÂÊ¿¡¼­ ´Ù¸¥ ÂÊÀ» È£ÃâÇÑ´Ù.

 

[Conditional("TRIAL")]

static void TrialMessage() { TrialMessage2(); }

 

[Conditional("FREE")]

static void TrialMessage2() { ... }

 

Á¶°ÇºÎ ÄÄÆÄÀÏ ±â´ÉÀº È°¿ë¼ºÀÌ ³ô´Ù. ƯÈ÷ µð¹ö±× ¹öÀü°ú ¸±¸®Áî ¹öÀüÀ» ´Ù¸£°Ô ÀÛ¼ºÇÒ ¶§ ½Ç¿ëÀûÀÌ´Ù. µð¹ö±× ¹öÀüÀÏ ¶§´Â DEBUG ½Éº¼ÀÌ Á¤ÀǵǹǷΠÀÌ ½Éº¼ÀÌ ÀÖÀ» ¶§ Æ®·¹À̽º Ãâ·Â¹®À̳ª ·Î±× ±â·Ï¹®À» ÀÛ¼ºÇÏ¿© µð¹ö±ë ¿ëµµ·Î ¾µ ¼ö ÀÖ´Ù.

Obsolete

Obsolete ¾îÆ®¸®ºäÆ®´Â °æ°í³ª ¿¡·¯¸¦ ¹ß»ý½ÃÄÑ °ð Æó±âµÉ ±¸½Ä ÄÚµåÀÓÀ» Ç¥½ÃÇÑ´Ù. ÀÌÀü °ÍÀ» Æó±âÇÏ°í »õ·Î¿î °ÍÀ¸·Î ´ëüÇÏ´õ¶óµµ ±âÁ¸ »ç¿ëÀÚ¸¦ À§ÇØ ÇԺηΠ¾ø¾Ö ¹ö·Á¼­´Â ¾ÈµÇ¸ç °èµµ ±â°£ÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·² ¶§ Obsolete ¾îÆ®¸®ºäÆ®¸¦ ºÙÀ̴µ¥ °ÅÀÇ ´ëºÎºÐÀÇ ¿ä¼Ò¿¡ Àû¿ë °¡´ÉÇÏ´Ù.

 

[Obsolete("¸Þ½ÃÁö", error)]

´ë»ó

 

ù ¹ø° Àμö´Â °æ°í³ª ¿À·ù ¸Þ½ÃÁö ¹®ÀÚ¿­À̸ç ÄÄÆÄÀÏ·¯ÀÇ Ãâ·Ââ¿¡ ³ªÅ¸³­´Ù. Æó±â ÀÌÀ¯¿Í ´ëü ¼ö´Ü, Æó±â ½ÃÁ¡À» »ó¼¼ÇÏ°Ô ±â¼úÇÒ ¼ö ÀÖ´Ù. µÎ ¹ø° Àμö´Â ¿À·ù ¹ß»ý ¿©ºÎÀε¥ ÀÌ Àμö°¡ trueÀÌ¸é ¿¡·¯·Î 󸮵Ǿî ÄÄÆÄÀÏÀÌ °ÅºÎµÈ´Ù. falseÀ̰ųª »ý·«ÇÏ¸é °æ°í·Î ó¸®µÇ¾î ´çºÐ°£Àº °è¼Ó ¾µ ¼ö ÀÖ´Ù.

 

Obsolete

using System;

using System.Diagnostics;

 

class CSTest {

             [Obsolete("NewMethod¸¦ »ç¿ëÇϽÿÀ")]

             static public void OldMethod() { }

 

             static public void NewMethod() {

                           Console.WriteLine("»õ·Î ¸¸µç ÃÖ½ÅÇü ¸Þ¼­µåÀÔ´Ï´Ù.");

             }

 

             [Obsolete("¾ÕÀ¸·Î´Â ÀÌ ¸Þ¼­µå¸¦ ¾²Áö ¸¶½Ã¿À.", true)]

             static public void OutDateMethod() { }

 

             static void Main() {

                           OldMethod();

                           NewMethod();

                           // OutDateMethod();

             }

}

 

OldMethod¿¡ Obsolete ¾îÆ®¸®ºäÆ®°¡ ÁöÁ¤µÇ¾î ÀÖ¾î °ð Æó±âµÈ´Ù´Â °Í°ú ´õ È¿À²ÀûÀÎ NewMethod°¡ Á¦°øµÊÀ» ¾Ë¸°´Ù. ÄÄÆÄÀÏÇÏ¸é »ç¿ëÇÏÁö ¸» °Í°ú ´ëü ¼ö´Ü¿¡ ´ëÇÑ Ä£ÀýÇÑ ¾È³» ¸Þ½ÃÁö°¡ Ãâ·Ââ¿¡ ³ªÅ¸³­´Ù.

 

°æ°í CS0618: 'CSTest.OldMethod()'Àº(´Â) »ç¿ëµÇÁö ¾Ê½À´Ï´Ù. 'NewMethod¸¦ »ç¿ëÇϽÿÀ'

 

°æ°íÀÏ »ÓÀ̾ ÄÄÆÄÀÏÀº °¡´ÉÇÏ¸ç ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ°í °è¼Ó »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ¾ðÁ¦ Æó±âµÉÁö ¸ð¸£´Ï °¡±ÞÀû Áö½Ã´ë·Î µû¸£´Â °ÍÀÌ ÁÁ´Ù. »ç¿ëÀÚ´Â ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ OldMethod È£Ãâ¹®À» NewMethod È£Ãâ¹®À¸·Î Çϳª µÑ¾¿ ¹Ù²Ü °ÍÀÌ´Ù.

OutDateMethod´Â µÎ ¹ø° Àμö°¡ true¿©¼­ ¾Æ¿¹ ¿¡·¯·Î 󸮵Ǹç ÁÖ¼®À» Ç®¸é ÄÄÆÄÀÏÀÌ °ÅºÎµÈ´Ù. ¾Æ¿¹ ¾ø¾Ö ¹ö¸®´Â °Íµµ ÇÑ ¹æÆíÀÌÁö¸¸ ÀÌ·¸°Ô µÇ¸é »ç¿ëÀÚ´Â ¿Ö ÀÌ ¸Þ¼­µå°¡ Æó±âµÇ¾ú´ÂÁö ¾Ë ¼ö ¾øÀ¸¹Ç·Î ´çºÐ°£Àº À¯¿¹ ±â°£À» µÎ´Â °ÍÀÌ ÁÁ´Ù.

°³¹ßÀÚ´Â ±¸Çü ¸Þ¼­µå°¡ Àß µ¿ÀÛÇÏ¸é °è¼Ó ¾²´Â °ü¼ºÀÌ ÀÖ´Ù. ´çÀå Àß µ¹¾Æ°¡¸é ¼Õ º¸±â ±ÍÂú¾Æ ¹æÄ¡ÇÏ´Ù°¡ ¸Þ¼­µå°¡ ¾ø¾îÁö¸é ±×¶§¼­¾ß ºÎ·ªºÎ·ª »õ·Î¿î ¹æ¹ýÀ» ã´À¶ó ´çȲÇÑ´Ù. Obsolete´Â Æó±â ¿¹Á¤À» Àû±ØÀûÀ¸·Î ¾Ë·Á ºÎµå·¯¿î ÀÌÀüÀ» À¯µµÇÑ´Ù.

DllImport

DllImport ¾îÆ®¸®ºäÆ®´Â ¿ÜºÎ DLLÀÇ ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§ »ç¿ëÇÑ´Ù. COM ¶óÀ̺귯¸®ÀÇ ÇÔ¼ö³ª Win32 API ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ½ÍÀ» ¶§ ÀÌ ¾îÆ®¸®ºäÆ®·Î ¾î¶² DLL¿¡ ÀÖ´Â ÇÔ¼öÀÎÁö ¹àÈù´Ù. ´ÙÀ½ ¿¹Á¦´Â µÎ °³ÀÇ API ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

DllImport

using System;

using System.Runtime.InteropServices;

 

class CSTest {

             [DllImport("User32.dll")]

             public static extern int MessageBox(int hParent, string Message, string Caption, int Type);

 

             [DllImport("Kernel32.dll")]

             public static extern uint WinExec(string Path, uint nCmdShow);

 

             static void Main() {

                           MessageBox(0, "¸Þ¸ðÀåÀ» ½ÇÇàÇÕ´Ï´Ù.", "¾Ë¸²", 0);

                           WinExec("notepad.exe", 1);

             }

}

 

¸Þ½ÃÁö ¹Ú½º¸¦ ¿­°í ¸Þ¸ðÀåÀ» ½ÇÇàÇÏ·Á¸é MessageBox¿Í WinExec API ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. MessageBox´Â User32.dll¿¡ ÀÇÇØ Á¦°øµÇ¸ç WinExec´Â Kernel32.dll¿¡ ÀÇÇØ Á¦°øµÈ´Ù. µÑ ´Ù ´å³Ý ¿ÜºÎÀÇ DLL¿¡ Á¤ÀǵǾî ÀÖ¾î extern ÁöÁ¤ÀÚ¸¦ ºÙ¿©¾ß Çϸç Ŭ·¡½ºÀÇ ¸â¹ö°¡ ¾Æ´Ï¹Ç·Î staticÀ̾î¾ß ÇÑ´Ù.

ÀμöÀÇ Å¸ÀÔÀº C# ½ºÅ¸ÀÏ·Î Àû´çÈ÷ Á¶Á¤ÇÑ´Ù. ¹®ÀÚ¿­ Æ÷ÀÎÅÍ´Â string ŸÀÔÀ¸·Î Ç¥ÇöÇÒ ¼ö ÀÖÀ¸¸ç unsigned´Â uint·Î ¹Ù²Û´Ù. MB_OK³ª SW_SHOWNORMAL °°Àº ¸ÅÅ©·Î »ó¼ö´Â °ªÀ» Á÷Á¢ Á¶»çÇÏ¿© Á¤¼ö »ó¼ö¸¦ ¾²´Â ¼ö¹Û¿¡ ¾ø´Ù.

µÎ ¾ð¾î¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ´Ü¼ø ŸÀÔÀ» »ç¿ëÇÏ´Â ÇÔ¼ö´Â ¾î´À Á¤µµ º¯È¯ °¡´ÉÇÏÁö¸¸ ±¸Á¶Ã¼¸¦ Àμö·Î ¹Þ´Â ÇÔ¼ö´Â È£ÃâÇϱ⠽±Áö ¾Ê´Ù. ±¸Á¶Ã¼¾È¿¡ Æ÷ÀÎÅͳª ¶Ç ´Ù¸¥ ±¸Á¶Ã¼°¡ ÀÖÀ¸¸é °ñÄ¡ ¾ÆÇÁ´Ù. ´å³ÝÀº »óÈ£ ¿î¿ë¼ºÀ» À§ÇØ ¿ÜºÎ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀº Çã¿ëÇÏÁö¸¸ ±× ±â¼úÀº °áÄÚ °£´ÜÇÏÁö ¾Ê´Ù.

¿µ¾îÀÇ Property¿Í Attribute¸¦ ¹ø¿ªÇÏ¸é µÑ ´Ù ¼Ó¼ºÀ̾ µÎ °³³äÀÌ ¼­·Î ±¸ºÐµÇÁö ¾Ê´Â´Ù. ±×·¡¼­ ¿µ¹® ¹ßÀ½´ë·Î Ç¥±âÇϴµ¥ ¿µ¾î·Î Çصµ °°Àº °³³äÀ» ĪÇϱâ´Â ¸¶Âù°¡ÁöÀÌ´Ù. °ø½Ä ¹®¼­¿¡¼­´Â ÇÁ·ÎÆÛƼ¸¦ ¼Ó¼ºÀ¸·Î, ¾îÆ®¸®ºäÆ®´Â Ư¼ºÀ¸·Î ¹ø¿ªÇϴµ¥ »ç½Ç ±×°Ô ±×°Å´Ù. ¿ë¾îÀÇ ¿ø¹®µµ Àß ¾Ë¾ÆµÑ ÇÊ¿ä°¡ ÀÖ´Ù.

12-3-2.Ä¿½ºÅÒ ¾îÆ®¸®ºäÆ®

»ç¿ëÀÚ°¡ Á¤ÀÇÇÏ´Â Ä¿½ºÅÒ ¾îÆ®¸®ºäÆ®´Â ÄÄÆÄÀÏ ¹æ½ÄÀ̳ª Äڵ忡´Â ¿µÇâÀ» ÁÖÁö ¾ÊÀ¸¸ç ½ÇÇà ÆÄÀÏ¿¡ ¸ÞŸ µ¥ÀÌÅÍ·Î Æ÷ÇԵȴÙ. ÀÏÁ¾ÀÇ ÁÖ¼®ÀÌµÇ ÀÏÁ¤ÇÑ Çü½ÄÀÌ ÀÖÀ¸¸ç ÇÁ·Î±×·¡¹Ö ¹æ½ÄÀ¸·Î Á¶ÀÛÇÒ ¼ö ÀÖ¾î ÀÚµ¿È­µÈ 󸮰¡ °¡´ÉÇÏ´Ù. ÄÄÆÄÀÏ·¯´Â Çü½ÄÀÌ ¸Â´ÂÁö üũÇÏ¿© ±â·Ï¸¸ ÇØ ³õÀ» »Ó ¾îµð´Ù ½á ¸ÔÀ» °ÍÀÎÁö´Â »ç¿ëÀÚ ¸¶À½´ë·ÎÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¸Þ¼­µå¿Í Çʵ忡 Á¦ÀÛÀÚ¿Í ÀÛ¼º ½Ã±â¸¦ ¾îÆ®¸®ºäÆ®·Î ±â·ÏÇÑ´Ù. ½ÇÇàÇØ ºÁ¾ß º° Ãâ·ÂÀº ¾ø´Ù.

 

CustomAttribute

using System;

 

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Field,

             AllowMultiple = true, Inherited = false)]

class ProgrammerAttribute : Attribute {

             private string Name;

             private string Time;

             public ProgrammerAttribute(string aName) {

                           Name = aName;

                           Time = "±â·Ï¾øÀ½";

             }

             public string When {

                           get { return Time; }

                           set { Time = value; }

             }

}

 

class CSTest {

             [Programmer("Kim")]

             static public int Field1 = 0;

 

             [Programmer("Kim", When = "2019³â 6¿ù 29ÀÏ")]

             static public void Method1() { }

 

             [Programmer("Lee")]

             static public void Method2() { }

 

             [Programmer("Park"), Programmer("Choi")]

             static public void Method3() { }

 

             static void Main() {

             }

}

 

¾îÆ®¸®ºäÆ®µµ Ŭ·¡½ºÀε¥ ProgrammerAttribute¶ó´Â À̸§À¸·Î Á¤ÀÇÇß´Ù. Ä¿½ºÅÒ ¾îÆ®¸®ºäÆ®´Â Attribute Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ¸¸ç ²¿¶ûÁö°¡ ~Attribute·Î ³¡³ª¸é ÁöÁ¤ÇÒ ¶§ Á¢¹Ì¸¦ »ý·«ÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù.

Programmer´Â Á¦ÀÛÀÚ À̸§À» ±â¾ïÇÏ´Â Name Çʵå¿Í ÀÛ¼º ½ÃÁ¡À» ±â·ÏÇÏ´Â Time Çʵ带 ¸â¹ö·Î ¼±¾ðÇÑ´Ù. »ý¼ºÀÚ´Â Á¦ÀÛÀÚ À̸§À» ¹Þ¾Æ Name Çʵ带 ÃʱâÈ­ÇÏ°í TimeÀº "±â·Ï¾øÀ½"À¸·Î ÃʱâÈ­ÇÑ´Ù. TimeÀ» º¯°æÇÒ ¶§´Â When ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ When = "¾ðÁ¦" ½ÄÀ¸·Î ´ëÀÔÇÑ´Ù.

Àû¿ëÇÒ ¶§´Â [ ] °ýÈ£ ¾È¿¡ ¾îÆ®¸®ºäÆ®¸¦ ¸í½ÃÇÏ°í () °ýÈ£ ¾È¿¡ Àμö¸¦ Àü´ÞÇÑ´Ù. Àμö´Â À̸§ ¿©ºÎ¿¡ µû¶ó µÎ °¡Áö Á¾·ù·Î ±¸ºÐµÇ´Âµ¥ ÃʱâÈ­ÇÏ´Â ¹æ¹ýÀÌ ´Ù¸£´Ù. À̸§¾ø´Â Àμö´Â »ý¼ºÀÚ¿¡¼­ ½ÇÀμö°ªÀ» ¹Þ¾Æ ÃʱâÈ­Çϸç À̸§ÀÖ´Â Àμö´Â Çʵ峪 ÇÁ·ÎÆÛƼ·Î Ç¥ÇöÇϹǷΠA = B½ÄÀ¸·Î ´ëÀÔÇÑ´Ù.

NameÀÌ À̸§¾ø´Â ÀμöÀ̸ç WhenÀº À̸§ÀÖ´Â ÀμöÀÌ´Ù. À̸§¾ø´Â Àμö´Â ¹Ýµå½Ã ÁöÁ¤ÇØ¾ß ÇÏÁö¸¸ À̸§ÀÖ´Â Àμö´Â ÇÊ¿äÇÒ ¶§¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. À̸§¾ø´Â Àμö°¡ À̸§ÀÖ´Â Àμöº¸´Ù ¸ÕÀú ¿Í¾ß Çϸç À̸§ÀÖ´Â Àμö³¢¸®ÀÇ ¼ø¼­´Â Áß¿äÇÏÁö ¾Ê´Ù. ´ÙÀ½ µÎ ÁöÁ¤¹®ÀÇ È¿°ú´Â µ¿ÀÏÇÏ´Ù.

 

[SomeAttr("unnamed", A=1, B=2)]

[SomeAttr("unnamed", B=2, A=1)]

 

Àμö¿¡ ´ëÀԵǴ °ª¿¡´Â ¾Æ¹« ŸÀÔÀ̳ª ¾µ ¼ö ¾ø°í ¾à°£ÀÇ Á¦¾àÀÌ ÀÖ´Ù. ±âº»Çü°ú string, object, Type Ŭ·¡½º, ¿­°ÅÇü, ±×¸®°í 1Â÷¿ø ¹è¿­¸¸ °¡´ÉÇÏ´Ù. 2Â÷¿ø ¹è¿­À̳ª Ŭ·¡½º ŸÀÔÀÇ °´Ã¼´Â ¾µ ¼ö ¾ø´Ù. ±×·¡¼­ ½ÃÁ¡À» Ç¥ÇöÇÏ´Â TimeÀÌ DateTime °´Ã¼°¡ ¾Æ´Ï¶ó ´Ü¼øÇÑ stringÀÌ´Ù.

¾îÆ®¸®ºäÆ® ¼±¾ð¹®¿¡ ¶Ç ´Ù¸¥ ¾îÆ®¸®ºäÆ®ÀÎ AttributeUsage·Î ¿©·¯ °¡Áö ¼ºÁúÀ» ÁöÁ¤ÇÑ´Ù. »ý·«ÇÒ ¼ö ÀÖÁö¸¸ ´ë°³ÀÇ °æ¿ì´Â Àû¿ë ´ë»óÀ» ÁöÁ¤Çϱâ À§ÇØ ²À ÇÊ¿äÇÏ´Ù. ¾îÆ®¸®ºäÆ®¸¦ Á¤ÀÇÇϴµ¥ ¾îÆ®¸®ºäÆ®°¡ »ç¿ëµÇ´Â ¼ÀÀÌ´Ù. AttributeUsage·Î ´ÙÀ½ ¼¼ °¡Áö ¼ºÁúÀ» ÁöÁ¤ÇÑ´Ù.

 

l ValidOn : À̸§¾ø´Â ÀμöÀ̸ç Àû¿ë °¡´ÉÇÑ ¿ä¼Ò¸¦ ÁöÁ¤ÇÑ´Ù. ÃʱâÈ­ÇÒ ¶§ »ý¼ºÀÚ·Î µü ÇÑ ¹ø¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌÈÄ ValidOn ÇÁ·ÎÆÛƼ·Î ÀÐÀ» ¼ö¸¸ ÀÖ´Ù. AttributeTargets ¿­°ÅÇüÀ¸·Î Àû¿ë ´ë»óÀ» ÁöÁ¤ÇÏ¸ç µÎ °³ ÀÌ»óÀÇ ¿ä¼Ò´Â | ¿¬»êÀÚ·Î ¹­´Â´Ù.

 

¿­°Å°ª

Àû¿ë ´ë»ó

All

¸ðµç ¿ä¼Ò

Assembly

¾î¼Àºí¸®

Class

Ŭ·¡½º

Constructor

»ý¼ºÀÚ

Delegate

µ¨¸®°ÔÀÌÆ®

Enum

¿­°ÅÇü

Event

À̺¥Æ®

Field

Çʵå

GenericPrarameter

Á¦³×¸¯ Àμö

Interface

ÀÎÅÍÆäÀ̽º

Method

¸Þ¼­µå

Module

¸ðµâ. ´Ü ºñÁÖ¾ó º£ÀÌÁ÷ ¸ðµâÀº Á¦¿Ü

Parameter

Çü½Ä Àμö

Property

ÇÁ·ÎÆÛƼ

ReturnValue

¸®ÅÏ°ª

Struct

±¸Á¶Ã¼

 

l AllowMultiple : À̸§ÀÖ´Â ÀμöÀ̸ç ÇÊ¿äÇÒ ¶§¸¸ ÁöÁ¤ÇÑ´Ù. ÇÑ ´ë»ó¿¡ ¿©·¯ ¹ø Àû¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ ÁöÁ¤Çϴµ¥ µðÆúÆ®´Â false¿©¼­ µü ÇÑ ¹ø¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. µ¿ÀÏÇÑ ¾îÆ®¸®ºäÆ®¸¦ ¿©·¯ ¹ø ÁöÁ¤ÇÏ´Â °ÍÀÌ Àǹ̰¡ ÀÖ´Ù¸é ÀÌ Àμö¸¦ true·Î º¯°æÇÑ´Ù.

l Inherited : À̸§ÀÖ´Â ÀμöÀ̸ç ÇÊ¿äÇÒ ¶§¸¸ ÁöÁ¤ÇÑ´Ù. ÆÄ»ý Ŭ·¡½º³ª ÀçÁ¤ÀǵǴ ¸Þ¼­µå¿¡µµ Àû¿ëÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤Çϴµ¥ µðÆúÆ®´Â trueÀÌ´Ù. Ŭ·¡½º¿¡ ÀÌ ¾îÆ®¸®ºäÆ®¸¦ ÁöÁ¤Çϸé ÆÄ»ý Ŭ·¡½º¿¡µµ Àû¿ëµÈ´Ù.

 

Programmer ¾îÆ®¸®ºäÆ®´Â ¸Þ¼­µå¿Í Çʵ忡 ´ëÇØ Àû¿ëÇϵµ·Ï ÃʱâÈ­Çß´Ù. µû¶ó¼­ ÀÌ ¾îÆ®¸®ºäÆ®¸¦ Ŭ·¡½º³ª ÇÁ·ÎÆÛƼ¿¡ Àû¿ëÇÏ¸é ¿¡·¯ 󸮵ȴÙ. ÇÑ ¸Þ¼­µå¸¦ ¿©·¯ ¸íÀÇ °³¹ßÀÚ°¡ °°ÀÌ ¸¸µé ¼öµµ ÀÖ¾î AllowMultipleÀº true·Î ÁöÁ¤ÇÏ¿© ¿©·¯ ¹ø Àû¿ëÇÒ ¼ö ÀÖµµ·Ï Çß´Ù. Inherited´Â false·Î ÁöÁ¤ÇÏ¿© »ó¼ÓÀº ÇÏÁö ¾Ê¾Ò´Ù.

CSTest¿¡¼­ °¢ ¿ä¼Ò¿¡ ´ëÇØ Programmer ¾îÆ®¸®ºäÆ®¸¦ ºÙ¿© ´©°¡ ¾ðÁ¦ ¸¸µç °ÍÀÎÁö ±â·ÏÇØ µÎ¾ú´Ù. Field1Àº KimÀÌ ¸¸µé¾úÀ¸¸ç Method1Àº KimÀÌ 2019³â 6¿ù 29ÀÏ ¸¸µé¾ú´Ù. Method2´Â Lee°¡ ¸¸µé¾ú°í Method3´Â Park, Choi°¡ °°ÀÌ ¸¸µé¾úÀ½À» ¾îÆ®¸®ºäÆ®·Î ±â·ÏÇØ µÎ¾ú´Ù. Áߺ¹ ÁöÁ¤ÇÒ ¶§ ¼ø¼­´Â ¹«°üÇÏ¸ç ½°Ç¥·Î ²÷¾î ÁöÁ¤ÇÒ ¼öµµ ÀÖ°í [ ] °ýÈ£¸¦ µû·Î ¾µ ¼öµµ ÀÖ´Ù. ´ÙÀ½ ÁöÁ¤¹®ÀÇ È¿°ú´Â ¸ðµÎ µ¿ÀÏÇÏ´Ù.

 

[Programmer("Park"), Programmer("Choi")]

[Programmer("Choi"), Programmer("Park")]

[Programmer("Park")] [Programmer("Choi")]

 

¾îÆ®¸®ºäÆ®°¡ Àû¿ëµÇ´Â ´ë»óÀº ¹Ù·Î ´ÙÀ½¿¡ ÀÖ´Â ¿ä¼ÒÀ̸ç À§Ä¡ÀûÀ¸·Î °áÁ¤µÈ´Ù. ±×·¯³ª ÀÌ·¸°Ô ÇÏ¸é ´Ù¼Ò ¾Ö¸ÅÇÑ °æ¿ìµµ Àִµ¥ À̶§´Â ¾îÆ®¸®ºäÆ® ÁöÁ¤¹®¿¡ Àû¿ë ´ë»óÀ» ºÐ¸íÈ÷ ¹àÇô¾ß ÇÑ´Ù. ´ÙÀ½ ÁöÁ¤¹®À» º¸ÀÚ.

 

[Some]

public static int Method1(string s) { return 0; }

 

Some ¾îÆ®¸®ºäÆ®¸¦ Method1¿¡ Àû¿ëÇß´Ù. ±×·±µ¥ ¸¸¾à ¸Þ¼­µå Àüü°¡ ¾Æ´Ñ ¸®ÅÏ Å¸ÀÔ¿¡¸¸ Àû¿ëÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÁöÁ¤¹®¾Õ¿¡ return:À» ºÙÀδÙ. ÀÌ·± ½ÄÀ¸·Î assembly:, module:, type:, method:, param: µîÀÇ Àû¿ë ´ë»ó ÁöÁ¤¹®ÀÌ ÀÖ´Â ¾îÆ®¸®ºäÆ®´Â ÁöÁ¤ÇÑ ¿ä¼Ò¿¡¸¸ Àû¿ëµÈ´Ù.

 

[return:Some]

public static int Method2(string s) { return 0; }

 

Ä¿½ºÅÒ ¾îÆ®¸®ºäÆ®´Â Äڵ忡´Â ¾Æ¹«·± ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù. ±×·¯³ª ½ÇÇà ÆÄÀÏ¿¡ ¸ÞŸ µ¥ÀÌÅÍ·Î Æ÷ÇԵǹǷΠ¸®Ç÷º¼ÇÀ¸·Î ÀÌ Á¤º¸¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î À§ ¿¹Á¦ÀÇ °æ¿ì ¾î¶² ¸Þ¼­µå¿¡¼­ ¹ö±×°¡ ¹ß»ýÇß´Ù¸é ´©°¡ ¾ðÁ¦ Ãß°¡ÇÑ ¸Þ¼­µåÀÎÁö ¾Ë¾Æ³¾ ¼ö ÀÖÀ¸¸ç ÇÁ·ÎÁ§Æ® °ü¸®¸¦ º°µµÀÇ ÇÁ·Î±×·¥À¸·Î ¸¸µé¾î ÀÚµ¿È­ÇÒ ¼ö ÀÖ´Ù.

°³¹ß¸¸Å­À̳ª ÇÁ·ÎÁ§Æ® °ü¸®µµ Áß¿äÇÏ´Ù. ¾îÆ®¸®ºäÆ®¸¦ Àß È°¿ëÇϸé ÇÁ·ÎÁ§Æ® °ü¸®¿¡ ÇÊ¿äÇÑ ¸ðµç Á¤º¸¸¦ ÇÁ·ÎÁ§Æ® ÀÚü¿¡ ³»ÀåÇÒ ¼ö ÀÖ´Ù. ÀÛ¼ºÀÚ¿Í ½ÃÁ¡ ¿Ü¿¡µµ ¼öÁ¤ »çÇ×, ¿ì¼±¼øÀ§, ¹ö±× ¸ñ·Ï, ¸Þ¸ð µîÀ» ±â·ÏÇØ ³õÀ¸¸é ¿©·¯ °¡Áö ¿ëµµ·Î È°¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÇÁ·ÎÁ§Æ® °ü¸® ¾÷¹«°¡ ÀÚµ¿È­µÈ´Ù.

12-3-3.Àü󸮹®

Àü󸮹®Àº C¿¡¼­ ºô·Á¿Â ¹®¹ýÀ̸ç ÄÄÆÄÀÏ°ú ¼Ò½º °ü¸® ¹æ½Ä¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. CÀÇ Àüó¸®(Preprocessing)´Â ¸í·É¿¡ µû¶ó ¼Ò½º¸¦ À籸¼ºÇÏ´Â °úÁ¤À» ÀǹÌÇϴµ¥ C#¿¡¼­´Â ½ÇÁ¦·Î Àüó¸® °úÁ¤ÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸ç ÄÄÆÄÀÏ·¯°¡ ó¸®ÇÑ´Ù.

C#ÀÇ Àüó¸® ¸í·ÉÀº Á¾·ù¿Í Çü½ÄÀÌ C¿Í °ÅÀÇ ºñ½ÁÇÏ°í µ¿ÀÛÀ̳ª ¿ëµµµµ °°´Ù. ´Ü, #include´Â ¾ø´Âµ¥ C#Àº ¼±¾ð ¼ø¼­°¡ ÀÇ¹Ì ¾ø°í Çì´õ ÆÄÀÏÀÇ °³³äÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. C#ÀÇ Àüó¸® ¸í·ÉÀ» °£´ÜÇÏ°Ô Á¤¸®ÇØ º¸ÀÚ.

 

¡á #define, #undef

½Éº¼À» Á¤ÀÇÇϰųª Ãë¼ÒÇÑ´Ù. #define SYMBOL ½ÄÀ¸·Î »ç¿ëÇϸç Á¸À縦 Á¤ÀÇÇÒ »Ó °ªÀ» ´ëÀÔÇÏÁö´Â ¾Ê´Â´Ù. ÀÌ ½Éº¼Àº Á¶°ÇºÎ ÄÄÆÄÀÏ Áö½ÃÀÚ¿Í ÇÔ²² »ç¿ëÇÑ´Ù. ¹Ýµå½Ã ¼Ò½ºÀÇ ¼±µÎ¿¡ Àû¾î¾ß ÇÏ¸ç ½ÉÁö¾î using ¼±¾ðº¸´Ù ´õ ¾Õ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ÇÁ·ÎÁ§Æ® ¼Ó¼ºÃ¢¿¡¼­µµ ½Éº¼À» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

¡á #if, #else, #elif, #endif

Á¶°ÇºÎ ÄÄÆÄÀÏ Áö½ÃÁöÀÌ´Ù. ½Éº¼ÀÇ Á¸Àç ¿©ºÎ¿¡ µû¶ó ƯÁ¤ ºÎºÐÀ» ÄÄÆÄÀÏÇϰųª Á¦¿ÜÇÑ´Ù. ´ë»ó Äڵ带 #if¿Í #endif·Î °¨½Î¸é ÀÌ ºÎºÐÀÌ Á¶°ÇºÎ ÄÄÆÄÀϵȴÙ. ½Éº¼ÀÌ ¾ø´Â °æ¿ì¸¦ ó¸®ÇÏ°í ½Í´Ù¸é Áß°£¿¡ #else¸¦ ¾µ ¼öµµ ÀÖ°í ¶Ç ´Ù¸¥ Á¶°ÇÀ» ÁöÁ¤ÇÏ°í ½Í´Ù¸é #elif¸¦ ¾µ ¼öµµ ÀÖ´Ù.

 

ÀÌ µÎ Àü󸮹®À» »ç¿ëÇϸé Á¶°ÇºÎ ÄÄÆÄÀÏÀ» ÇÒ ¼ö ÀÖ´Ù. ¾Õ¿¡¼­ Conditional ¾îÆ®¸®ºäÆ®·Î ¸¸µé¾ú´ø ¿¹Á¦¸¦ Àü󸮹®À¸·Î ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ.

 

ifendif

#define TRIAL

using System;

 

class CSTest {

#if TRIAL

             static void TrialMessage() {

                           Console.WriteLine("ÀÌ Á¦Ç°Àº 30ÀÏ°£¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.");

                           Console.WriteLine("Á¤Ç°À» ±¸ÀÔÇϽ÷Á¸é ¾î¼°í Àú¼°í.\n");

             }

#endif

             static void Main() {

#if TRIAL

                           TrialMessage();

#endif

                           Console.WriteLine("°ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù.");

             }

}

 

TRIAL ½Éº¼ÀÇ Á¸Àç ¿©ºÎ¿¡ µû¶ó TrialMessage ¸Þ¼­µå Á¤Àǹ®°ú È£Ãâ¹®À» Á¶°ÇºÎ·Î ÄÄÆÄÀÏÇß´Ù. Àü󸮹®Àº µé¿©¾²±â¸¦ ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¼Ò½º ¸ð¾çÀÌ ³­ÀâÇϸç È£Ãâ¹®±îÁö ÀÏÀÏÀÌ #if ~ #endif·Î °¨½Î¾ß ÇÑ´Ù. ±×·¡¼­ C#Àº ´õ Æí¸®ÇÑ Conditional ¾îÆ®¸®ºäÆ®¸¦ Á¦°øÇÑ´Ù.

±×·¯³ª ÀÌ ¹æ½ÄÀÌ ºÒÆíÇØ º¸¿©µµ ¾ÆÁ÷±îÁö ¾µ µ¥°¡ ¸¹À¸¸ç ¾îÆ®¸®ºäÆ®º¸´Ù À¶Å뼺ÀÌ ³ô´Ù. ¿ö³« ´Ü¼øÇÑ ¹æ½ÄÀ¸·Î µ¿ÀÛÇϱ⠶§¹®¿¡ ¸Þ¼­µå »Ó¸¸ ¾Æ´Ï¶ó °³º° Äڵ带 Á¶°ÇºÎ ó¸®ÇÒ ¼ö ÀÖ°í Ŭ·¡½º³ª Çʵ忡 ´ëÇؼ­µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ ¸Þ¼­µå ³»ÀÇ ÀϺΠÄڵ忡 ´ëÇÑ Á¶°ÇºÎ ÄÄÆÄÀÏÀº ¾îÆ®¸®ºäÆ®·Î´Â ÇÒ ¼ö ¾ø´Ù.

 

static void TrialMessage() {

         #if TRIAL

         Console.WriteLine("ÀÌ Á¦Ç°Àº 30ÀÏ°£¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.");

         Console.WriteLine("Á¤Ç°À» ±¸ÀÔÇϽ÷Á¸é ¾î¼°í Àú¼°í.\n");

         #endif

}

 

¶ÇÇÑ &&, || °°Àº ³í¸® ¿¬»êÀÚ¸¦ ¾µ ¼ö ÀÖ¾î µÎ °³ÀÇ Á¶°ÇÀ» Á¡°ËÇϱ⠽±´Ù. Conditional ¾îÆ®¸®ºäÆ®´Â ¿©·¯ °¡Áö Á¶°ÇÀ» Àû¿ëÇϱ⠺ÒÆíÇÏ¸ç °Ô´Ù°¡ #else¿¡ ÇØ´çÇÏ´Â ±â´ÉÀÌ ¾ø¾î ¼±ÅÃÀûÀ¸·Î Äڵ带 ÄÄÆÄÀÏÇÒ ¼ö ¾ø´Ù. ¶§·Î´Â ³í¸®ÀûÀ¸·Î µ¿ÀÛÇÏ´Â ½ÅÇüº¸´Ù ±â°èÀûÀ¸·Î µ¿ÀÛÇÏ´Â ±¸ÇüÀÌ ´õ Æí¸®ÇÑ °æ¿ìµµ ÀÖ´Ù.

 

¡á #warning, #error

µÚÂÊÀÇ ¹®ÀÚ¿­À» °æ°í³ª ¿¡·¯·Î Ãâ·ÂÇÑ´Ù. °æ°í´Â Ãâ·Ââ¿¡ ¸Þ½ÃÁö¸¸ Ãâ·ÂÇÏ°í ÄÄÆÄÀÏÀº °è¼Ó µÇÁö¸¸ ¿¡·¯´Â ¸Þ½ÃÁö Ãâ·Â ÈÄ ÄÄÆÄÀÏÀ» Áï½Ã ÁßÁöÇÑ´Ù. ƯÁ¤ÇÑ Á¶°ÇÀÌ µÇÁö ¾ÊÀ» ¶§ À̸¦ °³¹ßÀÚ¿¡°Ô ¾Ë¸®°Å³ª Á¶°ÇÀÌ ¸¸Á·µÉ ¶§±îÁö ÄÄÆÄÀÏÀ» °ÅºÎÇÒ ¶§ ÀÌ Àü󸮹®À» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î ¶óÀ̺귯¸® ¹öÀüÀÌ ³Ê¹« ³·´Ù°Å³ª ¹®ÀÚ ÀÎÄÚµù ¹æ½ÄÀÌ ¸ÂÁö ¾ÊÀ» ¶§ ÄÄÆÄÀÏÇØ ºÁ¾ß µ¿ÀÛÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ºÐ¸íÈ÷ ¾Ë¸± ÇÊ¿ä°¡ ÀÖ´Ù.

¡á #region, #endregion

ÄÚµåÀÇ ºí·Ï¿¡ À̸§À» ÁÖ°í ÇϳªÀÇ ´ÜÀ§·Î Ç¥½ÃÇÑ´Ù. ÄÄÆÄÀÏ°ú´Â »ó°üÀÌ ¾øÀ¸¸ç ÆíÁý±â°¡ ÀÌ ºÎºÐÀ» Àá½Ã °¨Ãâ¼ö ÀÖµµ·Ï ¿µ¿ª ÁöÁ¤¸¸ ÇØ ³õ´Â´Ù. ÀÚÁÖ ÆíÁýÇÏÁö ¾Ê´Â Äڵ带 ÀÌ ¿µ¿ªÀ¸·Î °¨½Î ³õÀ¸¸é Ãà¼ÒÇØ ³õÀ» ¼ö ÀÖ´Ù. ´ÙÀ½ ±×¸²Àº ¾Õ¿¡¼­ ¸¸µé¾ú´ø DllImport ¿¹Á¦ÀÇ ¿ÜºÎ DLL Á¤Àǹ®À» ¿µ¿ªÀ¸·Î °¨½Î ³õÀº °ÍÀÌ´Ù.

 

¿ÜºÎ DLL Á¤Àǹ®Àº ÇÑ ¹ø¸¸ ¼±¾ðÇÏ¸é ´õ ÀÌ»ó ¼Õ µ¨ ÇÊ¿ä°¡ ¾ø´Ù. °Ô´Ù°¡ ¼±¾ð¹®ÀÌ ¿ö³« º¹ÀâÇØ º¸±â¸¸ Çصµ Á¤½Å »ç³ª¿îµ¥ ¿µ¿ªÀ¸·Î ÁöÁ¤ÇØ ³õÀ¸¸é Àüü°¡ ÇϳªÀÇ ´ÜÀ§°¡ µÇ¸ç ¿·¿¡ - ¹öÆ°ÀÌ ³ªÅ¸³­´Ù. ÀÌ ¹öÆ°À» ´©¸£¸é ¿µ¿ªÀÌ Ãà¼ÒµÇ¾î ½Ã¿ø½º·¯¿ì¸ç ´«¿¡ °Å½½¸®Áö ¾Ê´Â´Ù.

Ãà¼ÒµÈ ¿µ¿ªÀº È帰 »öÀ¸·Î ¸®ÀüÀÇ À̸§¸¸ º¸À̴µ¥ ÆîÃÄ º¸°í ½ÍÀ» ¶§ ¾ðÁ¦µçÁö + ¹öÆ°À» ´©¸£¸é µÈ´Ù. ÀÌ Àü󸮹®Àº »ç¿ëÀÚ°¡ Á÷Á¢ ¾µ ¼öµµ ÀÖÁö¸¸ ÄÄÆÄÀÏ·¯°¡ ¼Ò½º °ü¸® Â÷¿ø¿¡¼­ ´õ ¸¹ÀÌ »ç¿ëÇÑ´Ù. º¸Åë »ç¿ëÀÚ°¡ Á÷Á¢ ÀÛ¼ºÇÏÁö ¾Ê´Â Äڵ带 ÀÌ·± ¿µ¿ª¿¡ ¹èÄ¡ÇÏ¿© ½Å°æ¾²Áö ¾Ê¾Æµµ µÇ°Ô²û ÇÑ´Ù.

¡á #line

ÆÄÀÏ À̸§°ú ÁÙ ¹øÈ£¸¦ º¯°æÇÑ´Ù. ÀÌ ¹øÈ£´Â °æ°í³ª ¿¡·¯¸¦ Ãâ·ÂÇÒ ¶§ À§Ä¡¸¦ °¡¸®Å²´Ù. ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î´Â »ç¿ëÇÏÁö ¾ÊÀ¸¸ç µð°Å±ëÀ̳ª ·Î±×¸¦ ³²±æ ¶§ °¡²û »ç¿ëÇÑ´Ù. #line default´Â ¿ø·¡ ÁÙ ¹øÈ£·Î µ¹¾Æ°£´Ù.

12-3-4.È£ÃâÀÚ Á¤º¸

¸Þ¼­µå´Â ¿©·¯ °÷¿¡¼­ ¹Ýº¹ÀûÀ¸·Î È£ÃâÇÑ´Ù. Á¤»óÀûÀÎ Àμö°¡ Àü´ÞµÇ¸é Àß µ¿ÀÛÇÏÁö¸¸ À߸øµÈ Àμö¸¦ ¹ÞÀ¸¸é ¿Àµ¿ÀÛÇÑ´Ù. ´ÙÀ½ ¸Å¼­µå´Â ¿ùº° ¸ÅÃâÀ» Ãâ·ÂÇϴµ¥ À¯È¿ÇÑ °ªÀº 1 ~ 12±îÁöÀ̸ç 15³ª -8À» Àü´ÞÇϸé Á¤»óÀûÀ¸·Î µ¿ÀÛÇÒ ¼ö ¾ø´Ù.

 

static void OutMonthSales(int month) {

         Console.WriteLine($"{month}¿ù ¸ÅÃâ º¸°í¸¦ Ãâ·ÂÇÕ´Ï´Ù.");

}

 

Àμö°¡ À߸øµÇ¾úÀ» ¶§ ´©°¡ ³ª¿¡°Ô ÀÌ·± ¾û¶×ÇÑ Á¤º¸¸¦ Àü´ÞÇß´ÂÁö Á¶»çÇÏ¿© ¸Þ½ÃÁö³ª ·Î±×¿¡ ±â·ÏÇÏ°í ½Í´Ù°í ÇÏÀÚ. C´Â ÀÌ·± ¿ëµµ·Î __FILE__, __LINE__ ¸ÅÅ©·Î »ó¼ö¸¦ Á¦°øÇϸç Á» ±¸´Ú´Ù¸® °°¾Æ º¸¿©µµ µð¹ö±× ·Î±× ÀÛ¼º¿¡´Â ±²ÀåÈ÷ À¯¿ëÇÏ´Ù. ÇÏÁö¸¸ C#¿¡´Â ´ëÀÀµÇ´Â ±â´ÉÀÌ ¾ø¾î ¾Æ½¬¿ü´Ù.

C# 5.0¿¡¼­ ¶È°°Àº ¿ëµµ·Î ¾µ ¼ö ÀÖ´Â ¾ÖÆ®¸®ºäÆ®¸¦ Ãß°¡Çß´Ù. È£ÃâÀÚ Á¤º¸¸¦ Á¶»çÇÏ°í ½ÍÀº ¸Þ¼­µå´Â ´ÙÀ½ ¼¼ °³ÀÇ Àμö¸¦ ¹Þ°í ¾ÖÆ®¸®ºäÆ®¸¦ ºÙÀδÙ. ´Ù ¹ÞÀ» ÇÊ¿ä´Â ¾ø°í °ü½ÉÀÖ´Â Á¤º¸¸¸ ¹Þ¾Æµµ µÈ´Ù. ¿ø·¡ÀÇ ¸Þ¼­µå¿Í ȣȯÀ» À¯ÁöÇϱâ À§ÇØ ¼±ÅÃÀû Àμö·Î ¹Þ¾Æ¾ß ÇÑ´Ù.

 

Caller

using System;

using System.Runtime.CompilerServices;

 

class CSTest {

             public static void Main() {

                           OutMonthSales(3);

                           YearReport();

             }

 

             static void YearReport() {

                           OutMonthSales(15);

             }

 

             static void OutMonthSales(int month,

                           [CallerMemberName] string Caller = "",

                           [CallerFilePath] string Path = "",

                           [CallerLineNumber] int Line = 0

                           ) {

                           if (month >= 1 && month <= 12) {

                                        Console.WriteLine($"{month}¿ù ¸ÅÃâ º¸°í¸¦ Ãâ·ÂÇÕ´Ï´Ù.");

                           } else {

                                        Console.WriteLine("À߸øµÈ ¿äûÀÔ´Ï´Ù.");

                                        Console.WriteLine($"{Path}ÀÇ {Caller}¸Þ¼­µå{Line}ÁÙÀ» Á¡°ËÇϽʽÿÀ.");

                           }

             }

}

½ÇÇà°á°ú

3¿ù ¸ÅÃâ º¸°í¸¦ Ãâ·ÂÇÕ´Ï´Ù.

À߸øµÈ ¿äûÀÔ´Ï´Ù.

C:\DotNetStudy\CSTest\CSTest\Program.csÀÇ YearReport¸Þ¼­µå11ÁÙÀ» Á¡°ËÇϽʽÿÀ.

 

ÄÄÆÄÀÏ·¯´Â OutMonthSales¸¦ È£ÃâÇÒ ¶§¸¶´Ù ¼¼ Àμö¿¡ È£ÃâÀÚ °ü·Ã Á¤º¸¸¦ Àü´ÞÇÑ´Ù. ´©°¡ ¾îµðÂë¿¡¼­ ³ª¸¦ È£ÃâÇß´ÂÁö ¸Þ¼­µå ³»ºÎ¿¡¼­ Á¤È®È÷ ¾Ë ¼ö ÀÖ´Ù. ²À µð¹ö±ë ¸ñÀûÀÌ ¾Æ´Ï´õ¶óµµ ¿©·¯ °¡Áö ¿ëµµ·Î È°¿ëÇÒ ¼ö ÀÖ´Ù.