¼Ò¼³°°ÀºC#  Á¦4°­ÀÇ C#ÀÇ °´Ã¼ÁöÇâ  11. º¯¼ö¿Í ¸Þ¼­µå ¹«½ÃÇϱ⠠

 

 

4.11 º¯¼ö¿Í ¸Þ¼­µå ¹«½ÃÇϱâ

 

Áö¿ªº¯¼ö¿Í ¸â¹öÇʵåÀÇ À̸§ÀÌ °°´Ù°í ÇÑ´Ù¸é Áö¿ªº¯¼ö¿¡ ¿ì¼±ÇÒ±î¿ä? ¸â¹öÇʵ忡 ¿ì¼±ÇÒ ±î¿ä. ´ÙÀ½ÀÇ ¿¹Á¦¸¦ º¸½Ã¸é Áö¿ªº¯¼ö°¡ ƯÁ¤ ºí·Ï ³»¿¡¼­ ¼±¾ðµÇ¾îÁö¸é »óÀ§ÀÇ ¸â¹öÇʵ尡 À̸§ÀÌ °°´Ù°í ÇÏ´õ¶óµµ Áö¿ªº¯¼ö¿¡ ¿ì¼±ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±¸ºÐÀÇ ¾Ö¸ÅÇÔÀ» À§Çؼ­ 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 Main(){

               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 Main(){

          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 Main(){

             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°­ÀÇ
ÀúÀÚ:ÃÖ¿µ°ü