|| [[TableOfContents]] || = 소개 = 요즘 심심하면 ì´ìƒí•œ ì±…ë“¤ì„ ë³´ëŠ”ë° ì´ëŸ° ì´ì•¼ê¸°ê°€ 나와서 ì†Œê°œí• ë§Œí•œ 가치가 ëŠê»´ì§€ë¯€ë¡œ ì ìŒ. (심심하면 아래를 ì½ì„ 것 -_-; 오로지 코드ì—ë§Œ 관심있는 사람ì´ë¼ë©´ BACK 버튼ì„~ 별로 재미없는 내용으로 ì´ì–´ì§ˆ 것으로 ë³´ìž„) ê°ì²´ 지향ì—서 가장 중요한 ê°œë…ì„ ê¼½ìœ¼ë¼ë©´ 무엇ì„ê¼½ì„까? 다름 아닌 다형성(Polymorphism)ì´ë¼ê³ 하지 않ì„까 싶다. ì´ ë‹¤í˜•ì„±ì—ë„ ì¢…ë¥˜ê°€ 있다는 ê²ƒì„ ì•Œë ¤ëŠ”ì§€ ëª¨ë¥´ê² ë‹¤. 첫째는 최초로 ì œì•ˆëœ ë‹¤í˜•ì„±ì¸ ParametricPolymorphism, 둘째는 어쩌다 ìƒê²¨ë‚˜ 버린 Ad-hocPolymorphism ì´ë ‡ê²Œ ë‘가지가 존재한다. 한번 ê°œë…ì˜ ì°¨ì´ë¥¼ ì´í•´í•˜ê³ ìžë°”5ì—서 ì§€ì›í•˜ê¸° 시작한 genericì˜ ë„ìž…ì˜ ì˜ë¯¸ì— 대해서 ìƒê°í•´ë³´ëŠ” ì‹œê°„ì´ ë 것ì´ë‹¤. ê·¸ë¦¬ê³ ë‚´ìš©ì´ ëŒ€ë¶€ë¶„ ì±…ì— ìžˆëŠ” ë‚´ìš©ì—서 필요한 부분만 간추린 ë‚´ìš©ì´ë¼ ìƒëžµëœ ë¶€ë¶„ì´ ì¡´ìž¬í•˜ë‹ˆ ì½ì–´ë³´ê³ ì‹¶ì€ ì‚¬ëžŒì€ ë„서관ì—서 찾아서 ì½ì–´ë³´ë©´ë¨. (몇장안ë¨) ''ps. ã…¡.ã…¡;; 우리는 ì €ê±°ê¹Œì§€ ë°°ìš°ì§€ë„ ì•Šì•˜ëŠ”ë°... ì—시 í•™êµìˆ˜ì—…ì´ëž€ ㅉㅉ'' = 다형성? = 차를 ìƒê°í•´ë³´ìž. 우리 ì£¼ë³€ì˜ ì°¨ëŠ” ì •ë§ë¡œ 많다. 그중 ì°¨ë“¤ì„ ì¶”ìƒí™”하여 표현한 명사 Car, ê·¸ê²ƒì˜ í•˜ìœ„ì˜ ê²ƒë“¤ì€ sportCar, luxuryCar ì´ë ‡ê²Œ 3ê°œì˜ ê°ì²´ë¥¼ ìƒê°í•´ë³´ìž. 당연히 후ìžì˜ 2ê°œì˜ ê°ì²´ëŠ” ì „ìžì˜ 2ê°œì˜ ê°ì²´ë¥¼ ìƒì†í•œë‹¤. 당연히 Car 와 sportCar, luxuryCar 는 서로 ë™ì¼í•œ ì›ë¦¬ë¡œ 움ì§ì´ê² 지만 ë™ì¼í•˜ì§€ëŠ” 않다. getCar(:String):Car ë¼ëŠ” 메소드를 ìƒê°í•´ë³´ìž. {{{~cpp public Car getCar(String clientType) { if("young man".equals(clientType)) { return new SportCar(); } else if("old man".equals(clientType)) { return new LuxuryCar(); } else { //Error! return null; } } }}} ìƒê¸° 메소드를 통해서 {{{~cpp Car sportCar = getCar("young man"); Car luxuryCar = getCar("old man"); }}} ì˜ ì‹ì„ 쓸 수 있다. SportCar, LuxuryCar는 Car를 ìƒì†ë°›ëŠ” í´ëž˜ìФ ì´ë¯€ë¡œ IS-Aì˜ ê´€ê³„ë¼ê³ í• ìˆ˜ 있다. ë”°ë¼ì„œ SportCar, LuxuryCarì˜ ì¸ìŠ¤í„´ìŠ¤(instance)ê°€ Carê°ì²´ ë³€ìˆ˜ì¸ sportCar, luxuryCarì— ëŒ€ìž…ì´ ê°€ëŠ¥í•˜ë‹¤. ê·¸ë¦¬ê³ ìœ„ì™€ ê°™ì€ ê²ƒìœ¼ë¡œ 현재 다형성ì´ë¼ê³ 하는 ë°©ì‹ì´ 구현ë˜ì–´ì ¸ 있다. ë™ì¼í•œ Carì´ê¸°ëŠ” 하지만 run()ì´ë¼ëŠ” 메시지를 2ê°œì˜ ê°ê¸° 다른 ì°¨ì— ì£¼ë©´ 당연히 한차는 ì—„ì²ë‚œ ê°€ì†ë„로 ì†ë„ê°€ 붙어서 ë‹¬ë¦¬ê¸°ê² ì§€ë§Œ 다른 차는 ê°€ì†ë„보다는 승차ê°ì´ë¼ë“ ê°€ 그외ì ìš”ì†Œì— ë”ìš± ì‹ ê²½ì„ ì“´ run()ì´ë¼ëŠ” ë°©ì‹ìœ¼ë¡œ 달리게 ë 것ì´ë‹¤. 대략 ì´ê²ƒì´ 다형성ì´ë¼ëŠ” 것으로 표현ëœë‹¤. = Parametric Polymorphism = 본디 í´ë¦¬ëª¨í”¼ì¦˜ì—서 추구한 ë°©ì‹ ì¦‰ 파ë¼ë©”íŠ¸ë¦ ë°©ì‹ì— ì˜í•˜ë©´ ìƒê¸°ì˜ ì‹ì„ ì ìš©í• ë•Œ ë™ì ìºìŠ¤íŒ…ì´ í•„ìš”ê°€ 없어야한다. ìž ìŠ¤í¬ì¸ ì¹´ì— í„°ë³´ì—”ì§„ì´ ë‹¬ë ¸ë‹¤ëŠ” ë°œìƒì„ í•´ë³´ìž. {{{~cpp Car sportCar = getCar("young man"); sportCar.startTurboEngine(); }}} 어떨까? 당연히 ì—러가 난다. í„°ë³´ì—”ì§„ì€ ìŠ¤í¬ì¸ ì¹´ì— ë‹¬ë¦° 것ì´ì§€ Carë¼ëŠ” ê°ì²´ì—는 존재하지 않기 때문ì´ë‹¤. ê·¸ë ‡ë‹¤ë©´ 다ìŒì€? {{{~cpp SportCar sportCar = getCar("young man"); sportCar.startTurboEngine(); }}} ì—시 ì—러가 난다. SportCarì— ëŒ€ìž…ë˜ëŠ” getCar():Car는 SportCar보다 ìƒìœ„ì˜ ê°œë…ì€ Carì´ê¸° 때문ì´ë‹¤. ì´ë¥¼ 해결한 코드는 다ìŒê³¼ 같다. {{{~cpp SportCar sportCar = (SportCar) getCar("young man"); sportCar.startTurboEngine(); }}} ì—러는 피했다. 하지만 우리가 ê·¸ë¦¬ë„ ë°”ë¼ë§ˆì§€ ì•Šë˜ í’ˆê²©ì˜ ê°ì²´ì§€í–¥ 언어가 너ëœë„ˆëœí•œ í‘œí˜„ë²•ì„ ì“´ë‹¤. 본디 파ë¼ë©”íŠ¸ë¦ í´ë¦¬ëª°í”¼ì¦˜ì€ ìƒê¸°ì™€ ê°™ì€ ë¬¸ì œì˜ í•´ê²°ì„ ìœ„í•´ì„œ ë°©ì–´ì ìˆ˜ë‹¨ì„ ì œê³µí•œë‹¤. 무엇ì¸ê³ 하니, 바로 ë¦¬í„´í•´ì•¼í• ê°ì²´ì˜ íƒ€ìž…ì„ ì¸ìˆ˜ë¡œ 준다는 ê°œë…ì´ë‹¤. ''(C++ì˜ í…œí”Œë¦¿ 같지?)'' 위와 ê°™ì€ ê°œë…ì˜ ì½”ë“œë¡œ ìž‘ì„±ì´ ë˜ë©´ ë™ì ìºìŠ¤íŒ…ì´ í•„ìš” ì—†ì„ë¿ë§Œì•„ë‹ˆë¼ ìž˜ëª»ëœ íƒ€ìž… ìºìŠ¤íŒ…ìœ¼ë¡œ ì¸í•œ ì—러ì—시 ë°©ì§€í• ìˆ˜ 잇다. 최근 ìžë°” 5 ì—서는 '''generics''' ë¼ëŠ” ê¸°ëŠ¥ì„ ë„입함으로서 파ë¼ë©”íŠ¸ë¦ í´ë¦¬ëª¨í”¼ì¦˜ì„ ì§€ì›í•˜ê¸° 시작했다. '''genericsì— ëŒ€í•œ ì˜ˆì œ''' {{{~cpp class Pair<SomeObjectType> { SomeObjectType x, y; Pair(SomeObjectType x, SomeObjectType y) { this.x = x; this.y = y; } SomeObjectType getFirstObject (Pair<SomeObjectType> p) { return p.x; } } }}} ìƒê¸°ì™€ ê°™ì€ ë°©ì‹ìœ¼ë¡œ 작성하게 ë˜ë©´ 다ìŒê³¼ ê°™ì´ íŠ¹ì •í•œ ë°ì´í„° í˜•ì— êµ¬ì• ë°›ì§€ 않는 로ì§ì´ 작성ëœë‹¤. {{{~cpp Pair<Integer> p; p = new Pair<Integer>(new Integer(0), new Integer(1)); Integer x = p.getFirstObject(p); Pair<Boolean> p; p = new Pair<Boolean>(new Boolean(0), new Boolean(1)); Boolean x = p.getFirstObject(p); . . . . }}} ì´ë ‡ê²Œ 파ë¼ë©”íŠ¸ë¦ í´ë¦¬ëª¨í”¼ì¦˜ì„ ë„입함으로서 ì¢€ë” ìš°ì•„í•œ 코드가 완성ëœë‹¤. ---- [AcceleratedC++/Chapter13], [http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200505230005 ìž„ë°±ì¤€ì˜ ì†Œí”„íŠ¸ì›¨ì–´ ì‚°ì±…/임배준 ì§€ìŒ], WikiPedia:Christopher_Strachey