Áö¿ªº¯¼ö¿Í ¸â¹öÇʵåÀÇ À̸§ÀÌ °°´Ù°í ÇÑ´Ù¸é Áö¿ªº¯¼ö¿¡ ¿ì¼±ÇÒ±î¿ä? ¸â¹öÇʵ忡 ¿ì¼±ÇÒ ±î¿ä. ´ÙÀ½ÀÇ ¿¹Á¦¸¦ º¸½Ã¸é Áö¿ªº¯¼ö°¡ ƯÁ¤ ºí·Ï ³»¿¡¼ ¼±¾ðµÇ¾îÁö¸é »óÀ§ÀÇ ¸â¹öÇʵ尡 À̸§ÀÌ °°´Ù°í ÇÏ´õ¶óµµ Áö¿ªº¯¼ö¿¡ ¿ì¼±ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±¸ºÐÀÇ ¾Ö¸ÅÇÔÀ» À§Çؼ this¶ó´Â Ű¿öµåµé »ç¿ëÇÕ´Ï´Ù. this Ű¿öµåÀÇ º¸´Ù »ó¼¼ÇÑ ¼³¸íÀº ÀÌÀåÀÇ ÈĹݺο¡¼ ¼³¸íÇϵµ·Ï ÇϰڽÀ´Ï´Ù. Áö¿ªº¯¼ö¿Í ¸â¹öÇʵå»çÀÌÀÇ °ü°è¸¦ ¼³¸íÇØ ÁÙ ¼ö ÀÖ´Â ¿¹Á¦¸¦ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
|
& |
ValueHide.cs |
Ü ¸â¹öº¯¼ö¿Í Áö¿ªº¯¼öÀÇ ±¸ºÐ |
|
using System; class ValueHide{ private int i = 0; void MethodA() { int i = 1000; Console.WriteLine("MethodA() i="+ i);//Áö¿ªº¯¼ö i -- ¸â¹öÇÊµå ¹«½ÃÇϱâ } void MethodB() { i = 2000; Console.WriteLine("MethodB() i="+ i);//¸â¹öÀÇ i } public static void ValueHide v = new ValueHide(); v.MethodA(); v.MethodB(); } } | ||
|
C:\C#Example\04>csc ValueHide.cs C:\C#Example\04>ValueHide MethodA() i=1000 MethodB() i=2000 | ||
MethodA() ¸Þ¼µå ³»ºÎ¿¡ i¸¦ Áö¿ªº¯¼ö·Î ¼±¾ð Ç߱⠶§¹®¿¡ ÀÌ ¸Þ¼µå ³»¿¡¼´Â Áö¿ªº¯¼ö·Î¼ÀÇ i°¡ ¿ì¼±ÇÏ°Ô µË´Ï´Ù. ¸¸¾à MethodA() ¸Þ¼µåÀÇ ºí·ÏÀ» ¹þ¾î³ª°Ô µÇ¸é ¸â¹öÇʵå·Î½áÀÇ i°¡ ¿ì¼±ÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. À̰ÍÀ» º¯¼ö¹«½ÃÇϱâ(Variable Hiding)¶ó ºÎ¸¦ ¼ö ÀÖ½À´Ï´Ù. ÀÌ¿Í °°Àº Çö»óÀº ¸Þ¼µå¿¡¼µµ ÀϾ´Ï´Ù. ¸¸¾à »óÀ§Å¬·¡½º¿Í ÇÏÀ§Å¬·¡½º¿¡¼ µ¿½Ã¿¡ ¿Ïº®ÇÏ°Ô °°Àº À̸§ÀÇ ¸Þ¼µå°¡ Á¸ÀçÇÑ´Ù¸é ¾î¶»°Ô µÉ±î¿ä? ´ÙÀ½ÀÇ ¿¹Á¦¸¦ Çѹø »ìÆìº¸½Ã±â ¹Ù¶ø´Ï´Ù.
|
& |
MethodHide.cs |
Ü »ó¼Ó¿¡¼ ¸Þ¼µå ¹«½ÃÇϱâ |
|
using System; class Base{ public void MethodA() { Console.WriteLine("Base Method()"); } } class MethodHide: Base{ public void MethodA() { Console.WriteLine("MethodHide Method()");// Warning, hiding an inherited name } public static void MethodHide m = new MethodHide(); m.MethodA(); } } | ||
|
C:\C#Example\04>csc MethodHide.cs MethodHide.cs(8,14): warning CS0108: 'MethodHide.MethodA()'Àº(´Â) »ó¼ÓµÈ 'Base.MethodA()' ¸â¹ö¸¦ ¼û±â¹Ç·Î new Ű¿öµå°¡ ÇÊ¿äÇÕ´Ï´Ù. MethodHide.cs(3,14): (ÀÌÀü °æ°í¿Í °ü·ÃµÈ ±âÈ£ À§Ä¡) | ||
À§ÀÇ ¿¹Á¦¿¡¼´Â Base Ŭ·¡½º¿¡µµ MethodA() ¸Þ¼µå°¡ Á¸ÀçÇϰí Base¸¦ »ó¼Ó¹ÞÀº MethodHide Ŭ·¡½º¿¡µµ MethodA() ¸Þ¼µå°¡ Á¸ÀçÇÕ´Ï´Ù. À§ÀÇ ÇÁ·Î±×·¥Àº ÄÄÆÄÀÏÁ¶Â÷ ¸øÇϰí ÀÖ½À´Ï´Ù. Áï, »óÀ§ÀÇ Å¬·¡½º¿¡ Á¸ÀçÇÏ´Â ¸Þ¼µå¸¦ ÇÏÀ§ÀÇ Å¬·¡½º°¡ ´Ù½Ã ¸¸µç´Ù´Â °ÍÀº ¾î¶°ÇÑ Çã¶ôÀÌ ÇÊ¿äÇÏ°Ô µË´Ï´Ù. Áï, È®½ÇÇÏ°Ô »óÀ§Å¬·¡½ºÀÇ ¸Þ¼µå¸¦ ¹«½Ã(Hiding)Çϰڴٴ ¼±¾ðÀÌ ÇÊ¿äÇÑ °ÍÀÔ´Ï´Ù. À̶§ »ç¿ëÇϴ Ű¿öµå°¡ new Ű¿öµåÀÔ´Ï´Ù.
¸¸¾à À§ÀÇ ¿¹¿¡¼ MethodHide Ŭ·¡½ºÀÇ MethodA() ¸Þ¼µåÀÇ ÀÌ ºÎºÐÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù¸é ÀÌ ÇÁ·Î±×·¥Àº ÈǸ¢È÷ ¼öÇàµË´Ï´Ù.
|
new Ű¿öµå·Î ¸Þ¼µå ¹«½ÃÇϱâ |
|
n new public void MethodA() { n Console.WriteLine("MethodHide Method()"); n } |
|
C:\C#Example\04>csc MethodHide.cs C:\C#Example\04>MethodHide MethodHide Method() |
new Ű¿öµé »ç¿ëÇÏ¿© ¿Ïº®ÇÏ°Ô »óÀ§Å¬·¡½º¿¡ Á¸ÀçÇÏ´Â ¶È°°Àº ¸Þ¼µå¸¦ ¹«½ÃÇϰڴٴ °ÍÀÔ´Ï´Ù. new Ű¿öµå¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ¹«½ÃÇϱâ´Â ºÒ°¡´ÉÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±â¹ýÀ» C#¿¡¼´Â HidingÀ̶ó´Â ¿ë¾î¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ Ã¥¿¡¼´Â ¹«½ÃÇϱâ¶ó°í ºÎ¸£°í ÀÖ½À´Ï´Ù.
¹«½ÃÇϱ⿡¼µµ private°ú publicÀº ÁöÄÑÁý´Ï´Ù. ¸¸¾à new Ű¿öµå¸¦ ÀÌ¿ëÇÏ¿© »óÀ§ÀÇ ¸Þ¼µå¸¦ ¹«½ÃÇÏ¿´Áö¸¸ privateÀ¸·Î ¹«½ÃÇÑ´Ù¸é ¾î¶»°Ô µÉ±î¿ä. ´ÙÀ½ÀÇ ¿¹Á¦¸¦ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
|
& |
MethodHide2.cs |
Ü privateÀ¸·Î ¸Þ¼µåÀÇ ¹«½ÃÇϱ⸦ »ç¿ëÇÑ °æ¿ì |
|
using System; class Root{ public void Call() { Console.WriteLine("Root Call()"); } } class Sub: Root{ new private void Call() { Console.WriteLine("Sub Call()"); } } class LastSub: Sub{ } class MethodHide2 { public static void LastSub s = new LastSub(); s.Call(); } } | ||
|
C:\C#Example\04>csc MethodHide2.cs C:\C#Example\04>MethodHide2 Root Call() | ||
Sub Ŭ·¡½º¿¡¼ Root Ŭ·¡½ºÀÇ Call() ¸Þ¼µå¸¦ privateÀ¸·Î ¹«½ÃÇϰí ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ privateÀ¸·Î ¹«½ÃÇÏ¿´±â ¶§¹®¿¡ ¿ÜºÎ¿¡¼´Â privateÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. Áï, LastSub Ŭ·¡½º ÀÔÀå¿¡¼ Call() ¸Þ¼µå¸¦ È£ÃâÇÒ ¶§ Sub Ŭ·¡½ºÀÇ Call() ¸Þ¼µå¿¡ Á¢±ÙÇÒ ¼ö ¾ø±â ¶§¹®¿¡ RootÀÇ Call() ¸Þ¼µå¸¦ È£ÃâÇÏ´Â °ÍÀÔ´Ï´Ù. privateÀ¸·Î new Ű¿öµå¸¦ »ç¿ëÇÏ¿© ¹«½ÃÇÏ¿´´Ù¸é Sub ³»ºÎ¿¡¼¸¸ ¹«½ÃÇϱⰡ ÀÌ·ç¾îÁö´Â °ÍÀÔ´Ï´Ù.
| jabookÀúÀÚ¸íÇÔ |
|
Á¦¸ñ:¼Ò¼³°°ÀºC# Á¦4°ÀÇ ÀúÀÚ:ÃÖ¿µ°ü |