°´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö

±×°ÍÀº ¹«¾úÀΰ¡?

ÀÌÁ¦ ¿ì¸®´Â ¾à 5³â Àü¿¡´Â Áøº¸µÈ ÁÖÁ¦·Î Ãë±ÞµÇ´Â ¿ë¾î¿´À» ¾î¶² °Í¿¡·Î À̵¿ÇÑ´Ù. ¿À´Ã³¯ °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö'Object Oriented Programming'Àº Ç¥ÁØÀÌ µÇ¾ú´Ù. ÀÚ¹Ù¿Í ÆÄÀ̽㠰°Àº ¾ð¾îµéÀº ±× °³³äÀ» Àß ±¸ÇöÇÏ¿© ¿©·¯ºÐÀº °´Ã¼¿Í ¾îµð¿¡¼±°¡ ¸¶ÁÖÄ¡Áö ¾Ê°í¼­´Â ¾Æ¹«°Íµµ ÇÒ ¼ö°¡ ¾ø´Ù. ±×·¡¼­ ±×°ÍÀº µµµ¥Ã¼ ¹«¾ùÀΰ¡?

°¡Àå ÈǸ¢ÇÑ ÀÔ¹®¼­·Î´Â, ³ªÀÇ °ßÇØ·Î ´ÙÀ½°ú °°´Ù:

À̰͵éÀº ¿©·¯ºÐÀÌ ¸ñ·Ï ¾Æ·¡·Î ³»·Á °¥¼ö·Ï Å©±â¿Í, ±íÀÌ ±×¸®°í Çй®Àû ±íÀÌ°¡ Áõ°¡ÇÑ´Ù. Àü¹®°¡°¡ ¾Æ´Ñ ÇÁ·Î±×·¡¸ÓµéÀÇ ¸ñÀûÀ» À§Çؼ­¶ó¸é ù ¹ø°°¡ Àû´çÇÏ´Ù. ¼Ò°³¿¡ ÃÊÁ¡À» ¸ÂÃá ÇÁ·Î±×·¡¹Ö ÀÔ¹®¼­°¡ ´õ ÇÊ¿äÇÏ´Ù¸é 'Object Oriented Programming by Timothy Budd(2nd edition)'À» ½ÃµµÇØ º¸¶ó. ³ª´Â °³ÀÎÀûÀ¸·Î ÀÌ°ÍÀ» ÀоÁö´Â ¾Ê¾ÒÀ¸³ª ±×°ÍÀº ³»°¡ Á¸°æÇÏ´Â »ç¶÷µéÀÇ ÀÇ°ß¿¡ ÀÇÇϸé Ī¼ÛÀ» ¹Þ´Â´Ù. ¸¶Áö¸·À¸·Î OO ÀÇ ¸ðµç ÁÖÁ¦¿¡ °üÇÏ¿© ¹æ´ëÇÑ ¾çÀÇ Á¤º¸¸¦ ¿øÇÑ´Ù¸é ´ÙÀ½ÀÇ ¸µÅ© »çÀÌÆ®¸¦ ½ÃµµÇØ º¸¶ó: http://www.cetus.org

¿©·¯ºÐÀÌ ½Ã°£µµ ºÎÁ·ÇÏ°í ÀÌ·¯ÇÑ ¸ðµç Ã¥µé°ú ¸µÅ©µéÀ» Áö±Ý ´çÀå ¿¬±¸ÇÏ·Á°í ÇÏÁö´Â ¾ÊÀ» °ÍÀ̶ó°í °¡Á¤ÇÏ°í, ³ª´Â ¿©·¯ºÐ¿¡°Ô °£´ÜÇÏ°Ô ±× °³³ä¿¡ °üÇÏ¿© ¼³¸íÀ» ÇØ ÁÖ·Á°í ÇÑ´Ù. (ÁÖ ÀÇ: ¾î¶² »ç¶÷µéÀº OO °¡ ÀÌÇØÇϱⰡ ¾î·Æ´Ù°í »ý°¢ÇÏ°í ¶Ç ¾î¶² »ç¶÷µéÀº Áï°¢ 'ÀÌÇØÇÑ´Ù' ¿©·¯ºÐÀÌ ÀÌÀüÀÇ ¹üÁÖµéÀ» Àß ¼÷ÁöÇß´Ù¸é °ÆÁ¤ÇÏÁö ¸¶¶ó, ¿©·¯ºÐÀº ½ÇÁ¦·Î '±× ºûÀ» º¸Áö ¾Ê°í¼­µµ' ¿©ÀüÈ÷ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.)

¸¶Áö¸· ¿äÁ¡À¸·Î, ¿ì¸®´Â ÀÌÀå¿¡¼­ º£ÀÌÁ÷µµ ƼŬµµ °´Ã¼¸¦ Áö¿øÇÏÁö ¾Ê±â¶§¹®¿¡ ¿À·ÎÁö ÆÄÀ̽ḸÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. ÄÚµù °ü·Ê¸¦ »ç¿ëÇÏ¿© OO°¡ ¾Æ´Ñ ¾ð¾î¿¡¼­µµ °´Ã¼ÁöÇâÀû µðÀÚÀÎÀ» ±¸ÇöÇÒ¼ö´Â ÀÖÁö¸¸, ±×°ÍÀº º¸Åë ±ÇÀåÇÒ ¸¸ÇÑ Àü·«À̶ó±â º¸´Ù´Â °¡Àå ¸¶Áö¸·À¸·Î ÀÇÁöÇؾßÇÒ ¼±ÅûçÇ×ÀÌ´Ù. ¿©·¯ºÐÀÇ ¹®Á¦°¡ OOÅ×Å©´Ð¿¡ Àß ¸Â´Ù¸é ±×·¯¸é OO¾ð¾î¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ÁÁ´Ù.

µ¥ÀÌŸ¿Í ÇÔ¼ö - ¸ðµÎ

°´Ã¼´Â µ¥ÀÌŸ¸¦ ó¸®ÇÏ´Â µ¥ÀÌŸ¿Í ÇÔ¼öÀÇ ¸ðµÒÀÌ´Ù. À̰͵éÀº ÇÔ²² ¹­¿©Á®¼­ ¿©·¯ºÐÀº ÇϳªÀÇ °´Ã¼¸¦ ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÇ ÇÑ ºÎºÐÀ¸·ÎºÎÅÍ ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù. ±×¸®°í °´Ã¼´Â ÀÚµ¿ÀûÀ¸·Î µ¥ÀÌŸÀÇ ¼Ó¼ºattributes»Ó¸¸ ¾Æ´Ï¶ó »ç¿ë°¡´ÉÇÑ Ã³¸®¹æ¹ýoperations¿¡µµ ¿ª½Ã Á¢±ÙÇÑ´Ù.

¿¹¸¦ µé¾î ¹®ÀÚ¿­ °´Ã¼´Â ¹®ÀÚ¿­À» ÀúÀåÇÒ »Ó¸¸ ¾Æ´Ï¶ó ±× ¹®ÀÚ¿­¿¡ ´ëÇÑ Ã³¸®¸¦ ÇÏ¿© ÁÖ´Â ¸Þ½îµåmethods ¶ÇÇÑ Á¦°øÇÑ´Ù. - °Ë»öÇÏ°í, ´ë¼Ò¹®ÀÚ¸¦ º¯°æÇÏ°í, ±æÀ̸¦ °è»êÇÏ°í µîµî.

°´Ã¼´Â ¸Þ½ÃÁö ³Ñ°ÜÁÖ±â message passing ¸ÞŸÆ÷¸¦ »ç¿ëÇÑ´Ù °Å±â¿¡¼­ ÇÑ °´Ã¼´Â ¸Þ½ÃÁö¸¦ ´Ù¸¥ °´Ã¼¿¡°Ô ³Ñ°ÜÁÖ°í Á¢¼ö°´Ã¼´Â ÀÚ½ÅÀÌ °¡Áö°í Àִ ó¸®¸¦, Áï ¸Þ½îµå¸¦ ½ÇÇàÇÔÀ¸·Î½á ¹ÝÀÀÇÑ´Ù. ±×·¸°Ô ¸Þ½îµå´Â »óÀÀÇÏ´Â ¸Þ½ÃÁö¸¦ Á¢¼öÇÒ ¶§ ÁÖÀÎ °´Ã¼¿¡ ÀÇÇؼ­ ¿äûµÈ´Ù. ÀÌ°ÍÀ» Ç¥ÇöÇÏ´Â µ¥´Â ¸¹Àº Ç¥±â¹ýµéÀÌ ÀÖÁö¸¸ °¡Àå ÀϹÝÀûÀÎ °ÍÀº ·¹ÄÚµåÀÇ Çʵ忡 Á¢±ÙÇÏ´Â °ÍÀ» Èä³»³»´Â °ÍÀÌ´Ù - Á¡À¸·Î. ±×·¸°Ô °¡»óÀûÀÎ À§Á¬ Ŭ·¡½º¿¡µµ Àû¿ëµÈ´Ù:

w = Widget() # create new instance, w, of widget
w.paint()  # send the message 'paint' to it

ÀÌ°ÍÀº ±× À§Á¬ °´Ã¼ÀÇ paint ¸Þ½îµå°¡ ¿äûµÇµµ·Ï ÇÑ´Ù.

Ŭ·¡½º¸¦ Á¤ÀÇÇϱâ

µ¥ÀÌŸ°¡ ¸¹Àº ÇüŸ¦ °¡Áö´Â °Í°ú ¸¶Âù°¡Áö·Î °´Ã¼µéÀº ´Ù¸¥ ÇüŵéÀ» °¡Áú ¼öÀÖ´Ù. ÀÌ·¯ÇÑ µ¿ÀÏÇÑ ¼ºÁúÀ» °¡Áö´Â °³Ã¼ÀÇ ¸ðµÒÀº Ŭ·¡½º class¶ó°í ¾Ë·ÁÁ® ÀÖ´Ù. ¿ì¸®´Â °´Ã¼¸¦ Á¤ÀÇÇÒ ¼ö ÀÖÀ¸¸ç ±×°ÍµéÀÇ ½Çü instances¸¦ ¸¸µé ¼ö ÀÖ´Ù. ½Çü´Â ½ÇÁ¦·Î ¿òÁ÷ÀÌ´Â °´Ã¼ÀÌ´Ù. ¿ì¸®´Â ÀÌ·¯ÇÑ °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶Á¡À» ¿ì¸®ÀÇ ÇÁ·Î±×·¥¿¡¼­ º¯¼ö¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Ù.

±¸Ã¼ÀûÀÎ ¿¹Á¦¸¦ »ìÆ캸°í ¿ì¸®°¡ ±×°ÍÀ» ´õ Àß ¼³¸íÇÒ ¼ö ÀÖ´ÂÁö ¾Ë¾Æº¸ÀÚ. ¿ì¸®´Â ¹®ÀÚ¿­°ú - ¸Þ½ÃÁö ÅؽºÆ® - ±×¸®°í ±× ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ¸Þ½îµå¸¦ ´ã°í ÀÖ´Â ¸Þ½ÃÁö Ŭ·¡½º¸¦ ÀÛ¼ºÇÒ °ÍÀÌ´Ù.

class Message:
    def __init__(self, aString):
        self.text = aString
    def printIt(self):
        print self.text

ÁÖ ÀÇ 1:ÀÌ Å¬·¡½ºÀÇ ¸Þ½îµåÁßÀÇ Çϳª´Â __init__ À̶ó°í ºÒ·ÁÁø´Ù. ±×¸®°í ±×°ÍÀº ±¸¼ºÀÚ constructor¶ó°í ºÒ¸®´Â Ưº°ÇÑ ¸Þ½îµåÀÌ´Ù. ±× À̸§ÀÌ ºÙÀº ÀÌÀ¯´Â »õ·Î¿î °´Ã¼ ½Çü°¡ »ý¼ºµÇ°Å³ª ȤÀº ±¸¼ºµÉ ¶§ ±×°ÍÀÌ È£ÃâµÇ±â ¶§¹®ÀÌ´Ù. ÀÌ ¸Þ½îµå¾È¿¡¼­ ÇÒ´çµÈ (±×·¯¹Ç·Î ÆÄÀ̽㿡 »ý¼ºµÈ) ¾î¶² º¯¼öµµ »õ·Î¿î ½Çü¿¡ ´ëÇÏ¿© À¯ÀÏÇÒ °ÍÀÌ´Ù. ÆÄÀ̽㿡´Â ÀÌ¿Í °°Àº Ưº°ÇÑ ¸Þ½îµåµéÀÌ ¸¹ÀÌ Àִµ¥, °ÅÀÇ ¸ðµÎ´Â __xxx__ ¿Í °°Àº À̸§Çü½ÄÀ¸·Î ±¸º°µÈ´Ù.

ÁÖ ÀÇ 2:Á¤ÀÇµÈ µÎ °³ÀÇ ¸Þ½îµå ¸ðµÎ ù ¹ø° ¸Å°³º¯¼ö self¸¦ °¡Áø´Ù. ±× À̸§Àº °ü·ÊÀÌÁö¸¸ ±×·¯³ª °´Ã¼ ½Çü¸¦ Áö½ÃÇÑ´Ù. ¿ì¸®°¡ º¸°Ô µÇµíÀÌ ÀÌ ¸Å°³º¯¼ö´Â ½ÇÇà½Ã¿¡, ÇÁ·Î±×·¥¿¡ ÀÇÇؼ­°¡ ¾Æ´Ï¶ó ÀÎÅÍÇÁ¸®ÅÍ¿¡ ÀÇÇØ Ã¤¿öÁø´Ù. ±×·±½ÄÀ¸·Î print´Â ¾Æ¹«·± Àμö ¾øÀÌ ´ÙÀ½°ú °°ÀÌ È£ÃâµÈ´Ù: m.printIt().

ÁÖ ÀÇ 3:¿ì¸®´Â Message Ŭ·¡½º¸¦ ´ë¹®ÀÚ 'M'À¸·Î È£ÃâÇÏ¿´´Ù. ÀÌ°ÍÀº ¼ø¼öÈ÷ °ü·ÊÀûÀÌÁö¸¸, ±×°ÍÀº ¾ÆÁÖ ±¤¹üÀ§ÇÏ°Ô »ç¿ëµÇ´Â °ÍÀ¸·Î, ÆÄÀ̽㠻Ӹ¸ ¾Æ´Ï¶ó ´Ù¸¥ OO¾ð¾î¿¡µµ ¿ª½Ã »ç¿ëµÈ´Ù. °ü·ÃµÈ °ü·Ê¿¡ ÀÇÇÏ¸é ¸Þ½îµå À̸§Àº ¹Ýµå½Ã ¼Ò¹®ÀÚ·Î ½ÃÀÛÇÏ°í ±× ¸Þ½îµå À̸§ ¼Ó¿¡ ÀÖ´Â ÇϺΠ´Ü¾îµéÀº ´ë¹®ÀÚ·Î ½ÃÀÛÇؾ߸¸ ÇÑ´Ù. ±×·±½ÄÀ¸·Î "calculate current balance" ¶ó°í ºÒ¸®´Â ¸Þ½îµå´Â ´ÙÀ½°ú °°ÀÌ ¾²¿©Áú °ÍÀÌ´Ù: calculateCurrentBalance.

¿©·¯ºÐÀº Àá±ñ 'Data' ¼½¼ÇÀ» Àç¹æ¹®ÇÏ¿© ´Ù½Ã '»ç¿ëÀÚ Á¤ÀÇ Çü'À» »ìÆ캸°í ½ÍÀ»Áöµµ ¸ð¸¥´Ù. ÆÄÀ̽ã ÁÖ¼Ò·Ï ¿¹Á¦´Â ÀÌÁ¦ ¾à°£ ´õ ¸í·áÇØÁø °Í °°´Ù. º»ÁúÀûÀ¸·Î ÆÄÀ̽㿡¼­ »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ À¯ÀÏÇÑ ÇüÅ´ Ŭ·¡½ºÀÌ´Ù. ¼Ó¼ºÀ» °¡ÁöÁö¸¸ ( __init__ ´Â Á¦¿ÜÇÏ°í) ¸Þ½îµå´Â °¡ÁöÁö ¾Ê´Â Ŭ·¡½º´Â °á°úÀûÀ¸·Î º£ÀÌÁ÷ÀÇ ·¹ÄÚµå¿Í µ¿µîÇÏ´Ù.

Ŭ·¡½º¸¦ »ç¿ëÇϱâ

Ŭ·¡½º¸¦ Á¤ÀÇÇÏ°í ³ª¸é ¿ì¸®´Â ÀÌÁ¦ ¿ì¸®ÀÇ ¸Þ½ÃÁö Ŭ·¡½ºÀÇ ½Çü¸¦ ¸¸µé ¼ö ÀÖ°í ±×°ÍµéÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Ù:

m1 = Message("Hello world")
m2 = Message("So long, it was short but sweet")

note = [m1, m2] # put the objects in a list
for msg in note:
    msg.printIt() # print each message in turn

±×·¡¼­ º»ÁúÀûÀ¸·Î ¿©·¯ºÐÀº ±× Ŭ·¡½º¸¦ ¸¶Ä¡ ÆÄÀ̽ãÀÇ Ç¥ÁØ µ¥ÀÌŸÇüÀÎ °Íó·³ ´Ù·ç±â¸¸ ÇϸéµÈ´Ù. ±×°ÍÀÌ ¹Ù·Î °á±¹ ÀÌ ¿¬½À¹®Á¦ÀÇ ¸ñÀûÀÌ´Ù!

°°Àº °Í, ´Ù¸¥ °Í

¿ì¸®°¡ Áö±Ý±îÁö ¹è¿î°ÍÀº ¿ì¸® ÀڽŸ¸ÀÇ Å¬·¡½ºÇü(classes)À» Á¤ÀÇÇÏ°í ÀÌ Å¬·¡½ºµéÀÇ ½Çü¸¦ »ý¼ºÇÏ¸ç ±×¸®°í ±× ½ÇüµéÀ» º¯¼ö¿¡ ÇÒ´çÇÏ´Â ´É·ÂÀÌ´Ù. ±×·¯¸é ¿ì¸®´Â ¸Þ½ÃÁö¸¦ ÀÌ °´Ã¼µé¿¡ ³Ñ°ÜÁÙ ¼ö ÀÖ°í ÀÌ °´Ã¼´Â ¿ì¸®°¡ Á¤ÀÇÇÑ ¸Þ½îµå¸¦ È°¼ºÈ­½ÃŲ´Ù. ±×·¯³ª ÀÌ OO ¿¡ °üÇÑ°Í¿¡´Â ¸¶Áö¸· ÇÑ°¡Áö ¿ä¼Ò°¡ ³²¾Æ Àִµ¥, ¿©·¯¸éÀ¸·Î ±×°ÍÀº ¸ðµç °ÍÁß¿¡¼­µµ °¡Àå Áß¿äÇÑ ¸éÀÌ´Ù.

¸¸¾à °¢ÀÚ°¡ »óÀÀÇÏ´Â ¸Þ½îµå¸¦ °¡ÁöÁö¸¸ °°Àº ¸Þ½ÃÁöÀÇ ÁýÇÕÀ» Áö¿øÇÏ´Â ¼­·Î ´Ù¸¥ Ŭ·¡½ºÀÇ µÎ °´Ã¼¸¦ ¿ì¸®°¡ °¡Áø´Ù¸é ±×·¯¸é ¿ì¸®´Â ÀÌ·¯ÇÑ °´Ã¼µéÀ» ¸ðµÎ ¸ð¾Æ¼­ ±×°ÍµéÀ» ¿ì¸®ÀÇ ÇÁ·Î±×·¥¿¡¼­ µ¿ÀÏÇÏ°Ô Ãë±ÞÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ±× °´Ã¼µéÀº ¼­·Î ´Ù¸£°Ô ÇൿÇÒ °ÍÀÌ´Ù. °°Àº ÀÔ·Â ¸Þ½ÃÁö¿¡ ´ëÇÏ¿© ¼­·Î ´Ù¸£°Ô ÇൿÇÒ ¼ö ÀÖ´Â ÀÌ·¯ÇÑ ´É·ÂÀº ´ÙÇü¼º(polymorphism) À̶ó°í ºÒ¸®¿î´Ù.

ÀüÇüÀûÀ¸·Î ÀÌ°ÍÀº ±×¸®±â'paint'¸Þ½ÃÁö¸¦ Á¢¼öÇßÀ» ¶§ ¼ö¸¹Àº ¼­·Î ´Ù¸¥ ±×¸² °´Ã¼µéÀÌ ÀڽŵéÀ» ±×¸®µµ·Ï Çϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù. µ¿±×¶ó¹Ì´Â »ï°¢Çü°ú´Â ¾ÆÁÖ ´Ù¸¥ ¸ð¾çÀÌÁö¸¸, ±× µÑ ¸ðµÎ°¡ ±×¸®±â(paint) ¸Þ½îµå¸¦ °¡Áö°í ÀÖ´Ù¸é, ¿ì¸®´Â, ÇÁ·Î±×·¡¸Ó·Î½á ±× Â÷À̸¦ ¹«½ÃÇÏ°í ´ÜÁö ±×°ÍµéÀ» ¸ð¾ç'shapes'À¸·Î¸¸ »ý°¢ÇÏ¸é µÈ´Ù.

¿¹Á¦Çϳª¸¦ »ìÆ캸ÀÚ, °Å±â¿¡¼­ ¿ì¸®´Â ¸ð¾çÀ» ±×¸®´Â ´ë½Å¿¡ ±×µéÀÇ ¸éÀûÀ» °è»êÇÑ´Ù:

¸ÕÀú ¿ì¸®´Â »ç°¢Çü°ú ¿øÀÇ Å¬·¡½º¸¦ ¸¸µç´Ù:

class Square:
    def __init__(self, side):
        self.side = side
    def calculateArea(self):
        return self.side**2

class Circle:
    def __init__(self, radius):
        self.radius = radius
    def calculateArea(self):
        import math
        return math.pi*(self.radius**2)

ÀÌÁ¦ ¿ì¸®´Â (¿ø ȤÀº »ç°¢Çü) ¸ð¾çÀÇ ¸®½ºÆ®¸¦ ¸¸µé¼ö ÀÖ°í ±×µéÀÇ ¸éÀûÀ» ÀμâÇÒ ¼ö ÀÖ´Ù:

list = [Circle(5),Circle(7),Square(9),Circle(3),Square(12)]

for shape in list:
    print "The area is: ", shape.calculateArea()

ÀÌÁ¦ ¿ì¸®°¡ ÀÌ·¯ÇÑ ¾ÆÀ̵ð¾îµéÀ» ¸ðµâ°ú °áÇÕÇÑ´Ù¸é ¿ì¸®´Â Àç»ç¿ë Äڵ带 À§ÇÑ ´ë´ÜÈ÷ °­·ÂÇÑ ¸ÞÄ¿´ÏÁòÀ» ¾òÀ» ¼ö ÀÖ´Ù. Ŭ·¡½º Á¤ÀǸ¦ ÇÑ ¸ðµâ¿¡ - ¿¹¸¦ µé¾î,'shapes.py'¿¡ ³Ö°í¼­ ¿ì¸®°¡ ¸ð¾çÀ» ´Ù·ç°í ½ÍÀ» ¶§ ±× ¸ðµâÀ» °£´ÜÇÏ°Ô ¼öÀÔÇ϶ó. ÀÌ°ÍÀº Á¤È®ÇÏ°Ô ¸¹Àº Ç¥ÁØ ÆÄÀ̽㠸ðµâ¿¡ Àû¿ëµÇ¾î¿Â °ÍÀ¸·Î, °´Ã¼ÀÇ ¸Þ½îµå¿¡ Á¢±ÙÇÏ´Â °ÍÀÌ ¸ðµâ¿¡¼­ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °Í°ú ´ë´ÜÈ÷ ºñ½ÁÇÏ°Ô º¸ÀÌ´Â ÀÌÀ¯ÀÌ´Ù.

»ó ¼Ó

»ó¼ÓÀº ´ÙÇü¼ºÀ» ±¸ÇöÇÏ´Â ¸ÞÄ«´ÏÁòÀ¸·Î »ç¿ëµÇ°ï ÇÑ´Ù. ½ÇÁ¦·Î ¸¹Àº OO ¾ð¾î¿¡¼­´Â ±×°ÍÀÌ ´ÙÇü¼ºÀ» ±¸ÇöÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀÌ´Ù. ±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ÀÛµ¿ÇÑ´Ù:

Ŭ·¡½º´Â ºÎ¸ðparentŬ·¡½º ȤÀº ½´ÆÛsuperŬ·¡½º·Î ºÎÅÍ ¼Ó¼º°ú 󸮹æ¹ý ¸ðµÎ¸¦ »ó¼Óinherit¹ÞÀ» ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ¶Ç ´Ù¸¥ Ŭ·¡½º¿Í ´ëºÎºÐÀÇ Á¡¿¡¼­ µ¿ÀÏÇÑ »õ·Î¿î Ŭ·¡½º´Â, Á¸ÀçÇÏ°í Àִ Ŭ·¡½ºÀÇ ¸ðµç ¸Þ½îµå¸¦ ´Ù½Ã ±¸ÇöÇÒ ÇÊ¿ä°¡ ¾ø´Ù´Â ¶æÀ̸ç, ¿ÀÈ÷·Á ±×·¯ÇÑ ´É·ÂÀ» »ó¼Ó¹ÞÀ» ¼ö ÀÖ°í ±×¸®°í³ª¼­ ´Ù¸£°Ô ÇൿÇϱ⸦ ¿øÇÏ´Â °ÍµéÀ» (À§ÀÇ °æ¿ì¿¡¼­ÀÇ ±×¸®±â ¸Þ½îµå¿Í °°ÀÌ) µ¤¾î ¾µ override ¼ö°¡ ÀÖ´Ù´Â ¶æÀÌ´Ù.

´Ù½Ã ÇÑ ¿¹Á¦°¡ ÀÌ°ÍÀ» Àß ¼³¸íÇØÁÙ °ÍÀÌ´Ù. ¿ì¸®´Â ÀºÇà °èÁ¤ÀÇ Å¬·¡½º °èÃþµµ class heirarchy ¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. °Å±â¿¡¼­ ¿ì¸®´Â Çö±ÝÀ» ¿¹Ä¡ÇÏ°í, ÀÜ°í¸¦ ã°í ±×¸®°í öȸÇÒ ¼öµµ ÀÖ´Ù. °èÁ¤Áß ¾î¶² °ÍÀº ÀÌÀÚ¸¦ Á¦°øÇÑ´Ù (ÀÌ°ÍÀº ¸ðµç ÀÜ°í¿¡ ´ëÇÏ¿© °è»êµÈ´Ù°í, ¿ì¸®ÀÇ ¸ñÀûÀ» À§ÇÏ¿© ¿ì¸®´Â °¡Á¤ÇÒ °ÍÀÌ´Ù - ÀºÇàÀÇ ¼¼°è¿¡ Èï¹Ì·Î¿î Çõ½ÅÀÌ´Ù!)±×¸®°í ´Ù¸¥ °ÍÀº öȸ¿¡ ´ëÇÏ¿© ¹ú±ÝÀ» ¸Å±ä´Ù.

BankAccount Ŭ·¡½º

±×°ÍÀÌ ¾î¶°ÇÑÁö »ìÆ캸ÀÚ. ¸ÕÀú ÀºÇà °èÁ¤ÀÇ ¼Ó¼ºµé°ú 󸮹æ¹ýµéÀ» °¡Àå ÀϹÝÀûÀÎ (ȤÀº Ãß»óÀûÀÎ(abstract)) ¼öÁØ¿¡¼­ °í·ÁÇØ º¸ÀÚ.

°¡Àå ÁÁÀº ¹æ¹ýÀº ¸ÕÀú ±× 󸮹æ¹ýµéÀ» °í·ÁÇغ¸°í ÀÌ·¯ÇÑ Ã³¸®¹æ¹ýµéÀ» Áö¿øÇϱâ À§ÇØ ÇÊ¿äÇÑ ¼Ó¼ºµéÀ» Á¦°øÇÏ´Â °ÍÀÌ´Ù. ±×·¡¼­ ÀºÇà °èÁ¤À» À§ÇÏ¿© ¿ì¸®´Â ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù:

  • Deposit cash, - ¿¹±Ý
  • Withdraw cash, - öȸ
  • Check current balance - ÀÜ°í È®ÀÎ
  • Transfer - ´Ù¸¥ °èÁ¤À¸·Î ¼Û±ÝÇϱâ.

    ÀÌ·¯ÇÑ Ã³¸®¹æ¹ýµéÀ» Áö¿øÇϱâ À§ÇÏ¿© ¿ì¸®´Â (Àü¼Û 󸮸¦ À§Çؼ­) ÀºÇà °èÁ¤ ID ¿Í ÇöÀçÀÇ ÀÜ°í°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

    ¿ì¸®´Â ±×°ÍÀ» Áö¿øÇϱâ À§ÇÏ¿© Ŭ·¡½º¸¦ ¸¸µé ¼ö ÀÖ´Ù:

    BalanceError = "Sorry you only have $%6.2f in your account"
    
    class BankAccount:
        def __init__(self, initialAmount):
           self.balance = initialAmount
           print "Account created with balance %5.2f" % self.balance
    
        def deposit(self, amount):
           self.balance = self.balance + amount
    
        def withdraw(self, amount):
           if self.balance >= amount:
              self.balance = self.balance - amount
           else:
              raise BalanceError % self.balance
    
        def checkBalance(self):
           return self.balance
    
        def transfer(self, amount, account):
           try:
              self.withdraw(amount)
              account.deposit(amount)
           except BalanceError:
              print BalanceError
    

    ÁÖÀÇ 1: ¿ì¸®´Â öȸÇϱâ Àü¿¡ ÀÜ°í¸¦ Á¡°ËÇÏ°í ¶ÇÇÑ ¿¡·¯¸¦ ó¸®Çϱâ À§ÇØ ¿¹¿Ü»óȲÀ» »ç¿ëÇÏ´Â °ÍÀ» Á¡°ËÇØ¾ß ÇÑ´Ù. ¹°·Ð BalanceError ¶ó´Â ¿¡·¯ ÇüÀº ¾øÀ¸¹Ç·Î ¿ì¸®´Â ±×·± °ÍÀ» ¸¸µé ÇÊ¿ä°¡ ÀÖ´Ù - ±×°ÍÀº ´ÜÁö ¹®ÀÚ¿­ º¯¼öÀÏ »ÓÀÌ´Ù!

    ÁÖ ÀÇ 2: transfer (Àü¼Û) ¸Þ½îµå´Â BankAccountÀÇ withdraw/deposit ¸â¹öÇÔ¼ö ȤÀº ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© Àü¼ÛÀ» ÇÑ´Ù. ÀÌ°ÍÀº OO ¿¡¼­ ¸Å¿ì ÈçÇÑ ÀÏÀ̸ç Àç±Í¸Þ½Ã¡ self messagingÀ̶ó°í ¾Ë·ÁÁ® ÀÖ´Ù. ±×°ÍÀÌ ¶æÇÏ´Â ¹Ù´Â ÆÄ»ýµÈ Ŭ·¡½º´Â ÀڽŸ¸ÀÇ deposit/withdraw ¹öÁ¯À» ±¸ÇöÇÒ ¼ö ÀÖÁö¸¸ transfer ¸Þ½îµå´Â ¸ðµç °èÁ¤ Çü¿¡ ±×´ë·Î ³²¾Æ ÀÖÀ»¼ö ÀÖ´Ù´Â °ÍÀ» ¶æÇÑ´Ù

    InterestAccount Ŭ·¡½º

    ÀÌÁ¦ ¿ì¸®´Â »ó¼ÓÀ» »ç¿ëÇÏ¿© ¸ðµç ÀÜ°í¿¡ ´ëÇÏ¿© ÀÌÀÚ¸¦ Ãß°¡ÇÏ´Â (¿ì¸®´Â 3%·Î °¡Á¤ÇÒ °ÍÀÌ´Ù) °èÁ¤À» Á¦°øÇÑ´Ù. ±×°ÍÀº deposit ¸Þ½îµå¸¸ »©°í´Â Ç¥ÁØÀûÀÎ BankAccount Ŭ·¡½º¿Í µ¿ÀÏÇÏ´Ù. ±×·¡¼­ ¿ì¸®´Â ½±°Ô ±×°ÍÀ» µ¤¾î ¾´´Ù:

    class InterestAccount(BankAccount):
       def deposit(self, amount):
           BankAccount.deposit(self,amount)
           self.balance = self.balance * 1.03
    
    

    ¹Ù·Î ÀÌ°ÍÀÌ´Ù. ¿ì¸®´Â OOP ÀÇ ÆÄ¿ö¸¦ º¸±â ½ÃÀÛÇÑ´Ù, ¸ðµç ´Ù¸¥ ¸Þ½îµåµéÀº (BankAccount ¸¦ »õ·Î¿î Ŭ·¡½ºÀÇ À̸§µÚ¿¡ °ýÈ£¾È¿¡ Áý¾î ³ÖÀ½À¸·Î½á) BankAccount ·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ¾Ò´Ù. ¶ÇÇÑ depositÀº ±× Äڵ带 º¹»çÇϱ⠺¸´Ù´Â ½´ÆÛŬ·¡½º superclassÀÇ deposit ¸Þ½îµå¸¦ È£ÃâÇÏ¿´´Ù´Â °ÍÀ» ÁÖ¸ñÇ϶ó. ÀÌÁ¦ ¿ì¸®°¡ ±× BankAccountÀÇ depositÀ» º¯°æÇÏ¿© ¾î¶² Á¾·ùÀÇ ¿¡·¯ Á¡°ËºÎ¸¦ Æ÷ÇÔÇÑ´Ù¸é ÇϺÎ- Ŭ·¡½º sub-class´Â ÀÚµ¿ÀûÀ¸·Î ±×·¸°Ô º¯°æÀÌ ¹Ý¿µµÉ °ÍÀÌ´Ù.

    ChargingAccount Ŭ·¡½º

    ÀÌ °èÁ¤Àº ´Ù½Ã À̹ø¿¡´Â 5$¸¦ ¸ðµç öȸ¿¡ ´ëÇÏ¿© û±¸ÇÑ´Ù´Â Á¡¸¸ »©°í´Â Ç¥ÁØÀûÀÎ BankAccount class ¿Í µ¿ÀÏÇÏ´Ù. InterestAccount ¿¡ °üÇÏ¿© ¿ì¸®´Â ÇϳªÀÇ Å¬·¡½º¸¦ ¸¸µé ¼ö Àִµ¥ ±× Ŭ·¡½º´Â BankAccount ·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ°í ±× withdraw(öȸ) ¸Þ½îµå¸¦ º¯°æÇÑ´Ù.

    class ChargingAccount(BankAccount):
        def __init__(self, initialAmount):
            BankAccount.__init__(self, initialAmount)
            self.fee = 3
    
        def withdraw(self, amount):
            BankAccount.withdraw(self, amount+self.fee)
    

    ÁÖ ÀÇ 1: ¿ì¸®´Â ±× ºñ¿ëÀ» ½Çü º¯¼ö instance variable·Î ÀúÀåÇÏ¿©¼­ ¿ì¸®´Â ÇÊ¿äÇÏ´Ù¸é ³ªÁß¿¡ ±×°ÍÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. ¿ì¸®°¡ »ó¼ÓµÈ __init__ ¸Þ½îµå¸¦ ´Ù¸¥ ¸Þ½îµå¿Í ¶È °°ÀÌ È£ÃâÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÁÖ¸ñÇ϶ó.

    ÁÖ ÀÇ 2: ¿ì¸®´Â ´Ü¼øÇÏ°Ô ±× ºñ¿ëÀ» ¿äûµÈ öȸ¿¡ ºÎ°úÇÏ°í BankAccountÀÇ withdraw ¸Þ½îµå¸¦ È£ÃâÇÏ¿© ½ÇÁ¦ÀÏÀ» Çϵµ·Ï Çϱ⸸ ÇÏ¸é µÈ´Ù.

    ÁÖ ÀÇ 3: ¿ì¸®´Â ¿©±â¿¡ ºÎÀÛ¿ëÀ» Çϳª ¼Ò°³ÇÑ´Ù¸é ¿ä±ÝÀÌ ÀÚµ¿ÀûÀ¸·Î Àü¼Û¿¡µµ ¿ª½Ã ºÎ°úµÈ´Ù´Â Á¡Àε¥, ±×·¯³ª ±×°ÍÀº ¾Æ¸¶µµ ¿ì¸®°¡ ¿øÇÑ °ÍÀ̸ç, ±×·¡¼­ ±¦Âú´Ù.

    ¿ì¸®ÀÇ ½Ã½ºÅÛÀ» Á¡°ËÇϱâ

    Àß ÀÛµ¿ÇÏ´ÂÁö Á¡°ËÇϱâ À§ÇÏ¿© (ÆÄÀ̽ã ÇÁ·ÒÇÁÆ®¿¡¼­ ȤÀº º°°³ÀÇ Å×½ºÆ® ÆÄÀÏÀ» ¸¸µêÀ¸·Î½á) ´ÙÀ½ÀÇ ÄÚµå Á¶°¢À» ½ÃÇèÇÏ¿©º¸¶ó.

    from bankaccount import *
    
    # First a standard BankAccount
    a = BankAccount(500)
    b = BankAccount(200)
    a.withdraw(100)
    # a.withdraw(1000)
    a.transfer(100,b)
    print "A = ", a.checkBalance()
    print "B = ", b.checkBalance()
    
    
    # Now an InterestAccount
    c = InterestAccount(1000)
    c.deposit(100)
    print "C = ", c.checkBalance()
    
    
    # Then a ChargingAccount
    d = ChargingAccount(300)
    d.deposit(200)
    print "D = ", d.checkBalance()
    d.withdraw(50)
    print "D = ", d.checkBalance()
    d.transfer(100,a)
    print "A = ", a.checkBalance()
    print "D = ", d.checkBalance()
    
    
    # Finally transer from charging account to the interest one
    # The charging one should charge and the interest one add
    # interest
    print "C = ", c.checkBalance()
    print "D = ", d.checkBalance()
    d.transfer(20,c)
    print "C = ", c.checkBalance()
    print "D = ", d.checkBalance()
    

    ¿ì¸®°¡ a.withdraw(1000)ÀÇ ¶óÀο¡ ÀÖ´Â ÁÖ¼®À» Á¦°ÅÇÏ¸é ¿¹¿Ü»óȲÀÌ ÀÛµ¿Çϴ°¡¸¦ »ìÆ캸¶ó.

    ¹Ù·Î ±×°ÍÀÌ´Ù. ´ë´ÜÈ÷ °£´ÜÇÑ ¿¹Á¦¿¡ ºÒ°úÇÏÁö¸¸ ±×°ÍÀº ¾î¶»°Ô »ó¼ÓÀÌ ±âº»ÀûÀÎ ÇÁ·¹ÀÓ¿öÅ©¸¦ °­·ÂÇÑ »õ·Î¿î »ç¾çÀ¸·Î È®ÀåÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´ÂÁö¸¦ Áï½Ã º¸¿©ÁØ´Ù.

    ¿ì¸®´Â ¾î¶»°Ô ´Ü°èº°·Î ¿¹Á¦¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´ÂÁö ±×¸®°í ¾î¶»°Ô Å×½ºÆ® ÇÁ·Î±×·¥À» ±×°ÍÀÌ Àß ÀÛµ¿ÇÏ´ÂÁö Á¡°ËÇÏ¿© ÇÕÄ¥ ¼ö ÀÖ´ÂÁö¸¦ »ìÆ캸¾Ò´Ù. ¿ì¸®ÀÇ Å×½ºÆ®´Â ¿ÏÀüÇÏÁö´Â ¾Ê´Ù. ¿ì¸®°¡ ¸ðµç °æ¿ì¸¦ ´Ù·çÁö ¾Ê¾Ò°í ¿ì¸®°¡ Æ÷ÇÔ½ÃÄѾßÇÒ ´õ ¸¹Àº Á¡°Ë»çÇ×ÀÌ Àֱ⠶§¹®ÀÌ´Ù. - ¸¸¾à ÇÑ °èÁ¤ÀÌ À½¼öÀÇ °ªÀ¸·Î ¸¸µé¾îÁú ¶§´Â ¾î¶»°Ô ÇؾßÇÏ´ÂÁö¿Í °°Àº....

    ±×·¯³ª ´ÙÇེ·´°Ôµµ ÀÌ°ÍÀº ¿©·¯ºÐ¿¡°Ô °´Ã¼ ÁöÇâÇü ÇÁ·Î±×·¡¹ÖÀÇ ¸ÀÀ» º¸¿© ÁÖ¾ú´Ù. ±×¸®°í ¿©·¯ºÐÀº ¶Ç ´Ù¸¥ ¿Â¶óÀÎ Áöħ¼­µé Áß ¸î¸îÀ¸·Î ÁøÀϺ¸ ÇÒ ¼ö ÀÖ´Ù. ¶Ç´Â ¼­¹Ý¿¡ ¾ð±ÞÇÑ Ã¥µéÁß Çϳª¸¦ ´õ¿í ¸¹Àº Á¤º¸¿Í ¿¹Á¦µéÀ» ã±â À§ÇÏ¿© ÀÐÀ» ¼ö ÀÖ´Ù.


    Previous  Next  Contents


    ¿©·¯ºÐÀÌ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÏ¿© Áú¹® ȤÀº Á¦¾È»çÇ×ÀÌ ÀÖÀ¸¸é ´ÙÀ½ÁÖ¼Ò·Î ³ª¿¡°Ô ÀüÀÚ¸ÞÀÏÀ» º¸³»¶ó: agauld@crosswinds.net