ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.


1. ÄÞÆ÷³ÍÆ® °³¹ß ±âÃÊ

1.1 °³¿ä

ÀÌ ¹®¼­¸¦ Àаí ÀÖ´Â µ¶ÀÚµé Áß¿¡¼­ µ¨ÆÄÀ̰¡ ÄÞÆ÷³ÍÆ®¸¦ ±â¹ÝÀ¸·Î ÇÑ ¾îÇø®ÄÉÀÌ¼Ç °³¹ß ȯ°æÀ̶ó´Â °É ¸ð¸£´Â µ¶ÀÚ´Â ¾øÀ¸¸®¶ó°í »ý°¢ÇÑ´Ù. ÇÏÁö¸¸ ÄÞÆ÷³ÍÆ® ÆÈ·¹Æ®¿¡¼­ »ç¿ëÇÒ ÄÞÆ÷³ÍÆ®¸¦ Æû À§¿¡ ²ø¾î´Ù ³õ°í ÄÞÆ÷³ÍÆ®ÀÇ ¼Ó¼ºÀ» ¼³Á¤Çϰí ÀûÀýÇÏ°Ô ´Ù¸¥ ÄÞÆ÷³ÍÆ®³ª Æû°úÀÇ °ü°è¸¦ ¼³Á¤ÇØ ÁÖ°í À̺¥Æ® Çڵ鷯¿¡ Äڵ带 »ðÀÔÇϱ⸸ ÇÏ¸é ¸ðµç °ÍÀÌ ³¡³¯±î? ¿ì¸®°¡ °³¹ßÇϰíÀÚ ÇÏ´Â ¾îÇø®ÄÉÀ̼ǿ¡¼­ ÇÊ¿äÇÑ ¸ðµç ±â´ÉÀÌ ÀÌ¹Ì ÄÞÆ÷³ÍÆ®·Î ¸¸µé¾îÁ® À־ ¿ì¸®´Â ±×°É ±×³É »ç¿ëÇϱ⸸ ÇÏ¸é µÉ±î? ¾Æ¸¶µµ ½ÇÁ¦ ¾÷¹«¿¡ »ç¿ëÇÏ·Á¸é ¿©·¯ °¡Áö ÀÌÀ¯¿¡¼­ ÄÞÆ÷³ÍÆ®ÀÇ ºÎÁ·ÇÔ ¶Ç´Â ¾î¶² ƯÁ¤ ±â´ÉÀ» ÇÏ´Â ÄÞÆ÷³ÍÆ®°¡ ÀÖ¾úÀ¸¸é ÇÏ´Â »ý°¢À» ÇÊÀÚ°¡ ±×·¨´ø °Íó·³ ÇѹøÂëÀº ÇÏ°Ô µÉ °ÍÀÌ´Ù.
µ¨ÆÄÀ̰¡ ´Ù¸¥ °³¹ß Åø¿¡ ºñÇØ¼­ ¿©·¯ °¡Áö ÀåÁ¡À» °¡Áö°í ÀÖÁö¸¸ ±× Áß¿¡¼­µµ ÁÖ¸ñÇÒ ¸¸ÇÑ °ÍÀº ¹Ù·Î ÄÞÆ÷³ÍÆ®¸¦ ½±°Ô °³¹ßÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. µ¨ÆÄÀÌ·Î ¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÒ ¶§ »ç¿ëÇÏ´Â ±â¼ú¿¡´Ù ¿ÀºêÁ§Æ® ÆÄ½ºÄ®¿¡ ´ëÇÑ Áö½ÄÀ» Á¶±Ý¸¸ ´õÇÏ¸é ¿øÇÏ´Â ±â´ÉÀ» ÇÏ´Â ÄÞÆ÷³ÍÆ®¸¦ ½±°Ô °³¹ßÇÒ ¼ö ÀÖ´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ ActiveX ÄÜÆ®·Ñ°ú ´Þ¸® µ¨ÆÄÀÌ ÄÞÆ÷³ÍÆ®°¡ ÁÖ´Â ÀÌ·± Æí¸®ÇÔÀÌ µ¨ÆÄÀÌ ÇÁ·Î±×·¡¹Ö ¼¼°è¿¡¼­ ÇÏ·ç¿¡µµ ¼ö½Ê °³ÀÇ °ø°³ ȤÀº »ó¿ë ÄÞÆ÷³ÍÆ®µéÀÌ °³¹ßµÇ°í ¹ßÇ¥µÇ´Â ¿øµ¿·ÂÀ̶ó ÇÒ ¼ö ÀÖ°Ú´Ù. ÇÊÀÚ´Â µ¨ÆÄÀ̰¡ ³ª¿À±â Àü ºñÁÖ¾ó º£ÀÌÁ÷À» »ç¿ëÇØ¼­ ¸î¸î ¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÑ ÀûÀÌ Àִµ¥ µ¨ÆÄÀÌ¿Í À¯»çÇÑ °³¹ß ȯ°æÀ» °¡Áø ºñÁÖ¾ó º£ÀÌÁ÷ÀÌ °¡Á³´ø ¸ÍÁ¡Àº ºñÁÖ¾ó º£ÀÌÁ÷¿¡¼­ »ç¿ëÇÒ ÄÜÆ®·ÑÀ» °³¹ßÇÏ·Á¸é »ç¿ëÇϱ⠽¬¿î ºñÁÖ¾ó º£ÀÌÁ÷ÀÌ ¾Æ´Ñ ºñÁÖ¾ó C++À» ÀÌ¿ëÇØ¼­ °³¹ßÇØ¾ß ÇÑ´Ù´Â °ÍÀ̾ú´Ù. ¹°·Ð ºñÁÖ¾ó º£ÀÌÁ÷ 5.0ºÎÅÍ´Â º£ÀÌÁ÷¸¸À¸·Îµµ ÄÜÆ®·ÑÀ» °³¹ßÇÒ ¼ö ÀÖ°Ô µÇ¾úÁö¸¸¡¦.(ºñÁÖ¾ó º£ÀÌÁ÷À̳ª ºñÁÖ¾ó C++µî ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®»çÀÇ °³¹ß µµ±¸µéÀº ÄÞÆ÷³ÍÆ®¶ó´Â ¿ë¾î ´ë½Å ÄÜÆ®·ÑÀ̶ó°í ÇÑ´Ù.)
ÄÞÆ÷³ÍÆ® °³¹ßÀ̳ª ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀ̳ª ¾îÂ÷ÇÇ °°Àº µ¨ÆÄÀÌ °³¹ß ȯ°æÀ» °¡Áö°í °³¹ßÇÏÁö¸¸ ÄÞÆ÷³ÍÆ® °³¹ßÀº ¾îÇø®ÄÉÀÌ¼Ç °³¹ß°ú ºñ±³Çؼ­ ¸¹Àº Â÷ÀÌÁ¡À» °¡Áö°í ÀÖ´Ù.
ù¹øÂ°·Î ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÏ´Â °ÍÀº ºñÁÖ¾óÇÏÁö ¾Ê´Ù(Non-Visual). ÄÞÆ÷³ÍÆ® °³¹ßÀº Æû ±â¹ÝÀÇ °³¹ß ȯ°æÀÌ ¾Æ´Ï°í ÄÚµå ¿¡µðÅÍ·Î ¿ÀºêÁ§Æ® ÆÄ½ºÄ® Äڵ带 Á÷Á¢ ÀÛ¼ºÇÏ´Â °ÍÀÌ ´ëºÎºÐÀÇ ÀÏÀÌ´Ù. µ¨ÆÄÀÌÀÇ ÀåÁ¡ÀÎ Æû µðÀÚÀ̳ʳª ¿ÀºêÁ§Æ® ÀνºÆåÅ͸¦ °ÅÀÇ »ç¿ëÇÏÁö ¾Ê°í ³»Àå µð¹ö°Å³ª ¿ÀºêÁ§Æ® ºê¶ó¿ìÀúµîÀ» ´õ ¸¹ÀÌ »ç¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù.
µÎ¹øÂ°·Î ÄÞÆ÷³ÍÆ®´Â ÀÏ¹Ý ¾îÇø®ÄÉÀ̼ǰú ´Ù¸¥ »ç¿ëÀÚ¸¦ °¡Áö°í ÀÖ´Ù. ¹Ù·Î µ¨ÆÄÀ̸¦ »ç¿ëÇÏ´Â ´Ù¸¥ °³¹ßÀÚµéÀÌ´Ù. À̵éÀº ÄÞÆ÷³ÍÆ®°¡ µ¨ÆÄÀÌ °³¹ßȯ°æ ³»¿¡¼­ ¾î¶² ½ÄÀ¸·Î »ç¿ëµÇ°í ¾î¶»°Ô µ¿ÀÛÇҰŶó´Â °ÍÀ» ¾î´À Á¤µµ ¿¹»óÇϰí ÀÖ´Ù. ¿¹¸¦ µé¾î ÄÞÆ÷³ÍÆ®ÀÇ À̺¥Æ®´Â °ü½ÀÀûÀ¸·Î OnÀ̶ó´Â ±ÛÀÚ·Î ½ÃÀÛÇÑ´Ù. ÀÌ ±ÔÄ¢À» ²À Áöų ÇÊ¿ä´Â ¾ø´Ù. OnClickÀ» MyClickó·³ ¸¸µé¾îµµ ¾Æ¹«·± ¹®Á¦ ¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀÇ °³¹ßÀÚ°¡ ¾Ë°í ÀÖ´Â °ü½ÀÀ» ÁöŰÁö ¾Ê°í ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇß´Ù¸é ±× ÄÞÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ´Â °³¹ßÀÚµéÀº È¥¶õ½º·¯¿ö ÇÏ°Ô µÇ°í °á±¹ ¿Ü¸é´çÇÏÁö ¾ÊÀ»±î »ý°¢µÈ´Ù.
¼¼¹øÂ°·Î ÄÞÆ÷³ÍÆ® °³¹ßÀº ¾îÇø®ÄÉÀÌ¼Ç °³¹ßº¸´Ù ´õ °´Ã¼ÁöÇâÀûÀÌ´Ù. ÄÞÆ÷³ÍÆ® °³¹ßÀº ÀÌ¹Ì Á¸ÀçÇÏ´Â VCL Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó ¹Þ¾Æ¼­ ¿ÀºêÁ§Æ® ÆÄ½ºÄ® Ŭ·¡½º¸¦ ¸¸µå´Â °ÍÀ̱⠶§¹®¿¡ ĸ½¶È­³ª »ó¼Ó¼º, ´ÙÇü¼º, Àç»ç¿ë¼º µîÀÇ °´Ã¼ÁöÇâÀÇ Áß½ÉÀÌ µÇ´Â ÀÌ·ÐÀ» Àß ¾Ë°í ÀÖ¾î¾ß Çϸç À¯¿¬Çϰí È®ÀåÀÌ ¿ëÀÌÇϵµ·Ï ¸¸µé¾î¾ß ÇÑ´Ù.

ÄÞÆ÷³ÍÆ® °³¹ß ½Ã RAD¸¦ Æ÷±âÇØ¾ß ÇÏ´Â ºÒÆíÇÔÀ» ¾ø¾Ö°íÀÚ °³¹ßµÈ µµ±¸µéÀÌ ÀÖ´Ù. ´ëÇ¥ÀûÀ¸·Î Eagle Software»çÀÇ CDK, David PriceÀÇ Component Create, ToolsFactory»çÀÇ Class ExplorerµîÀÌ ÀÖ´Ù.


1.2 ÄÞÆ÷³ÍÆ® °³¹ßÀÚ°¡ ¾Ë¾Æ¾ß ÇÒ OOP

¾Õ¿¡¼­µµ ¾ð±ÞÇßÁö¸¸ ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÑ´Ù´Â °ÍÀº Ŭ·¡½º¸¦ ¸¸µå´Â °ÍÀÌ´Ù. µ¨ÆÄÀÌ´Â ¿¹Àü º¼·£µå ÆÄ½ºÄ® ¹öÀü7ºÎÅÍ µµÀÔÇÑ °´Ã¼ ÁöÇâÀûÀΠƯ¼ºÀ» ´õ¿í Çâ»ó½Ã۰í È®ÀåÇØ¼­ ¸¸µé¾îÁø ¿ÀºêÁ§Æ® ÆÄ½ºÄ®À̶ó´Â ¾ð¾î¸¦ »ç¿ëÇÑ´Ù. ¿ÀºêÁ§Æ® ÆÄ½ºÄ®ÀÇ °´Ã¼ ¸ðµ¨Àº ¿©·¯ C++ ÄÄÆÄÀÏ·¯ÀÇ °´Ã¼ ¸ðµ¨°ú À¯»çÇÏ´Ù. ÇÏÁö¸¸ ¾î¶² ¸é¿¡¼­´Â C++ º¸´Ù ´õ¿í °­·ÂÇÑ °´Ã¼ ¸ðµ¨À» °¡Áö°í ÀÖ´Ù. ¿¹¸¦ µé¾î Ŭ·¡½ºÀÇ ¼ºÁú¿¡ ´ëÇÑ Çü½ÄÀ» ¼±¾ðÇÏ´Â ÇÁ·ÎÆÛƼ °³³äÀº ¾î¶² C++ ÄÄÆÄÀÏ·¯¿¡¼­µµ ã¾Æ º¼ ¼ö ¾ø´Â ±â´ÉÀÌ´Ù. À̹ø Àý¿¡¼­´Â ¿ÀºêÁ§Æ® ÆÄ½ºÄ®ÀÇ °´Ã¼ ÁöÇâÀûÀΠƯ¼º°ú ÄÞÆ÷³ÍÆ® °³¹ß¿¡ ÇÊ¿äÇÑ ¿©·¯°¡Áö °³³ä¿¡ ´ëÇØ ¾Ë¾Æº¸°Ú´Ù.
1.2.1 Á¤º¸ Àº´Ð(Visibility)
°´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹ÖÀÇ Áß¿ä °³³ä ÁßÀÇ Çϳª°¡ Á¤º¸ Àº´ÐÀÌ´Ù. È¥ÀÚ¼­ ¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÑ´Ù¸é Ŭ·¡½º¸¦ ¸¸µç »ç¶÷À̸鼭 µ¿½Ã¿¡ »ç¿ëÇÏ´Â »ç¶÷µµ µÈ´Ù. ÇÏÁö¸¸ ÆÀ ´ÜÀ§ °³¹ß »óȲ¿¡¼­´Â ³»°¡ ¸¸µç Ŭ·¡½º¸¦ ´Ù¸¥ °³¹ßÀÚ°¡ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·² °æ¿ì¿¡ Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â °³¹ßÀÚ¿¡°Ô Ŭ·¡½º¸¦ ±¸ÇöÇÑ ³»ºÎ ¿ø¸®³ª µ¥ÀÌÅ͸¦ ±»ÀÌ ¾Ë·Á ÁÙ ÇÊ¿ä´Â ¾ø´Ù. ´ÜÁö »ç¿ëÇÏ´Â ¹æ¹ý¸¸ Á¦°øÇÏ¸é µÈ´Ù. ¿ÀºêÁ§Æ® ÆÄ½ºÄ®¿¡¼­´Â Á¤º¸ Àº´ÐÀÇ ±íÀ̸¦ Ç¥ÇöÇÏ´Â Private, Protected, Public, Published ³× °¡Áö Á¢±Ù Áö½ÃÀÚ¸¦ °¡Áö°í ÀÖ´Ù. Á¤º¸ Àº´ÐÀÇ ±íÀÌ´Â ±× Ŭ·¡½º°¡ ¾î¶»°Ô »ç¿ëµÉÁö¸¦ °áÁ¤ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦ Äڵ带 »ìÆì º¸ÀÚ. ¾Æ·¡ ¿¹Á¦ ÄÚµå´Â µ¨ÆÄÀÌ ¼Ò½º µð·ºÅ丮¿¡ ÀÖ´Â classes.pas¿Í ComCtrls.pasÀÇ ÀϺκÐÀ» ¹ßÃéÇÑ °ÍÀÌ´Ù.


¸®½ºÆ® 1.1 classes.pas
unit Classes;

type
TCollection = class
TCollectionItem = class(TPersistent)
  private
    FCollection: TCollection;
    FID: Integer;
    function GetIndex: Integer;
    procedure SetCollection(Value: TCollection);
  protected
    procedure Changed(AllItems: Boolean);
    function GetOwner: TPersistent; override;
    function GetDisplayName: string; virtual;
    procedure SetIndex(Value: Integer); virtual;
    procedure SetDisplayName(const Value: string); virtual;
  public
    constructor Create(Collection: TCollection); virtual;
    destructor Destroy; override;
    function GetNamePath: string; override;
    property Collection: TCollection read FCollection write SetCollection;
    property ID: Integer read FID;
    property Index: Integer read GetIndex write SetIndex;
    property DisplayName: string read GetDisplayName write SetDisplayName;
  end;
 
TCollectionItemClass = class of TCollectionItem;

TCollection = class(TPersistent)
  private
    FItemClass: TCollectionItemClass;
    FItems: TList;
    FUpdateCount: Integer;
    FNextID: Integer;
    FPropName: string;
    function GetCount: Integer;
    function GetPropName: string;   
    procedure InsertItem(Item: TCollectionItem);
    procedure RemoveItem(Item: TCollectionItem);
  protected
    property NextID: Integer read FNextID;
    { Design-time editor support }
    function GetAttrCount: Integer; dynamic;
    function GetAttr(Index: Integer): string; dynamic;
    function GetItemAttr(Index, ItemIndex: Integer): string; dynamic;
    procedure Changed;
    function GetItem(Index: Integer): TCollectionItem;
    procedure SetItem(Index: Integer; Value: TCollectionItem);
    procedure SetItemName(Item: TCollectionItem); virtual;
    procedure Update(Item: TCollectionItem); virtual;
    property PropName: string read GetPropName write FPropName;
    property UpdateCount: Integer read FUpdateCount;
  public
    constructor Create(ItemClass: TCollectionItemClass);
    destructor Destroy; override;
    function Add: TCollectionItem;
    procedure Assign(Source: TPersistent); override;
    procedure BeginUpdate; virtual;
    procedure Clear;
    procedure Delete(Index: Integer);
    procedure EndUpdate; virtual;
    function FindItemID(ID: Integer): TCollectionItem;
    function GetNamePath: string; override;
    function Insert(Index: Integer): TCollectionItem;
    property Count: Integer read GetCount;
    property ItemClass: TCollectionItemClass read FItemClass;
    property Items[Index: Integer]: TCollectionItem read GetItem write SetItem;
  end;


¸®½ºÆ® 1.2 comctrls.pas
unit ComCtrls;

type
TStatusPanel = class(TCollectionItem)
  private
    FText: string;
    FWidth: Integer;
    FAlignment: TAlignment;
    FBevel: TStatusPanelBevel;
    FBiDiMode: TBiDiMode;
    FParentBiDiMode: Boolean;
    FStyle: TStatusPanelStyle;
    FUpdateNeeded: Boolean;
    procedure SetAlignment(Value: TAlignment);
    procedure SetBevel(Value: TStatusPanelBevel);
    procedure SetBiDiMode(Value: TBiDiMode);
    procedure SetParentBiDiMode(Value: Boolean);
    procedure SetStyle(Value: TStatusPanelStyle);
    procedure SetText(const Value: string);
    procedure SetWidth(Value: Integer);
    function IsBiDiModeStored: Boolean;
  protected
    function GetDisplayName: string; override;
  public
    constructor Create(Collection: TCollection); override;
    procedure Assign(Source: TPersistent); override;
    procedure ParentBiDiModeChanged;
    function UseRightToLeftAlignment: Boolean;
    function UseRightToLeftReading: Boolean;
  published
    property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
    property Bevel: TStatusPanelBevel read FBevel write SetBevel default pbLowered;
    property BiDiMode: TBiDiMode read FBiDiMode write SetBiDiMode stored IsBiDiModeStored;
    property ParentBiDiMode: Boolean read FParentBiDiMode write SetParentBiDiMode default True;
    property Style: TStatusPanelStyle read FStyle write SetStyle default psText;
    property Text: string read FText write SetText;
    property Width: Integer read FWidth write SetWidth;
  end;


Á¦ÇÑÀÌ ¾øÀ¸¸ç ¾îµð¿¡¼­µç Ŭ·¡½ºÀÇ ¸â¹ö¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â Áö½ÃÀÚ°¡ PublicÀÌ´Ù. Public ¿µ¿ª¿¡ ¼±¾ðµÈ ¸â¹ö´Â Ŭ·¡½º°¡ ¼±¾ðµÈ À¯´Ö¿¡¼­´Â ¹°·ÐÀ̰í ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ À¯´Ö¿¡¼­µµ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¸®½ºÆ® 6.1¿¡¼­ TCollection Ŭ·¡½ºÀÇ GetNamePath ¸Þ¼Òµå´Â ¸®½ºÆ® 6.2ÀÇ ComCtrls.pas¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Puiblic ¿µ¿ªÀº ½ÇÇà ½Ã¿¡ ¸ðµç ÄÚµåµéÀÌ ÀÌ¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ ½ÇÇà ½Ã Å¬·¡½ºÀÇ ÀÎÅÍÆäÀ̽º¸¦ ³ªÅ¸³½´Ù.
°¡Àå Á¦ÇÑÀûÀÎ Áö½ÃÀÚ´Â PrivateÀ̸ç Private ¸â¹ö´Â Ŭ·¡½º¸¦ ¼±¾ðÇÑ À¯´Ö¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. TCollectionItemÀÇ FID¶ó´Â ¸â¹ö º¯¼ö´Â classes.pas À¯´Ö ³»¿¡¼­¸¸ Á¢±ÙÇÒ ¼ö ÀÖ°í TStatusPanelÀÌ ¼±¾ðµÈ ComCtrls.pas¿¡¼­´Â Á¢±ÙÇÒ ¼ö ¾ø´Ù. ÇÏÁö¸¸ TCollection Ŭ·¡½º¿¡¼­´Â ÀÌ º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. Áï °°Àº À¯´Ö ³»¿¡¼­´Â ºñ·Ï Private·Î ¼±¾ðµÇ¾î ÀÖ´Ù ÇÒÁö¶óµµ Public°ú °°Àº Á¢±Ù ±ÇÇÑÀ» °¡Áø´Ù.(ÀÌ·± Ư¡Àº ´Ù¸¥ °´Ã¼ ÁöÇâ ¾ð¾î¿Í ¾à°£ ´Ù¸£´Ù°í ÇÒ ¼ö ÀÖ´Ù.)
Protected ¸â¹ö¿¡ ´ëÇÑ Á¢±Ù ±ÇÇÑÀº Private¿Í PublicÀÇ »çÀÌ¿¡ ÀÖ´Ù. °°Àº À¯´Ö ³»¿¡¼­´Â Private, Public°ú °°Àº Á¢±Ù ±ÇÇÑÀ» °¡ÁöÁö¸¸ ´Ù¸¥ À¯´Ö¿¡¼­´Â ÇØ´ç Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó ¹ÞÀº Ŭ·¡½º¸¸ÀÌ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î TCollectionItemÀÇ GetOwner, GetDisplayName, SetIndex, SetDisplayName °°Àº ¸â¹ö ÇÔ¼ö´Â TStatusPanel°ú °°ÀÌ TCollectionItem¿¡¼­ »ó¼Ó ¹ÞÀº Ŭ·¡½º¸¸ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¸¶Áö¸·À¸·Î Published Áö½ÃÀÚ´Â Public°ú °°Àº Á¢±Ù ±ÇÇÑÀ» °¡ÁöÁö¸¸ Á» ´õ Ưº°ÇÑ ¿ëµµ¸¦ °¡Áö°í ÀÖÀ¸¸ç ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ÇÁ·ÎÆÛƼ¸¦ ¼±¾ðÇϱâ À§ÇØ »ç¿ëÇÑ´Ù. PublicÀº ½ÇÇà ½Ã¿¡ Ŭ·¡½º¿¡ °üÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖÁö¸¸ Published ¸â¹ö´Â ¼³°è ½Ã Ŭ·¡½º Á¤º¸¸¦ ³ªÅ¸³½´Ù. ¶ÇÇÑ Published¿¡ ¼±¾ðµÈ ÇÁ·ÎÆÛƼ´Â µ¨ÆÄÀÌ Æû(*.dfm) ÆÄÀÏ·Î ÀúÀåµÉ ¼ö ÀÖ´Ù.
Ŭ·¡½º Çü ¼±¾ð ¹Ù·Î ¾Æ·¡¿¡ Á¢±Ù Áö½ÃÀÚ ¾øÀÌ ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇϸé ÀÌ ¸â¹ö º¯¼ö´Â ±âº»ÀûÀ¸·Î Public ±ÇÇÑÀ» °¡Áø´Ù. ÇÏÁö¸¸ {$M+} ÄÄÆÄÀÏ·¯ Áö½ÃÀÚ¸¦ ¸ÕÀú ¼±¾ðÇϸé Published ±ÇÇÑÀ» °¡Áö°Ô µÈ´Ù. ¾Æ·¡ ¿¹Á¦ Äڵ带 º¸¸é


type
  TExample1 = class
    Field1 : integer;  // Public
  public
    .....
  end;

{$M+}
  TExample2 = class
    Field2 : integer;  // Published
  public
    ....
  end;
{$M-}

  TExample3 = class
    Field3 : integer;   // Public
  public
    ....
  end;


Field1°ú Field3´Â Public ¸â¹öÀÌÁö¸¸ Field2´Â Published ¸â¹ö·Î ¼±¾ðµÈ´Ù.


°¡±ÞÀûÀ̸é È¥¶õÀ» ¸·±â À§ÇØ Á¢±Ù Áö½ÃÀÚ¸¦ ½á ÁÖ´Â °Ô ÁÁ´Ù.


1.2.2. »ý¼ºÀÚ(Constructor)
¿ÀºêÁ§Æ® ÆÄ½ºÄ®¿¡¼­ Ŭ·¡½º´Â »ý¼ºÀÚ¶ó°í Çϴ Ưº°ÇÑ ¸Þ¼Òµå¸¦ °¡Áø´Ù. »ý¼ºÀڴ Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇϱâ À§Çؼ­ »ç¿ëµÇ¸ç Ŭ·¡½º¸¦ À§ÇÑ ¸Þ¸ð¸®¸¦ Èü¿¡¼­ ÇÒ´çÇÏ°í ¸ðµç ¸â¹ö º¯¼ö¸¦ 0À¸·Î ÃʱâÈ­ÇÏ°í ±âŸ ÃʱâÈ­ ÀÛ¾÷À» ¼öÇàÇÑ´Ù.
¾Æ·¡ ¿¹Á¦ Äڵ忡¼­ TSalary´Â Create¶ó´Â »ý¼ºÀÚ¿Í CreateWidthAmount¶ó´Â »ý¼ºÀÚ¸¦ ¼±¾ðÇß´Ù. »ý¼ºÀÚÀÇ À̸§Àº ²À Create°¡ ¾Æ´Ï¾îµµ »ó°ü ¾øÁö¸¸ ¹Ýµå½Ã Constructor¶ó´Â Ű¿öµå·Î ¼±¾ðµÇ¾î¾ß ÇÑ´Ù. Constructor Ű¿öµå°¡ ´Ù¸¥ ¸Þ¼Òµå¿Í »ý¼ºÀÚ¸¦ ±¸º°ÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀÓÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. »ý¼ºÀÚ¸¦ ¼±¾ðÇØ ÁÖÁö ¾ÊÀ¸¸é Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µé ¶§ ºÎ¸ð Ŭ·¡½ºÀÇ »ý¼ºÀÚ¸¦ »ç¿ëÇÑ´Ù. µ¨ÆÄÀÌ¿¡ ÀÖ´Â ¸ðµç Ŭ·¡½ºÀÇ Á¶»óÀÎ TObject´Â ±âº» »ý¼ºÀÚÀÎ Create¿Í ¼Ò¸êÀÚ Destroy¸¦ Á¤ÀÇÇØ ³õ¾Ò´Ù. »ý¼ºÀڴ Ưº°ÇÑ ÇüÅÂÀÇ ¸Þ¼ÒµåÀ̱⠶§¹®¿¡ ¹Ýȯ °ªÀ» °¡Áú ¼ö ¾ø´Ù. ±×¸®°í Ŭ·¡½º´Â ¾Æ·¡ ¿¹Á¦ ÄÚµåó·³ ¿©·¯ °³ÀÇ »ý¼ºÀÚ¸¦ °¡Áú ¼ö ÀÖ´Ù. »ý¼ºÀÚÀÇ À̸§À» ´Ù¸£°Ô ¼±¾ðÇϰųª µ¨ÆÄÀÌ 4¿¡¼­ óÀ½ µµÀÔµÈ ¸Þ¼Òµå ¿À¹ö·ÎµùÀ» ÅëÇØ¼­ ¿©·¯ °³ÀÇ »ý¼ºÀÚ¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. µ¨ÆÄÀÌ¿¡¼­´Â º¸Åë °ü½ÀÀûÀ¸·Î ¿©·¯ °³ÀÇ »ý¼ºÀÚ¸¦ ¼±¾ðÇÒ ¶§ ´Ù¸¥ À̸§À» °¡Áöµµ·Ï ÇÏÁö¸¸ º¼·£µåÀÇ ¶Ç ´Ù¸¥ RAD °³¹ß ÅøÀÎ C++ Builder¿ÍÀÇ È£È¯¼ºÀ» »ý°¢ÇÑ´Ù¸é ¸Þ¼Òµå ¿À¹ö·ÎµùÀ» ÅëÇØ¼­ ±¸ÇöÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇϸé C++¿¡¼­´Â »ý¼ºÀÚ°¡ Ưº°ÇÑ À̸§À» °¡Áú ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.
1.2.3. ¼Ò¸êÀÚ(Destructor)
¼Ò¸êÀÚ´Â »ý¼ºÀÚÀÇ ¹Ý´ë °³³äÀÌ´Ù. Áï Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ ¼Ò¸êµÉ ¶§ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. ¼Ò¸êÀÚ´Â ÀνºÅϽº¸¦ À§ÇØ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ°í ±âŸ ÃÖÁ¾ ÀÛ¾÷(µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÇØÁ¦ µî¡¦)À» ¼öÇàÇÑ´Ù. ¼Ò¸êÀÚµµ »ý¼ºÀÚ¿Í ¸¶Âù°¡Áö·Î ¹Ýȯ°ªÀ» °¡Áú ¼ö ¾øÀ¸¸ç º°µµ·Î ¼±¾ðÇØ ÁÖÁö ¾ÊÀ¸¸é ºÎ¸ð Ŭ·¡½ºÀÇ ¼Ò¸êÀÚ¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. »ý¼ºÀÚ¿Í ´Þ¸® ¼Ò¸êÀÚ´Â Destroy¶ó´Â À̸§À» °¡Á®¾ß ÇÑ´Ù. ¿Ö³ÄÇÏ¸é º¸Åë Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸Þ¸ð¸®¿¡¼­ Á¦°ÅÇÒ ¶§´Â Free ¸Þ¼Òµå¸¦ È£ÃâÇϴµ¥ Free ¸Þ¼Òµå´Â ÀνºÅϽºÀÇ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϱâ Àü¿¡ TObject Ŭ·¡½ºÀÇ Destroy ¸Þ¼Òµå¸¦ È£ÃâÇϵµ·Ï µÇ¾î ÀÖ´Ù. ¿¹Á¦ Äڵ忡¼­ º¸ÀÌÁö´Â ¾ÊÁö¸¸ ¼Ò¸êÀÚ´Â Free ¸Þ¼Òµå¿¡¼­ Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ ½ÇÁ¦·Î »ý¼ºµÇ¾ú´ÂÁö °Ë»çÇϰí Destroy¸¦ È£ÃâÇØ ÁØ´Ù. Á÷Á¢ Destroy ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â °Íº¸´Ù Free ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â°Ô ´õ¿í ¾ÈÀüÇÏ´Ù. ¸®½ºÆ® 6.3¿¡¼­ »ý¼ºÀÚ¿Í ¼Ò¸êÀÚ°¡ ½ÇÁ¦·Î ¾î¶»°Ô ¾²ÀÌ´ÂÁö º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


¸®½ºÆ® 1.3 »ý¼ºÀÚ¿Í ¼Ò¸êÀÚ
program Salary;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSalary = class
  public
    Amount : integer;
    constructor Create;
    constructor CreateWithAmount(AAmount : integer);
  end;

constructor TSalary.Create;
begin
  inherited Create;
  // ±âº»ÀûÀ¸·Î ¸ðµç º¯¼ö´Â 0À¸·Î ÃʱâÈ­ µÇ±â ¶§¹®¿¡ ÀÌ ·çƾÀº ±»ÀÌ ½á ÁÖÁö ¾Ê¾Æµµ µÈ´Ù.
  Amount := 0;
end;

constructor TSalary.CreateWithAmount(AAmount : integer);
begin
  inherited Create;
  Amount := AAmount;
end;

var
  Temp1, Temp2 : TSalary;
  TempStr : string;
begin
  Temp1 := TSalary.Create;
  Temp2 := TSalary.CreateWithAmount(1000000);
  try
    writeln('Temp1ÀÇ ±Þ¿©´Â ', IntToStr(Temp1.Amount));
    writeln('Temp2ÀÇ ±Þ¿©´Â ', IntToStr(Temp2.Amount));
  finally
    Temp1.Free;
    Temp2.Free;
  end;
  WriteLn('Á¾·áÇÏ·Á¸é ENTER ۸¦ ´©¸£¼¼¿ä!!');
  ReadLn(TempStr);
end. 




ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ »ý¼ºÀÚ¿Í ¼Ò¸êÀÚ´Â ÁÖÀÇÇØ¼­ »ç¿ëÇØ¾ß ÇÑ´Ù. ÄÞÆ÷³ÍÆ®ÀÇ »ý¼º°ú ¼Ò¸êÀ» À߸øÇÏ¸é µ¨ÆÄÀ̰¡ Á¾·áµÇ°Å³ª À©µµ ÇÁ·Î±×·¡¸Ó°¡ °¡Àå ½È¾îÇÏ´Â ºí·ç ½ºÅ©¸°À̳ª Access ViolationµîÀÇ ¿¡·¯¸¦ ¼öµµ ¾øÀÌ ¸¸³¯ ¼ö ÀÖÀ½À» ¸í½ÉÇØ¾ß ÇÑ´Ù.


1.2.4. ¼±Çà Ŭ·¡½º ¼±¾ð
Á¾Á¾ µÎ °³ÀÇ Å¬·¡½º¸¦ ¼±¾ðÇÒ ¶§ ¼­·Î°¡ ´Ù¸¥ Ŭ·¡½º¸¦ ÂüÁ¶ÇÏ°Ô µÇ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ÀÌ·± °æ¿ì C++À̳ª ¿¹Àü º¼·£µå ÆÄ½ºÄ®¿¡¼­´Â Ŭ·¡½ºÀÇ Æ÷ÀÎÅ͸¦ ¸ÕÀú ¼±¾ðÇϰí Ŭ·¡½º¸¦ ¼±¾ðÇÒ ¶§ À§¿¡¼­ ¼±¾ðÇÑ Æ÷ÀÎÅÍ·Î ¸â¹ö º¯¼ö¸¦ Á¤ÀÇÇØ¼­ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸ µ¨ÆÄÀÌ¿¡¼­´Â ÀÌ¿Í ´Þ¸® Ŭ·¡½ºÀÇ À̸§¸¸ ¸ÕÀú Á¤ÀÇÇØ ÁÖ¸é ´Ù¸¥ Ŭ·¡½º¿¡¼­ ÀÌ Å¬·¡½º¿¡ ´ëÇØ ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï ¼±Çà Ŭ·¡½º ¼±¾ðÀ̶ó´Â °³³äÀ» µµÀÔÇß´Ù. ¸®½ºÆ® 6.1À» ´Ù½Ã º¸¸é TCollectionÀÌ Å¬·¡½º¶ó´Â °Í¸¸ ¸ÕÀú ¼±¾ðÇϰí TCollectionItem¿¡¼­ ¾ÆÁ÷ ¸ðµÎ ¼±¾ðµÇÁö ¾ÊÀº TCollection¿¡ ´ëÇÑ ÂüÁ¶¸¦ Çϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. TCollectionItemµµ ¸¶Âù°¡Áö·Î TCollectionÀ» ÂüÁ¶Çϰí ÀÖ´Ù. µÎ Ŭ·¡½º ¸ðµÎ ¼­·Î¸¦ ÂüÁ¶Çϱ⠶§¹®¿¡ µÑ Áß TCollectionÀ» ¸ÕÀú ¼±Çà ¼±¾ðÇϰí TCollectionItemÀº ¼ø¼­´ë·Î ¼±¾ðÀ» ÇØ ³õ¾Ò´Ù.
1.2.5. ¸Þ¼Òµå ¹ÙÀεù
OOPÀÇ Æ¯¼º Áß ´ÙÇü¼º(Polymorphism)°ú »ó¼Ó¼º(Inheritance)¸¦ ÀÌ¿ëÇÏ¸é °´Ã¼ÀÇ µ¿ÀÛ(¸Þ¼Òµå)¸¦ ÀϹÝÈ­ ÇÑ Ãß»ó Ŭ·¡½º¸¦ ¸¸µé°í ÀÌ Å¬·¡½º¸¦ ºÎ¸ð·Î ÇÏ´Â ÆÄ»ý Ŭ·¡½º¿¡¼­ °´Ã¼ÀÇ µ¿ÀÛÀ» ½ÇÁ¦·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. Áï ±â´ÉÀûÀ¸·Î´Â °°Àº µ¿ÀÛÀ» ÇÏÁö¸¸ ±× µ¿ÀÛÀ» ¼öÇàÇÏ´Â ½ÇÁ¦ ¹æ¹ýÀº ´Ù¸£°Ô ±¸ÇöÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ÀÚµ¿Â÷ÀÇ ÇÚµéÀ» »ý°¢ÇØ º¸ÀÚ. ÀÚµ¿Â÷ÀÇ ÇÚµéÀº ÀÚµ¿Â÷ÀÇ ÁøÇà ¹æÇâÀ» º¯°æÇÏ´Â ±â´ÉÀ» °¡Áø´Ù. ÇÏÁö¸¸ ÆÄ¿ö ÇÚµé°ú ¼öµ¿ ÇÚµéÀº °°Àº ±â´ÉÀ» ÇÏÁö¸¸ ´Ù¸¥ ¹æ¹ýÀ¸·Î ±× ±â´ÉÀ» ¼öÇàÇÑ´Ù. ¿îÀüÀÚ´Â ÇÚµéÀÌ ³»ºÎÀûÀ¸·Î ¾î¶»°Ô µ¿ÀÛÇÏ´Â Áö¸¦ ¸ô¶óµµ ÇÚµéÀ» µ¹¸®¸é ÀÚµ¿Â÷ÀÇ ÁøÇà ¹æÇâÀÌ º¯°æµÈ´Ù´Â °Í¸¸ ¾Ë°í ÀÖÀ¸¸é µÈ´Ù.
´ÙÇü¼ºÀ» ¾ê±âÇÒ ¶§ »©³õÀ» ¼ö ¾ø´Â °ÍÀÌ ¹Ù·Î °´Ã¼ÀÇ ±¸Çö ¹æ¹ýÀÌ °áÁ¤µÇ´Â ½Ã±âÀÌ´Ù. ÄÄÆÄÀÏÇÒ ¶§ °áÁ¤µÇ´Â °ÍÀ» Á¤Àû ¹ÙÀεù(Static Binding, Early Binding)À̶ó ÇÏ°í ½ÇÇà ½Ã¿¡ °áÁ¤µÇ´Â °ÍÀ» µ¿Àû ¹ÙÀεù(Dynamic Binding, Late Binding)À̶ó ÇÑ´Ù. Á¤Àû ¹ÙÀεùÀº ÄÄÆÄÀϽà ¸ðµç °ÍÀÌ °áÁ¤µÇ±â ¶§¹®¿¡ ÃÖÀûÈ­ÇÒ ¼ö ÀÖÀ¸¸ç ¼öÇà ¼Óµµ°¡ ºü¸£´Ù. µ¿Àû ¹ÙÀεùÀº °´Ã¼ÀÇ À¯¿¬¼ºÀ̳ª Ãß»óÈ­ µîÀÇ ÀåÁ¡ÀÌ ÀÖÁö¸¸ ½ÇÇà ¼Óµµ°¡ ´Ù¼Ò ´À·ÁÁø´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
1.2.6. Á¤Àû ¸Þ¼Òµå(Static Methods)
Ŭ·¡½ºÀÇ ¸ðµç ¸Þ¼Òµå´Â Ưº°ÇÏ°Ô ÁöÁ¤ÇÏÁö ¾Ê´Â ÇÑ Á¤Àû ¸Þ¼Òµå·Î ¼±¾ðµÈ´Ù. ÄÄÆÄÀÏ·¯´Â ÄÄÆÄÀÏ ½Ã¿¡ ¸Þ¼ÒµåÀÇ ½ÇÁ¦ ¾îµå·¹½º¸¦ °áÁ¤Çϰí Á÷Á¢ ¸Þ¼Òµå¸¦ ¿¬°áÇØ Áֱ⠶§¹®¿¡ ºü¸£°Ô µ¿ÀÛÇÑ´Ù. ºÎ¸ð Ŭ·¡½º¿¡¼­ ¼±¾ðµÈ Á¤Àû ¸Þ¼Òµå¿Í ÆÄ»ýµÈ ÀÚ¼Õ Å¬·¡½º¿¡¼­ »ç¿ëÇÏ´Â ±× ¸Þ¼Òµå´Â ºÎ¸ð Ŭ·¡½º¿Í ½ÇÁ¦·Î ¶È °°Àº ¸Þ¸ð¸® ÁÖ¼Ò¸¦ °¡Áö°Ô µÇ¸ç ÇϳªÀÇ ¸Þ¼Òµå¸¦ ºÎ¸ð Ŭ·¡½º¿Í °øÀ¯ÇÏ°Ô µÈ´Ù. ¸¸¾à¿¡ ÀÚ¼Õ Å¬·¡½º¿¡¼­ ºÎ¸ð Ŭ·¡½ºÀÇ Á¤Àû ¸Þ¼Òµå¿Í °°Àº À̸§À» °¡Áö´Â ¸Þ¼Òµå¸¦ ¼±¾ðÇÏ°Ô µÇ¸é ºÎ¸ð Ŭ·¡½ºÀÇ Á¤Àû ¸Þ¼Òµå´Â ÀÚ¼Õ Å¬·¡½º¿¡¼­ »õ·Î¿î ¸Þ¼Òµå·Î ´ëüµÈ´Ù.
1.2.7. °¡»ó ¸Þ¼Òµå(Virtual Methods)
°¡»ó ¸Þ¼Òµå´Â Á¤Àû ¸Þ¼Òµå¿¡ ºñÇØ ´Ù¼Ò º¹ÀâÇÏÁö¸¸ È®À强ÀÌ ÁÁÀº ÀåÁ¡À» °¡Áø´Ù. °¡»ó ¸Þ¼Òµå´Â ÀÚ¼Õ Å¬·¡½º¿¡¼­ ÀçÁ¤ÀÇµÉ ¼ö ÀÖÀ¸¸ç ¸Þ¼ÒµåÀÇ ÁÖ¼Ò´Â ÄÄÆÄÀÏÇÒ ¶§ °áÁ¤µÇÁö ¾Ê°í µ¿ÀûÀ¸·Î ¹ÙÀεùµÇ±â ¶§¹®¿¡ ½ÇÇàÇÒ ¶§ °áÁ¤µÈ´Ù. µ¨ÆÄÀÌ´Â µÎ°¡Áö °¡»ó ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Ù. °¡»ó ¸Þ¼Òµå¸¦ ¼±¾ðÇÏ·Á¸é ¸Þ¼Òµå ¼±¾ð¹® µÚ¿¡ virtual Áö½ÃÀÚ³ª dynamic Áö½ÃÀÚ¸¦ Ãß°¡ÇØ ÁÖ¸é µÈ´Ù. virtual Áö½ÃÀÚ¿Í dynamic Áö½ÃÀÚ´Â ¸Þ¼Òµå Å×À̺íÀ» °ü¸®ÇÏ´Â ¹æ¹ýÀÌ ´Ù¸£´Ù. virtual Áö½ÃÀÚ´Â °´Ã¼ÀÇ ¸ðµç °¡»ó ¸Þ¼ÒµåÀÇ ÁÖ¼Ò¸¦ º¸Á¸ÇÏ´Â °¡»ó ¸Þ¼Òµå Å×À̺í(Virtual Method Table, VMT)¿¡ »õ·Î¿î ¿£Æ®¸®¸¦ Çϳª »ý¼ºÇÑ´Ù. ÀÚ¼Õ Å¬·¡½º´Â ºÎ¸ð Ŭ·¡½ºÀÇ ¸ðµç °¡»ó ¸Þ¼Òµå ÁÖ¼Ò¿Í ÀÚ±â ÀÚ½ÅÀÇ °¡»ó ¸Þ¼Òµå¿¡ ´ëÇÑ ÁÖ¼Ò¸¦ °°ÀÌ º¸Á¸ÇÏ´Â ÀڽŸ¸ÀÇ °¡»ó ¸Þ¼Òµå Å×À̺íÀ» °¡Áø´Ù. dynamic Áö½ÃÀÚ´Â °¡»ó ¸Þ¼Òµå Å×À̺í°ú º°µµ·Î µ¿Àû ¸Þ¼Òµå Å×À̺í(Dynamic Method Table, DMT)¿¡ °´Ã¼¿¡ »õ·Ó°Ô Ãß°¡µÇ°Å³ª ÀçÁ¤ÀÇµÈ °¡»ó ¸Þ¼Òµå¿¡ ´ëÇÑ ÁÖ¼Ò¸¸ °ü¸®ÇÑ´Ù. virtual ¸Þ¼Òµå´Â °´Ã¼°¡ Â÷ÁöÇÏ´Â ¸Þ¸ð¸®°¡ dynamic ¸Þ¼Òµå¿¡ ºñÇØ Å©Áö¸¸ ¼Óµµ°¡ ºü¸£¸ç dynamic ¸Þ¼Òµå´Â È¿À²ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÒ ¼ö ÀÖÁö¸¸ ÁÖ¼Ò¸¦ ã±â À§ÇØ Å¬·¡½º °èÃþµµ¸¦ °Å½½·¯ ¿Ã¶ó °¡¸é¼­ ã¾Æ¾ß Çϱ⠶§¹®¿¡ ¼º´ÉÀÌ ¶³¾îÁø´Ù. ¸Þ¼Òµå°¡ ÀÚÁÖ È£ÃâµÇ°Å³ª ³ôÀº ¼º´ÉÀ» ¿ä±¸ÇÑ´Ù¸é virtual ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â °ÍÀÌ È¿°úÀûÀÏ °ÍÀÌ´Ù. ºÎ¸ð Ŭ·¡½ºÀÇ °¡»ó ¸Þ¼Òµå¸¦ ÀçÁ¤ÀÇ(Redefine)ÇÏ·Á¸é override Áö½ÃÀÚ¸¦ »ç¿ëÇÑ´Ù. ¾Æ·¡ ¿¹Á¦ Äڵ带 »ìÆì º¸ÀÚ. ¿¹Á¦¿¡¼­Ã³·³ override Áö½ÃÀÚ´Â °¡»ó ¸Þ¼Òµå°¡ virtual À̵ç dynamic ÀÌµç °ü°è¾øÀÌ »ç¿ëÇÑ´Ù. BrokenProcÀÇ °æ¿ì¿¡´Â ÀÚ¼Õ Å¬·¡½º¿¡¼­ ´Ù½Ã virtual·Î ¼±¾ðÇ߱⠶§¹®¿¡ ¾Æ·¡ ±×¸²°ú °°ÀÌ ºÎ¸ð Ŭ·¡½ºÀÇ BrokenProc¸¸ È£ÃâµÈ´Ù.

¸®½ºÆ® 1.4 °¡»ó ¸Þ¼Òµå
program VMethods;

{$APPTYPE CONSOLE}

uses
  classes;

type

  TParent = class
    procedure VirtualProc; virtual;
    procedure DynamicProc; dynamic;
    procedure BrokenProc; virtual;
  end;

  TDescendant = class(TParent)
    procedure VirtualProc; override;
    procedure DynamicProc; override;
    procedure BrokenProc; virtual;
  end;

  procedure TParent.VirtualProc;
  begin
    writeln('TParent.VirtualProc');
  end;

  procedure TParent.DynamicProc;
  begin
    writeln('TParent.DynamicProc');
  end;

  procedure TParent.BrokenProc;
  begin
    writeln('TParent.BrokenProc');
  end;

  procedure TDescendant.VirtualProc;
  begin
    inherited VirtualProc;
    writeln('TDescendant.VirtualProc');
  end;

  procedure TDescendant.DynamicProc;
  begin
    inherited DynamicProc;
    writeln('TDescendant.DynamicProc');
  end;

  procedure TDescendant.BrokenProc;
  begin
    inherited BrokenProc;
    writeln('TDescendant.BrokenProc');
  end;

  procedure TestVirtProc(Obj : TParent);
  begin
    Obj.VirtualProc;
  end;

  procedure TestDynProc(Obj : TParent);
  begin
    Obj.DynamicProc;
  end;

  procedure TestBrokenProc(Obj : TParent);
  begin
    Obj.BrokenProc;
  end;
var
  TempObj : TDescendant;
  TempStr : string;
begin
  TempObj := TDescendant.Create;
  try
    writeln('Virtual ¸Þ¼Òµå');
    TestVirtProc(TempObj);
    writeln('Dynamic ¸Þ¼Òµå');
    TestDynProc(TempObj);
    writeln('¸Þ¼Òµå ¿¬°áÀÌ ²÷¾îÁø´Ù');
    TestBrokenProc(TempObj);
  finally
    TempObj.Free;
  end;
  WriteLn('Á¾·áÇÏ·Á¸é ENTER ۸¦ ´©¸£¼¼¿ä!!');
  ReadLn(TempStr);
end.




±×¸² 1-1 °¡»ó ¸Þ¼Òµå ¿¹Á¦ ½ÇÇà È­¸é


1.2.8. Ãß»ó ¸Þ¼Òµå(Abstract Methods)
Ŭ·¡½ºÀÇ ¸Þ¼Òµå¸¦ ¼±¾ðÇÒ ¶§ virtual, dynamic Áö½ÃÀÚ¿Í ÇÔ²² abstract Áö½ÃÀÚ¸¦ »ç¿ëÇϸé(Ãß»ó ¸Þ¼Òµå, C++¿¡¼­´Â ¼ø¼ö °¡»ó ÇÔ¼ö¶ó ÇÑ´Ù) ±× Ŭ·¡½º´Â Ãß»ó Ŭ·¡½º°¡ µÈ´Ù. Ãß»ó Ŭ·¡½º´Â ¸» ±×´ë·Î °´Ã¼¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ¾Æ´Ï°í °³³ä¸¸ Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. »ç°¢Çü, »ï°¢Çü, ¿ø µîÀÇ °øÅëÁ¡Àº µµÇüÀ̶ó´Â °³³äÀ̶ó°í º¼ ¼ö ÀÖ´Ù. ±×·¡¼­ ÀÌ µµÇüÀ̶ó´Â °³³äÀ» Ŭ·¡½º·Î ¸¸µé°í »ç°¢Çü, »ï°¢Çü, ¿ø µîÀº µµÇü Ŭ·¡½ºÀÇ ÀÚ¼Õ Å¬·¡½º·Î ¼±¾ðÇÏ°Ô µÈ´Ù. Ãß»ó Ŭ·¡½º·ÎºÎÅÍ Á÷Á¢ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö´Â ¾ø´Ù. ¹Ýµå½Ã ºÎ¸ð Ŭ·¡½ºÀÇ Ãß»ó ¸Þ¼Òµå¸¦ ÀçÁ¤ÀÇÇØ¼­ ±¸ÇöÇØ ³õÀº ÀÚ¼Õ Å¬·¡½º¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. Ãß»ó Ŭ·¡½º·ÎºÎÅÍ °´Ã¼¸¦ »ý¼ºÇÏ·Á ÇÏ¸é µ¨ÆÄÀÌ ÄÄÆÄÀÏ·¯´Â "Constructing instance of 'Class Name' containing abstract methods" ¶ó´Â °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ¸ç °æ°í¸¦ ¹«½ÃÇÏ°í ½ÇÇàÇÏ¸é ¿¹¿Ü »óȲÀ» ¹ß»ý½ÃŰ°Ô µÈ´Ù. Ãʺ¸ µ¨ÆÄÀÌ °³¹ßÀÚµéÀÌ °¡²û ÀÌ Ãß»ó Ŭ·¡½º ¶§¹®¿¡ °í»ýÇÏ°Ô µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î TStringList¸¦ »ç¿ëÇØ¼­ °´Ã¼¸¦ »ý¼ºÇØ¾ß Çϴµ¥ Ãß»ó Ŭ·¡½ºÀÎ TStrings·ÎºÎÅÍ °´Ã¼¸¦ »ý¼ºÇÏ·Á´Ù À§¿Í °°Àº »óȲÀ» °æÇèÇÏ°Ô µÈ´Ù.
1.2.9. Ŭ·¡½º ÂüÁ¶ Çü(Class Reference Type)°ú °¡»ó »ý¼ºÀÚ
¿ÀºêÁ§Æ® ÆÄ½ºÄ®¿¡¼­´Â ¸Þ¼Òµå¿Í ¸¶Âù°¡Áö·Î »ý¼ºÀÚµµ °¡»óÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù. Ŭ·¡½º °£ÀÇ »ó¼Ó °ü°è¿¡ µû¶ó ÀûÀýÇÑ »ý¼ºÀÚ°¡ È£ÃâµÇµµ·Ï ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ °¡»ó »ý¼ºÀÚ ÀÚü¸¸À¸·Î´Â Ưº°ÇÏ°Ô »ç¿ëÇÒ ÀÏÀÌ ¾øÁö¸¸ Ŭ·¡½º ÂüÁ¶ Çü(¸ÞŸ Ŭ·¡½º¶ó°íµµ ÇÑ´Ù)°ú ÇÔ²² »ç¿ëÇÏ¸é ¾ÆÁÖ °­·ÂÇÑ ±â´ÉÀ» Á¦°øÇØ ÁØ´Ù. ¾Æ·¡ ¿¹Á¦ È­¸éÀ» º¸ÀÚ. È­¸é¿¡¼­ ¶óµð¿À ¹öưÀ¸·Î »ý¼ºÇÒ ÄÞÆ÷³ÍÆ®¸¦ ¼±ÅÃÇÏ°í »ý¼º ¹öưÀ» ´©¸£¸é ¼±ÅÃÇÑ ÄÞÆ÷³ÍÆ®µéÀÌ µ¿ÀûÀ¸·Î »ý¼ºµÈ´Ù. ¼Ò½º¸¦ º¸¸é Ŭ·¡½º ÂüÁ¶ ÇüÀÌ ¾ó¸¶³ª °­·ÂÇÑ ±â´ÉÀÎÁö ½Ç°¨ÇÏ°Ô µÉ °ÍÀÌ´Ù.

±×¸² 1-2 Ŭ·¡½º ÂüÁ¶ Çü ¿¹Á¦


¿¹Á¦¿¡¼­ »ç¿ëÇÑ ÄÞÆ÷³ÍÆ®µéÀº ¸ðµÎ TControl Ŭ·¡½ºÀÇ ÀÚ¼Õ Å¬·¡½ºÀ̱⠶§¹®¿¡ ¿øÇÏ´Â ÄÞÆ÷³ÍÆ®¸¦ Ŭ·¡½º ÂüÁ¶ ÇüÀ» »ç¿ëÇØ¼­ µ¿ÀûÀ¸·Î »ý¼ºÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. TControlClass´Â controls.pas¿¡ Á¤ÀǵǾî ÀÖ´Ù. Ŭ·¡½º ÂüÁ¶ ÇüÀº class of Ű¿öµå·Î Á¤ÀÇÇÑ´Ù.

¸®½ºÆ® 1.5 Ŭ·¡½º ÂüÁ¶ Çü ¿¹Á¦
unit fRefExam;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TfrmRefExam = class(TForm)
    rdoButton: TRadioButton;
    rdoEdit: TRadioButton;
    rdoCheckBox: TRadioButton;
    btnCreate: TButton;
    Bevel1: TBevel;
    panMsg: TPanel;
    procedure btnCreateClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmRefExam: TfrmRefExam;

implementation

{$R *.DFM}

// TControlClass = class of TControl
// TControlClass´Â Controls.pas¿¡ À§¿Í °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

procedure TfrmRefExam.btnCreateClick(Sender: TObject);
var
  Reference : TControlClass;
  Instance : TControl;
begin
  if rdoButton.Checked then
    Reference := TControlClass(TButton)
  else if rdoEdit.Checked then
    Reference := TControlClass(TEdit)
  else
    Reference := TControlClass(TCheckBox);

  Instance := Reference.Create(Self);
  Instance.Parent := Self;
  Instance.Left := 8;
  Instance.Top := 88;
  panMsg.Caption := Instance.ClassName + ' »ý¼º';
end;

end.


º¸½Ã´Ù½ÃÇÇ TControlClass´Â TControl Ŭ·¡½ºÀÇ ÂüÁ¶ ÇüÀ¸·Î ¼±¾ðµÇ¾î ÀÖ´Ù. µû¶ó¼­ TControlÀÇ ÀÚ¼Õ Å¬·¡½º¶ó¸é ¾î¶² Ŭ·¡½ºµµ Reference º¯¼ö¿¡ ´ëÀ﵃ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡¼­ °¡Àå Áß¿äÇÑ °ÍÀº ÄÞÆ÷³ÍÆ®¸¦ »ý¼ºÇÏ´Â Reference.Create(Self) ÇàÀÌ´Ù. °¢ ÄÞÆ÷³ÍÆ®ÀÇ »ý¼ºÀÚ Create°¡ ¼±ÅÃµÈ ÄÞÆ÷³ÍÆ®¿¡ µû¶ó¼­ ÀûÀýÇÏ°Ô È£ÃâµÈ´Ù´Â °ÍÀ» ´«¿©°Ü º¸¾Æ¾ß ÇÑ´Ù.
1.2.10. Ŭ·¡½º ¸Þ¼Òµå(Class Methods)
Ŭ·¡½º ¸Þ¼Òµå´Â Ŭ·¡½º ÂüÁ¶¸¦ ÅëÇØ¼­ ½ÇÇàµÉ ¼ö ÀÖ´Ù´Â °Í¸¸ Á¦¿ÜÇϰí´Â ÀÏ¹Ý ¸Þ¼Òµå¿Í °°´Ù. Ŭ·¡½º ¸Þ¼Òµå ³»¿¡¼­´Â Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö³ª ´Ù¸¥ ÀÏ¹Ý ¸Þ¼Òµå¸¦ »ç¿ëÇÒ ¼ö ¾øÁö¸¸ Ŭ·¡½ºÀÇ »ý¼ºÀÚ³ª ´Ù¸¥ Ŭ·¡½º ¸Þ¼Òµå´Â ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. °á°úÀûÀ¸·Î Ŭ·¡½º ¸Þ¼Òµå´Â Àü¿ª µ¥ÀÌÅ͸¦ Á¶ÀÛÇϰųª Ŭ·¡½º¿¡ ´ëÇÑ Á¤º¸¸¦ ¹ÝȯÇÏ´Â ¸Þ¼Òµå·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏ¹Ý ¸Þ¼Òµå´Â Ŭ·¡½º¸¦ ÀνºÅϽºÈ­ ÇØ¾ß È£ÃâÇÒ ¼ö ÀÖÁö¸¸ Ŭ·¡½º ¸Þ¼Òµå´Â ÀνºÅϽº¸¦ ¸¸µéÁö ¾Ê¾Æµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ ¿¹Á¦´Â Ŭ·¡½º ¸Þ¼Òµå¸¦ °¡Áö´Â °£´ÜÇÑ Å¬·¡½ºÀÌ´Ù. ¿¹Á¦¸¦ º¸¸é Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µéÁö ¾Ê°í Ŭ·¡½º ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.

¸®½ºÆ® 1.6 Ŭ·¡½º ¸Þ¼Òµå ¿¹Á¦
program ClsMethod;
{$APPTYPE CONSOLE}
uses
  SysUtils;

type
  TExample = class
    class function GetClassName : string;
  end;

  class function TExample.GetClassName : string;
  begin
    Result := 'Ŭ·¡½º ¸Þ¼Òµå ¿¹Á¦ Ŭ·¡½º';
  end;
var
  TmpObj : TExample;
  TmpStr : string;
begin
  // Insert user code here
  WriteLn('Á÷Á¢ È£Ãâ -> ', TExample.GetClassName);
  TmpObj := TExample.Create;
  try
    WriteLn('°´Ã¼ »ý¼º ÈÄ È£Ãâ -> ', TmpObj.GetClassName);
  finally
    TmpObj.Free;
  end;
  WriteLn('Á¾·áÇÏ·Á¸é ENTER ۸¦ ´©¸£¼¼¿ä!!');
  ReadLn(TmpStr);
end.




±×¸² 1-2 Ŭ·¡½º ÂüÁ¶ Çü ¿¹Á¦


1.2.11. RTTI(Run-Time Type Information)
RTTI´Â ½ÇÇà ½Ã¿¡ Ŭ·¡½º¿¡ ´ëÇÑ ´Ù¾çÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. Ŭ·¡½ºÀÇ ´ÙÇü¼º°ú »ó¼Ó °ü°è¸¦ ´Ù·ç´Ù º¸¸é °´Ã¼ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í Àִ Ŭ·¡½ºÀÇ ÇüÀÌ ¾î¶² °ÍÀÎÁö ¾Ë¾Æ¾ß ÇÒ ¶§°¡ Á¾Á¾ ÀÖ´Ù. µ¨ÆÄÀÌ´Â RTTI¶ó´Â °ÍÀ» ÅëÇØ¼­ ÀÌ·¯ÇÑ ÀÛ¾÷À» °¡´ÉÇÏ°Ô ÇØÁִµ¥ ±¸Ã¼ÀûÀ¸·Î °´Ã¼ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í Àִ Ŭ·¡½ºÀÇ ÇüÀÌ Æ¯Á¤ Ŭ·¡½º ¶Ç´Â ±× ÀÚ¼Õ Å¬·¡½ºÀÎÁö¸¦ °áÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â is ¿¬»êÀÚ¿Í °´Ã¼ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í Àִ Ŭ·¡½ºÀÇ ÇüÀ» ƯÁ¤ ÀÚ¼Õ Å¬·¡½º·Î ¾ÈÀüÇÏ°Ô Çü º¯È¯(Type Casting)ÇØ ÁÖ´Â as ¿¬»êÀÚ¸¦ Á¦°øÇÑ´Ù.
is ¿¬»êÀÚ´Â °´Ã¼ Æ÷ÀÎÅÍ¿Í Å¬·¡½º ÇüÀ» ÀÎÀÚ·Î °¡Áö´Â ³í¸® ¿¬»êÀÚÀÌ´Ù. °´Ã¼ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í Àִ Ŭ·¡½º°¡ ÁöÁ¤ÇÑ Å¬·¡½º ÇüÀ̰ųª ±× Ŭ·¡½ºÀÇ ÀÚ¼Õ Å¬·¡½ºÀ̸é ÂüÀ» ¹ÝȯÇÏ°í ¾Æ´Ï¸é °ÅÁþÀ» ¹ÝȯÇÑ´Ù. ¾Æ·¡ ¿¹Á¦¸¦ »ìÆì º¸ÀÚ.
if ActiveControl is TCustomEdit then TCustomEdit(ActiveControl).CopyToClipboard;
ActiveControlÀÇ Å¬·¡½º ÇüÀÌ TCustomEditÀ̰ųª ±× ÀÚ¼Õ(TEdit, TMaskEdit,TMemo)ÀÎÁö °Ë»çÇØ¼­ ÂüÀ̸é ActiveControlÀ» TCustomEdit·Î Çü º¯È¯À» Çϰí TCustomEditÀÇ CopyToClipboard ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
À§ Äڵ忡¼­´Â TCustomEdit(ActiveControl)ó·³ °­Á¦·Î Çü º¯È¯À» Çߴµ¥ À̸¦ Á» ´õ ¾ÈÀüÇÏ°Ô Çü º¯È¯ÇÏ·Á¸é as ¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù. as ¿¬»êÀÚ´Â °´Ã¼ Æ÷ÀÎÅÍ¿Í Å¬·¡½º ÇüÀ» ÀÎÀÚ·Î °¡Áö¸ç °´Ã¼ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í Àִ Ŭ·¡½ºÀÇ ÇüÀ» ÁöÁ¤ Ŭ·¡½º ÇüÀ¸·Î º¯È¯ÇÑ °´Ã¼¸¦ ¹ÝÈ¯ÇØ ÁØ´Ù. À§ Äڵ带 as ¿¬»êÀÚ·Î »ç¿ëÇϸé
if ActiveControl is TCustomEdit then (ActiveControl as TCustomEdit).CopyToClipboard;
ó·³ ÄÚµùÇÒ ¼ö ÀÖ´Ù.


ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.