5.4 Upcasting
5.4.1 upcastingÀ̶õ?
upcastingÀ̶ó´Â »óÀ§Å¬·¡½º·Î castingÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. »óÀ§Å¬·¡½º·Î castingÇÒ ¶§ ¿ì¸®´Â ´Ü¼øÈ÷ »óÀ§ Ŭ·¡½º·Î castingµÇ´Â±¸³ª! ÀÌ·¸°Ô¸¸ »ý°¢ÇÏ°í ±× ±íÀº Àǹ̴ µûÁöÁö ¾Ê½À´Ï´Ù. ÀÌ Àý¿¡¼´Â ÀϹÝÀûÀÎ upcastingÀÇ ÀÇ¹Ì¿Í ½ÇÁ¦ upcastingÀÌ Àû¿ëµÇ´Â ºÎºÐÀ» Á¶»çÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
5.4.2 upcastingÀÇ ÀϹÝÀûÀÎ ±¸Çö
¿ì¼±, upcastingÀÇ ´Ü¼øÇÑ °³³äºÎÅÍ ÆÄ¾ÇÇØº¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¾Æ·¡ÀÇ ±×¸²Àº upcastingÀÇ °³³äÀ» ±×´ë·Î ±×¸²À¸·Î ³ªÅ¸³½ °ÍÀÔ´Ï´Ù.
Ŭ·¡½º¿¡¼ »ó¼Ó ¹Þ¾Æ »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µé°í ÀÖ½À´Ï´Ù. Circle°ú Triangle ±×¸®°í RectangleÀº ¸ðµÎ Shape·Î UpcastingÀÌ °¡´ÉÇÕ´Ï´Ù. À§ÀÇ ±×¸²À» ÀÖ´Â ±×´ë·Î ÇÁ·Î±×·¥À¸·Î ¿Å°Ü º¸°Ú½À´Ï´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥Àº UpcastingÀ» Å×½ºÆ®Çϱâ À§ÇÑ ¿¹Á¦ÀÔ´Ï´Ù.
UpcastingClassTest.java(interface¸¦ Å×½ºÆ®Çϱâ À§ÇÑ ¿¹Á¦) |
class Shape { public void draw(){ System.out.println("¸ð¾çÀ» ±×¸³´Ï´Ù"); } public void delete(){ System.out.println("¸ð¾çÀ» Áö¿ó´Ï´Ù"); } } class Circle extends Shape { public void draw(){ System.out.println("¿øÀ» ±×¸³´Ï´Ù"); } public void delete(){ System.out.println("¿ø¸ð¾çÀ» Áö¿ó´Ï´Ù"); } public void sayCircle(){ System.out.println("¾È³çÇϼ¼¿ä ¿øÀÔ´Ï´Ù"); } } class Triangle extends Shape { public void draw(){ System.out.println("»ï°¢ÇüÀ» Çϳª, µÑ, ¼Â, ±×¸³´Ï´Ù."); } public void delete(){ System.out.println("»ï°¢ÇüÀ» Áö¿ó´Ï´Ù"); } public void sayTriangle(){ System.out.println("¾È³çÇϼ¼¿ä »ï°¢ÇüÀÔ´Ï´Ù"); } } class Rectangle extends Shape { public void draw(){ System.out.println("»ç°¢ÇüÀ» ¿ø, Åõ, ¾²¸®, Æ÷ ±×¸³´Ï´Ù."); } public void delete(){ System.out.println("»ç°¢ÇüÀ» Áö¿ó´Ï´Ù"); } public void sayRect(){ System.out.println("¾È³çÇϼ¼¿ä »ç°¢ÇüÀÔ´Ï´Ù"); } } |
//abstractÀ» Å×½ºÆ®Çϱâ À§ÇÑ Å¬·¡½º public class UpcastingClassTest{ public static void main(String[] args){ Shape s = new Shape(); s.draw(); s.delete(); System.out.println(); //Ŭ·¡½ºÀÇ ±âº»ÀûÀÎ »ç¿ë¹ý Circle c = new Circle(); c.draw(); c.delete(); c.sayCircle(); System.out.println(); Triangle t = new Triangle(); t.draw(); t.delete(); t.sayTriangle(); System.out.println(); Rectangle r = new Rectangle(); r.draw(); r.delete(); r.sayRect(); System.out.println(); //UpcastingÀÇ »ç¿ë Shape c1 = new Circle(); c1.draw(); c1.delete(); //c1.sayCircle(); ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. System.out.println(); Shape t1 = new Triangle(); t1.draw(); t1.delete(); //t1.sayTriangle(); ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. System.out.println(); Shape r1 = new Rectangle(); r1.draw(); r1.delete(); //r1.sayRect(); ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. } } |
¿©·¯ºÐÀº ´ç¿¬È÷ ´ÙÀ½°ú °°Àº °´Ã¼»ý¼ºÀÌ °¡´ÉÇÏ´Ù°í »ý°¢ÇÕ´Ï´Ù.
n Circle c = new Circle();
n Triangle t = new Triangle();
n Rectangle r = new Rectangle();
upcastingÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°Àº °´Ã¼ »ý¼ºµµ °¡´ÉÇÕ´Ï´Ù.
n Shape c1 = new Circle();
n Shape t1 = new Triangle();
n Shape r1 = new Rectangle();
±×·±µ¥ À§ÀÇ Äڵ忡¼ upcastingÀ» ÀÌ¿ëÇÏ´Â ºÎºÐ¿¡¼ ÀÌ»óÇÑ Á¡À» ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù.
Shape c1, t1, r1Àº ¸ðµÎ ShapeŬ·¡½ºÀÇ °´Ã¼º¯¼öÀÔ´Ï´Ù. ÇÏÁö¸¸ ¾Æ¹öÁöÀÇ ¸Þ¸ð¸®¸¦ »ý¼ºÇÏ¿© ÇÒ´çÇÏ¿´½À´Ï´Ù. ÀÌ ¶§ c1, t1, r1ÀÌ ÀçÁ¤ÀÇµÈ ¸Þ¼µå¸¦ È£ÃâÇßÀ» ¶§ ´©±¸ÀÇ ¸Þ¼µå¸¦ È£Ãâ ÇÏ´À³Ä´Â °ÍÀÔ´Ï´Ù. ºÐ¸í c1, t1, r1Àº ¸ðµÎ ShapeÇüÀÔ´Ï´Ù. ±×·¸´Ù¸é ÀçÁ¤ÀÇ µÇ¾ú´Ù ÇÏ´õ¶óµµ c1, t1, r1Àº ¸ðµÎ Shape ³»ÀÇ ¸â¹ö¸Þ¼µå¸¦ È£Ãâ ÇÏ´Â °ÍÀÌ ¸Â½À´Ï´Ù. À̰ÍÀÇ ±¸Á¶¸¦ ¾Æ·¡ÀÇ ±×¸²°ú °°½À´Ï´Ù.
ÀϹÝÀûÀÎ °üÁ¡¿¡¼ º»´Ù¸é, c1 ÀÚüÀÇ Å©±â´Â ShapeÇüÀ̱⠶§¹®¿¡ ½ÇÁ¦·Î »ý¼ºµÈ ¸Þ¸ð¸®¿¡¼ ÇÚµéÇÒ ¼ö ÀÖ´Â ºÎºÐÀº ShapeÀÇ draw¿Í deleteÀÔ´Ï´Ù. ¸¸ÀÏ ÀçÁ¤ÀÇ µÈ ¸Þ¼µå°¡ Circle¿¡ Á¸ÀçÇÑ´Ù¸é CircleÀÇ draw¿Í delete¸¦ »ç¿ëÇÕ´Ï´Ù. ¾ø´Ù¸é ShapeÀÇ °ÍÀ» ÀÌ¿ëÇÏÁö¸¸ ÀÖ´Ù¸é ¾ÆµéÀÇ °ÍÀ» ÀÌ¿ëÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¿ø¸®¸¦ ´Ù½Ã ±×¸²À¸·Î ³ªÅ¸³» º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
À§ÀÇ ±×¸²Àº Shape c1 = new Circle()À̶ó°í °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ c1À» ÀÌ¿ëÇÏ¿© c1.draw()¸¦ È£Ãâ ÇßÀ» ¶§ÀÇ ¼öÇà ¼ø¼ÀÔ´Ï´Ù. ¸ÕÀú c1Àº ÀÚ½ÅÀÇ draw()ÂÊÀ¸·Î ³Ñ¾î°©´Ï´Ù. ±×¸®°í ÀçÁ¤ÀÇ µÈ ¸Þ¼µå°¡ ÀÖ´ÂÁö ¾ø´ÂÁö È®ÀÎ ÇÕ´Ï´Ù. ±×¸®°í ¾ÆµéÀÌ ÀçÁ¤ÀÇ µÈ ¸Þ¼µå¸¦ °¡Áö°í ÀÖ´Ù¸é ¾ÆµéÀÇ draw¸¦ È£Ãâ ÇÏ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. À̰ÍÀ» ¿ì¸®´Â upcastingÀ̶ó ºÎ¸£´Â °ÍÀÔ´Ï´Ù. Á¼Àº ¹æÇâÀ¸·Î castingµÈ´Ù°í ÇÏ¿© narrow castingÀ̶ó°í ºÎ¸¨´Ï´Ù. À̰ÍÀº C++¿¡¼´Â Virtual FunctionÀ¸·Î ¼Ò°³ µÇ°í ÀÖ´Â ºÎºÐÀÌÁö¸¸ ÀÚ¹Ù¿¡¼´Â µðÆúÆ®·Î ÀÌ °³³äÀ» ÀÌ¿ëÇϰí ÀÖ½À´Ï´Ù. ¿ø·¡ C++¿¡¼´Â ÀÏ¹Ý ¸Þ¼µå¿Í °¡»ó¸Þ¼µå¸¦ ±¸ºÐÇϱâ À§Çؼ virtualÀ̶ó´Â Ű¿öµå¸¦ Àç°øÇÏÁö¸¸ ÀÚ¹Ù¿¡¼´Â À̰ÍÀ» ÀçÁ¤ÀÇ³Ä ¾Æ´Ï³Ä·Î ±¸ºÐ ÇÒ ¼ö Àֱ⠶§¹®¿¡ ±×³É ÀÌ¿ëÇÏ´Â °Í °°½À´Ï´Ù. °³ÀÎÀûÀ¸·Î »ý°¢Çϱ⿡´Â, C++µÚ¿¡ ÀÚ¹Ù°¡ ³ª¿Ô±â ¶§¹®¿¡ ÀÌ·¯ÇÑ ºÒÆíÀ» ³»ºÎ·Î ¼û°Ü ¹ö¸®Áö ¾Ê¾Ò³ª »ý°¢ÇÕ´Ï´Ù.
ÀÌ upcastingÀÇ ±¸Á¶¿¡¼ À¯ÀÇÇØ¾ß ÇÒ °ÍÀÌ Çϳª ÀÖ½À´Ï´Ù. ¼Ò½º¿¡¼ º»´Ù¸é ¿¡·¯°¡ ³ ºÎºÐÀÌ ÀÖ½À´Ï´Ù. ¿¡·¯°¡ ³ª´Â ÀÌÀ¯´Â ÀçÁ¤ÀÇ µÈ ¸Þ¼µå°¡ ¾Æ´Ï¶ó´Â °ÍÀÔ´Ï´Ù. ÀçÁ¤ÀÇ µÇ¾ú´Ù¸é ã¾Æ °¥ ¼ö ÀÖÁö¸¸ ÀçÁ¤ÀÇ µÇÁö ¾Ê¾Ò´Ù¸é ã¾Æ °¥ ¼ö ¾ø½À´Ï´Ù. ±× ÀÌÀ¯¸¦ ±×¸²À¸·Î º»´Ù¸é ´ÙÀ½°ú °°À» °ÍÀÔ´Ï´Ù.
¾ÆµéÀÌ ¸Þ¼µå¸¦ ÀçÁ¤ÀÇ ÇßÀ» ¶§¸¸ Shape c1Àº ¾ÆµéÀÇ °ÍÀ» ã¾Æ °¥ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¸»Àº Shape¿¡ ÀÖ¾î¾ß ¸¸ÀÌ ±× ¸Þ¼µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÔ´Ï´Ù. Áï, c1Àº ShapeÇüÀ̶ó´Â °ÍÀÔ´Ï´Ù. ¾ÆÁÖ ´Ü¼øÇÑ ¸»ÀÌÁö¸¸ upcasting¶§¹®¿¡ Çü ±× Â÷Á¦¸¦ ¸Á°¢ÇÏ¸é ¾ÈµË´Ï´Ù.
5.4.3 Abstract¿Í Interface¿¡¼ÀÇ Upcasting
¿ì¸®´Â upcastingÀ» ÀϹÝÀûÀΠŬ·¡½º ±¸Á¶¿¡¼¸¸ »ìÆì º¸¾Ò½À´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀº abstract¿Í interface¿¡¼µµ Àû¿ë µÇ¾î Áú ¼ö ÀÖ½À´Ï´Ù. ±× ±¸Á¶´Â ´ÙÀ½°ú °°À» °ÍÀÔ´Ï´Ù.
±×·±µ¥ ´ÙÀ½°ú °°Àº Áú¹®À» ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
n abstract´Â °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù.
n interface´Â °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù.
ÀÌ·¯ÇÑ ¸»¿¡ ºÎµúÈ÷°Ô µË´Ï´Ù. abstract¿Í interface´Â °´Ã¼¸¦ »ý¼ºÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¸¸µé¾îÁø °´Ã¼¸¦ ÇÒ´ç ¹Þ´Â °ÍÀÔ´Ï´Ù. ÇüÀº °°±â ¶§¹®¿¡ ÀÌ·¯ÇÑ °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. abstract³ª interface·Î´Â new¿¬»êÀÚ¸¦ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù. ´ÜÁö ¸¸µé¾îÁø °´Ã¼¸¦ upcastingÀ» ÀÌ¿ëÇØ¼ ³Ñ°Ü ¹ÞÀ» »ÓÀÔ´Ï´Ù. ÀÌ·¯ÇÑ °ÍÀº ¸¹Àº ÀåÁ¡À» ³»Æ÷Çϰí ÀÖ½À´Ï´Ù. ¾Ë°í º¸¸é interface´Â ºó ²®µ¥±â¿¡ ºÒ°ú ÇÕ´Ï´Ù.
»ç¿ëÀÚ´Â ¿ë·®ÀÌ ÀûÀº ºó ²®µ¥±â¸¸ °¡Áö°í À־ ¸ðµç ÀÛ¾÷À» ÀüºÎ ¼öÇà ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ìÀÇ ±×¸²¿¡¼´Â ¼³¸íÀ» À§Çؼ ÀÓÀÇÀÇ interface¸¸µé¾ú½À´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇØ¼ ¿ì¸®´Â ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼º ÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
n Shape s = new Circle();
n Action a = new Circle();
n Attribute ab = new Circle();
n Circle c = new Circle();
ÀÌ ÄÚµåÀÇ ÀåÁ¡Àº »ç¿ëÀÚ´Â ³»ºÎ¸¦ ¸ô¶óµµ µÈ´Ù´Â °ÍÀÔ´Ï´Ù. interface¸¸ ÀÖ´Ù¸é ¾î¶°ÇÑ ÀÛ¾÷ÀÌ¶óµµ ÀüºÎ ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ÀåÁ¡Àº ¿ì¸®°¡ Á÷Á¢ ¸¸µé¾î¼ ÀÛ¾÷Çϱ⠺¸´Ù´Â ³»ºÎÀûÀ¸·Î ÀÌ·ç¾îÁö´Â °æ¿ì°¡ ¾ÆÁÖ ¸¹½À´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀ» Àß ÀÌ¿ëÇÏ¸é º¸´Ù Á¤±³ÇÑ ÇÁ·Î±×·¥ÀÛ¾÷À» ÇÒ ¼ö ÀÖÀ¸¸®¶ó »ý°¢µË´Ï´Ù.
5.4.4 °á·Ð
¿©·¯ºÐµéÀÌ Àß ¸ð¸£°í »ç¿ëÇÏ´Â UpcastingÀº ¾ÆÁÖ ¸¹Àº ÀåÁ¡À» Á¦°øÇϰí ÀÖ½À´Ï´Ù. ÀÚ¹Ùµµ ¿©·¯ Á¾·ùÀÌÁö¸¸ °í±Þ ÀÚ¹Ù·Î °¥¼ö·Ï ÀÌ Upcasting°³³äÀº ´õ¿í öÀúÇÏ°Ô Àû¿ëµË´Ï´Ù. RMI, Enterprise Java Beans, Mobile Java, Personal Java, Java Dynamic Management Kitµî »ç¿ë ¾È µÇ´Â °÷ÀÌ ¾ø½À´Ï´Ù. ¾îÂ÷ÇÇ ÀÚ¹Ù¸¦ ¹è¿ì¸é ½Ç¹«¿¡¼ ´Ù·çÁö ¾Ê°Ú½À´Ï±î?
´ÙÇü¼ºÀ» ÁÖÀåÇÏ´Â UpcastingÀÇ ÀåÁ¡Àº abstract, interface, encapsulation, overriding µî ¾ÆÁÖ ¸¹Àº ºÎºÐ°ú °ü·ÃÀÌ ÀÖ½À´Ï´Ù. ÀÌ upcasting°ú interface¿¡ ´ëÇØ¼ Á¦´ë·Î ÀÌÇØÇß´Ù¸é ÀÚ¹Ù´Â ¹Ù·Î ¿©·¯ºÐµéÀÇ ¼Õ¿¡ ÀÖ´Â °ÍÀÔ´Ï´Ù.
±×·±µ¥, Áö±Ý±îÁö´Â »óÀ§·Î castingÇÏ´Â °ÍÀ» ¹è¿ü½À´Ï´Ù. »óÀ§Ä³½ºÆÃÀÌ Àִµ¥ ÇÏÀ§ ij½ºÆÃÀº ¾ø°Ú½À´Ï±î? ´ÙÀ½À¸·Î ÇÏÀ§Ä³½ºÆÃÀ» ÇÏ´Â ´Ù¿î ij½ºÆÃ¿¡ ´ëÇØ¼ ¹è¿ö º¸°Ú½À´Ï´Ù.
jabookÀúÀÚ¸íÇÔ |
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù1ºÎ ÀúÀÚ:ÃÖ¿µ°ü |