2.WTL ½Ç½À

°¡.WTLFirst

ÀÚ, ±×·³ WTLÀÌ °ú¿¬ Àß ¼³Ä¡µÇ¾ú´ÂÁö ù ¹ø° ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ. MFC¸¦ óÀ½ ¹è¿ï ¶§Ã³·³ ÀÏ´Ü ¸¶¹ý»ç¸¦ µ¹·Á º¸°í ¸¶¹ý»ç°¡ »ý¼ºÇÑ Äڵ带 ºÐ¼®ÇÑ ÈÄ ¿øÇÏ´Â °÷¿¡ Äڵ带 ÀÛ¼ºÇÏ´Â ½ÄÀ¸·Î ½Ç½ÀÇÏ¸é µÈ´Ù.

 

¿¹ Á¦ : WTLFirst

»õ ÇÁ·ÎÁ§Æ® ´ëÈ­»óÀÚ¸¦ ¶ç¿ì¸é ÇÁ·ÎÁ§Æ® Çü½ÄÀÇ Visual C++ Æú´õ ¾Æ·¡¿¡ WTLÀ̶ó´Â ³ëµå°¡ µî·ÏµÇ¾î ÀÖÀ¸¸ç ÀÌ ³ëµå¸¦ ¼±ÅÃÇÏ¸é ¿À¸¥ÂÊ¿¡ ATL/WTL ¸¶¹ý»ç ÅÛÇø´ÀÌ º¸ÀδÙ. ¸¸¾à »õ ÇÁ·ÎÁ§Æ® ´ëÈ­»óÀÚ¿¡ WTL ³ëµå°¡ º¸ÀÌÁö ¾Ê´Â´Ù¸é ¸¶¹ý»ç°¡ Á¦´ë·Î µî·ÏµÇÁö ¾ÊÀº °ÍÀ̹ǷΠ¾Õ ÀýÀÇ ¾È³»´ë·Î ½ºÅ©¸³Æ®¸¦ ´Ù½Ã ½ÇÇàÇØ¾ß ÇÑ´Ù.

ÅÛÇø´Àº ATL/WTL Application Wizard Çϳª¹Û¿¡ ¾øÀ¸¹Ç·Î ¼±ÅÃÇÒ °Ô ¾ø´Ù. ¾Æ·¡ÂÊ¿¡ ÇÁ·ÎÁ§Æ® ÀúÀå À§Ä¡¿Í À̸§À» ÀÔ·ÂÇÑ´Ù. WTLExam ¶Ç´Â Àû´çÇÑ ½Ç½À Æú´õ¸¦ ÁغñÇÏ°í ÇÁ·ÎÁ§Æ® À̸§Àº WTLFirst·Î ÁöÁ¤ÇÑ´Ù. È®ÀÎ ¹öÆ°À» ´©¸£¸é MFC ¸¶¹ý»ç¿Í À¯»çÇÑ ¸¶¹ý»ç ´ëÈ­»óÀÚ°¡ ³ªÅ¸³­´Ù. ÀÌ ´ëÈ­»óÀÚ¸¦ º¸¸é WTL·Î ¾î¶² ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù.

µðÆúÆ®°¡ °¡Àå º¸ÆíÀûÀÎ ÀÀ¿ë ÇÁ·Î±×·¥ ÇüÅÂÀÎ SDI·Î µÇ¾î ÀÖ¾î µðÆúÆ®¸¦ ¹Þ¾ÆµéÀÌ¸é µÈ´Ù. MDI³ª Ž»ö±â ½ºÅ¸ÀϷεµ ¸¸µé ¼ö ÀÖ°í ´ëÈ­»óÀÚ ±â¹ÝÀ¸·Î ¸¸µé ¼öµµ ÀÖ´Ù. ¿À¸¥ÂÊ¿¡´Â ¿©·¯ °¡Áö ÇÁ·ÎÁ§Æ® ¿É¼ÇµéÀÌ ³ª¿­µÇ¾î Àִµ¥ ÀÌ Áß Generate .CPP Files ¿É¼ÇÀ» ¼±ÅÃÇÑ´Ù.

ÀÌ ¿É¼ÇÀ» ¼±ÅÃÇÏÁö ¾ÊÀ¸¸é ¸â¹ö ÇÔ¼öµéÀÌ Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºµÇ¸ç È£ÃâµÉ ¶§ ÀζóÀÎÀ¸·Î È£ÃâµÇ¹Ç·Î ¼Óµµ´Â »¡¶óÁöÁö¸¸ Å©±â¿¡´Â ºÒ¸®ÇÏ´Ù. Çì´õ¿Í ±¸Çö ÆÄÀÏÀ» ºÐ¸®ÇÏ´Â °ÍÀÌ C++ÀÇ Á¤¼®ÀÌ°í ¸ðµç Äڵ带 Çì´õ ÆÄÀÏ¿¡ ´Ù ÀÛ¼ºÇÒ ¼ö´Â ¾øÀ¸¹Ç·Î ÀÌ ¿É¼ÇÀº ¿Ø¸¸Çؼ­´Â ¼±ÅÃÇÏ´Â ÆíÀÌ´Ù. ¾ÕÀ¸·Îµµ ÀÌ ¿É¼ÇÀº ¾Ë¾Æ¼­ ¼±ÅÃÇϱ⠹ٶõ´Ù.

User Interface Features ÆäÀÌÁö¿¡¼­´Â È­¸é¿¡ ¹èÄ¡ÇÒ UI ¿ä¼Ò¸¦ ¼±ÅÃÇÑ´Ù. Åø¹Ù³ª »óŶõ µîÀ» ºÙÀÏ ¼ö Àִµ¥ µðÆúÆ®·Î ¸ðµç ¿ä¼Ò°¡ ´Ù ¼±ÅõǾî ÀÖ´Ù. ¾ø¾Ö°í ½ÍÀº ¿ä¼Ò¸¦ ¼±Åà ÇØÁ¦ÇÏµÇ Ã¹ ¿¹Á¦À̹ǷΠµðÆúÆ®¸¦ ¹Þ¾Æ µéÀ̵µ·Ï ÇÏÀÚ.

¾Æ·¡ÂÊ¿¡¼­´Â ºä ÀÚüÀÇ »ç¿ë ¿©ºÎ¿Í ºäÀÇ Á¾·ù¸¦ ¼±ÅÃÇÑ´Ù. ºä¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ¸ÞÀÎ ÇÁ·¹ÀÓ¸¸À¸·Î ÇÁ·ÎÁ§Æ®¸¦ ±¸¼ºÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì Çϳª·Î ±¸¼ºµÈ ´Ü¼øÇÑ ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖÁö¸¸ º°µµÀÇ Â÷Àϵ带 µÎÁö ¾ÊÀ¸¸é Åø¹Ù±îÁö ÀÛ¾÷ ¿µ¿ª¿¡ Æ÷ÇԵǹǷΠ¿©·¯ ¸ð·Î ºÒÆíÇÏ´Ù. ¿Ø¸¸ÇÏ¸é ºä´Â »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.

ºäÀÇ Á¾·ù´Â Æû ºä, ½ºÅ©·Ñ ºä, ¿¡µðÆ® ºä µî MFC°¡ Á¦°øÇÏ´Â ºä ÆÄ»ý Ŭ·¡½º¿Í °³³äÀÌ °ÅÀÇ ºñ½ÁÇÏ´Ù. ù ¿¹Á¦À̴ϸ¸Å­ ÀÌ ÆäÀÌÁöÀÇ ¿É¼ÇÀº µðÆúÆ®¸¦ ¹Þ¾ÆµéÀÌÀÚ. Finish ¹öÆ°À» ´©¸£¸é ÇÁ·ÎÁ§Æ®ÀÇ °ñ°ÝÀÌ ¿Ï¼ºµÈ´Ù. ¸¶¹ý»ç°¡ ÇÁ·ÎÁ§Æ®¸¦ ¾î¶»°Ô ¸¸µé¾î ³õ¾Ò´ÂÁö ¼Ö·ç¼Ç Ž»ö±â¸¦ º¸ÀÚ.

  

MFC¿Í °ÅÀÇ À¯»çÇÑ ÇüÅ·ΠÇÁ·ÎÁ§Æ®°¡ »ý¼ºµÈ´Ù. ¸¶¹ý»ç°¡ ¸¸µç ÄÚµåÀ̹ǷΠÀÌ »óÅ·εµ ¿¡·¯¾øÀÌ Àß ÄÄÆÄÀÏµÇ°í ½ÇÇàµÈ´Ù. ¹°·Ð Ưº°ÇÑ µ¿ÀÛÀº ¾ø°í Ãâ·Âµµ ÀüÇô ¾ø´Ù. WTLFirstView.cpp¸¦ ¿­¾î OnPaint¿¡ ¹®ÀÚ¿­ Ãâ·Â Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.

 

LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     CPaintDC dc(m_hWnd);

 

     dc.TextOut(10,10,TEXT("WTL First Program"));

 

     return 0;

}

 

CPaintDC °´Ã¼ dcÀÇ ¸â¹ö ÇÔ¼ö TextOutÀ» È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù. MFC¿Í °ÅÀÇ À¯»çÇؼ­ Ä£¼÷ÇÏ°Ô ´À²¸Áø´Ù. ´Ù½Ã ÄÄÆÄÀÏÇϸé ÀÛ¾÷ ¿µ¿ª ¿ÞÂÊ À§¿¡ ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.

¸Þ´ºµµ ´Þ·Á ÀÖ°í Åø¹Ù, »óŶõµµ ºÙ¾î ÀÖ´Ù. ¸Þ´º ¸ñ·ÏÀ» ¿­¾î º¸¸é Ç׸ñ ¿·¿¡ ¾ÆÀÌÄܵµ Ç¥½ÃµÇ¾î Àִµ¥ MFCº¸´Ù ¿ÀÈ÷·Á ´õ ÃÖ½ÅÇüÀÌ´Ù. MFC´Â ¾ÆÁ÷±îÁöµµ À©µµ¿ìÁîÀÇ Ç¥ÁØ ¸Þ´º¸¸ Áö¿øÇϴµ¥ ºñÇØ WTLÀÇ ¸Þ´º´Â ½Ã½ºÅÛ ¸Þ´º°¡ ¾Æ´Ï¶ó »ç½ÇÀº Ä¿½ºÅÒ ÄÁÆ®·ÑÀÌ´Ù.

³ª.ÇÁ·ÎÁ§Æ®ÀÇ ±¸Á¶

¸¶¹ý»ç°¡ ¾î¶² ½ÄÀ¸·Î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¾î ³õ¾Ò´ÂÁö ºÐ¼®ÇØ º¸ÀÚ. ¸ÕÀú stdafx.h¸¦ º¸¸é WTLÀ» À§ÇÑ Çʼö Çì´õ ÆÄÀÏÀ» º¼ ¼ö ÀÖ´Ù.

 

#include <atlbase.h>

#include <atlapp.h>

 

extern CAppModule _Module;

 

#include <atlwin.h>

 

#include <atlframe.h>

#include <atlctrls.h>

#include <atldlgs.h>

#include <atlctrlw.h>

 

atlapp.h°¡ WTLÀÇ ±âº»ÀûÀÎ Á¤ÀǸ¦ Á¦°øÇÏ´Â Çì´õ ÆÄÀÏÀ̸ç atlbase.h´Â ATLÀÇ ±âº» ŸÀÔÀ» Á¤ÀÇÇÏ´Â Çì´õ ÆÄÀÏÀÌ´Ù. WTLÀ» »ç¿ëÇÏ·Á¸é ÀÌ µÑÀº ¹«Á¶°Ç Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù. _ModuleÀº MFCÀÇ theApp¿¡ ÇØ´çÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥ Àü¿ª °´Ã¼ÀÌ´Ù. WTLFirst.cpp¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç ¾ðÁ¦µçÁö ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï stdafx.h¿¡ extern ¼±¾ðµÇ¾î ÀÖ´Ù. ³ª¸ÓÁö Çì´õ ÆÄÀÏÀº ÇÁ·¹ÀÓ, ÄÁÆ®·Ñ, ´ëÈ­»óÀÚ µîÀÇ ·¡ÆÛ Å¬·¡½º¸¦ Á¤ÀÇÇÑ´Ù.

WTLFirst.cpp¿¡´Â ÀÀ¿ë ÇÁ·Î±×·¥ ÀÚü¿¡ ÇØ´çÇÏ´Â _Module Àü¿ª °´Ã¼¸¦ ¼±¾ðÇÏ°í ÀÀ¿ë ÇÁ·Î±×·¥ ÃʱâÈ­ ¹× ½ÇÇàÀ» À§ÇÑ µÎ °³ÀÇ Àü¿ª ÇÔ¼ö°¡ Á¤ÀǵǾî ÀÖ´Ù. Áö±Ý Àüü Äڵ带 ´Ù ºÐ¼®ÇÒ ¼ö´Â ¾øÀ¸¹Ç·Î Áß¿äÇÑ ºÎºÐ¸¸ ¹ßÃéÇØ º¸ÀÚ.

 

CAppModule _Module;

 

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)

{

     ....

     CMainFrame wndMain;

     wndMain.CreateEx();

     wndMain.ShowWindow(nCmdShow);

 

     int nRet = theLoop.Run();

 

     return nRet;

}

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)

{

     ....

     hRes = _Module.Init(NULL, hInstance);

     int nRet = Run(lpstrCmdLine, nCmdShow);

     _Module.Term();

     ....

     return nRet;

}

 

¿£Æ®¸® Æ÷ÀÎÆ®ÀÎ _tWinMain¿¡¼­ Àü¿ª ÃʱâÈ­¸¦ ¼öÇàÇÏ°í Run ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. RunÀº ¸ÞÀÎ À©µµ¿ì¸¦ »ý¼ºÇÏ°í ¸Þ½ÃÁö ·çÇÁ¸¦ µ¹¸°´Ù. theLoop.Run ¾È¿¡ ¸Þ½ÃÁö ·çÇÁ°¡ ÀÖÀ» °ÍÀÓÀº ½±°Ô ÁüÀ۵ȴÙ. À©µµ¿ìÁî ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ ÃʱâÈ­ ¹× ½ÇÇà ÀýÂ÷¸¦ µÎ ÇÔ¼ö¿¡ ³ª´©¾î ³õÀº °ÍÀε¥ ÀÌ·± ±¸Á¶´Â MFCº¸´Ù´Â Win32¿¡ ´õ °¡±õ´Ù. ´ÙÀ½Àº ¸ÞÀÎ À©µµ¿ì¿¡ ÇØ´çÇÏ´Â CMainFrameÀÇ ¼±¾ð¹®À» º¸ÀÚ.

 

class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,

          public CMessageFilter, public CIdleHandler

{

public:

     DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

 

     CWTLFirstView m_view;

     ....

     BEGIN_MSG_MAP(CMainFrame)

          MESSAGE_HANDLER(WM_CREATE, OnCreate)

          ....

     END_MSG_MAP()

     ....

};

 

¹«·Á 4Áß ´ÙÁß »ó¼ÓÀ» ÇÏ°í ÀÖ´Ù. ÇÁ·¹ÀÓ À©µµ¿ìÀÇ ±â´É ´ëºÎºÐÀº CFrameWindowImpl ÅÛÇø´¿¡ ±¸ÇöµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ÅÛÇø´À¸·Î »ó¼Ó¹Þ¾Æ¾ß ÇÑ´Ù. ÅÛÇø´ Àμö·Î Áö±Ý Á¤ÀÇÇÏ°í ÀÖ´Â CMainFrameÀÌ Àü´ÞµÇ´Â ±âÀÌÇÑ ±¸Á¶¸¦ °¡Áö´Âµ¥ ÀÌ¿¡ ´ëÇؼ­´Â ´ÙÀ½ Ç׿¡¼­ ¹®¹ýÀ» ¿¬±¸ÇØ º¸ÀÚ. ÀÌ ¿Ü¿¡ UI °»½Å, ¸Þ½ÃÁö ÇÊÅ͸µ, ¾ÆÀ̵é 󸮸¦ À§ÇÑ Å¬·¡½º¸¦ »ó¼Ó¹Þ´Â´Ù.

À©µµ¿ì Ŭ·¡½º µî·ÏÀ» À§ÇÑ ¸ÅÅ©·Î ±¸¹®ÀÌ ¼±µÎ¿¡ ÀÖ°í ºä¸¦ ¸â¹ö·Î ¼±¾ðÇß´Ù. ±×¸®°í ¸Þ½ÃÁö ¸ÊÀÌ ÀÛ¼ºµÇ¾î ÀÖ´Ù. ¸Þ½ÃÁö¿Í À̸¦ ó¸®ÇÒ ¸â¹ö ÇÔ¼ö¸¦ ´ëÀÀ½ÃÅ°´Â ¿ªÇÒÀ» ÇÑ´Ù. ¸Þ½ÃÁö ¸ÊÀÌ MFC¿Í´Â ´Þ¸® ±¸Á¶Ã¼ ¹è¿­ÀÌ ¾Æ´Ï¶ó ÀÏÁ¾ÀÇ ÄÚµåÀ̱⠶§¹®¿¡ Çì´õ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¸ÞÀÓ ÇÁ·¹ÀÓÀÇ ±¸Çö ÆÄÀÏ¿¡´Â °¢ ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯°¡ Á¤ÀǵǾî Àִµ¥ ´ëÇ¥ÀûÀ¸·Î OnCreate¸¸ º¸ÀÚ.

 

LRESULT CMainFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     HWND hWndCmdBar = m_CmdBar.Create(....);

     HWND hWndToolBar = CreateSimpleToolBarCtrl(....);

     CreateSimpleReBar(....);

     AddSimpleReBarBand(hWndCmdBar);

     AddSimpleReBarBand(hWndToolBar, NULL, TRUE);

 

     CreateSimpleStatusBar();

 

     m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);

     ....

 

     return 0;

}

 

¸Þ´º, Åø¹Ù, »óŶõ, ¸®¹Ù µîÀ» Â÷·Ê·Î »ý¼ºÇÏ°í ¸®¹Ù¿¡ ¸Þ´º¿Í Åø¹Ù¸¦ ¹èÄ¡ÇÑ´Ù. »óŶõÀº ¾Æ·¡ÂÊ¿¡ ¹èÄ¡µÇ¸ç Áß¾Ó¿¡´Â ºä¸¦ ¹èÄ¡ÇÑ´Ù. Â÷ÀϵåµéÀÌ ¸ÞÀÎ ÇÁ·¹ÀÓÀÇ °¢ ºÎºÐ¿¡ ¹èÄ¡µÇ´Â °ÍÀÌ´Ù. Áö±ØÈ÷ ¸ÞÀÎ À©µµ¿ì´Ù¿î »ó½ÄÀûÀÎ ÄÚµåÀÌ´Ù. ´ÙÀ½Àº ºä¸¦ º¸ÀÚ. ¸ÞÀÎ ÇÁ·¹ÀÓÀÇ ¼±¾ð¹®°ú Å©°Ô Ʋ¸®Áö ¾Ê´Ù.

 

class CWTLFirstView : public CWindowImpl<CWTLFirstView>

{

public:

     DECLARE_WND_CLASS(NULL)

 

     BOOL PreTranslateMessage(MSG* pMsg);

 

     BEGIN_MSG_MAP(CWTLFirstView)

          MESSAGE_HANDLER(WM_PAINT, OnPaint)

     END_MSG_MAP()

     ....

};

 

À©µµ¿ìÀÇ ±â´É ´ëºÎºÐÀº CWindowImple¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ÀÌ ÅÛÇø´À¸·ÎºÎÅÍ »ó¼Ó¹Þ´Â´Ù. ¸Þ½ÃÁö ¸Ê¿¡´Â OnPaint¸¸ Á¤ÀǵǾî Àִµ¥ ¸¶¹ý»ç°¡ ¸¸µç OnPaint¿¡´Â ¾Æ¹« Ãâ·Â Äڵ尡 ¾øÁö¸¸ ºä´Â ´ç¿¬È÷ ¹º°¡¸¦ Ãâ·ÂÇÒ °ÍÀ̹ǷΠOnPaint¸¸ ¹Ì¸® ¸¸µé¾î ³õÀº °ÍÀÌ´Ù. ¿ì¸®´Â ºó OnPaint¿¡¼­ TextOut¹®À» ÀÛ¼ºÇßÀ¸¸ç ÀÌ Äڵ忡 ÀÇÇØ ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÈ´Ù.

±× ¿Ü AboutDlg °°Àº º° ¾²Àßµ¥±â ¾ø´Â Ŭ·¡½º°¡ ¼±¾ðµÇ¾î ÀÖÀ¸¸ç ¸®¼Ò½º¿¡´Â ÀÀ¿ë ÇÁ·Î±×·¥ °¢ ºÎºÐÀ» Àå½ÄÇÏ´Â ¸®¼Ò½ºµéÀÌ Æ÷ÇԵǾî ÀÖ´Ù. Á» ´õ »ó¼¼ÇÑ ±¸Á¶´Â ¾ÕÀ¸·Î ¿¬±¸ÇØ ºÁ¾ß°ÚÁö¸¸ ÀüüÀûÀÎ ±¸Á¶´Â ºñ±³Àû ´Ü¼øÇÑ ÆíÀÌ´Ù. ÀÌ Å¬·¡½ºµéÀÌ ¾î¶² ½ÄÀ¸·Î µ¿ÀÛÇÏ´ÂÁö´Â Àß ¸ð¸£°ÚÁö¸¸ ´ëÃæÀÇ Å« ±×¸²Àº ÆÄ¾ÇµÉ °ÍÀÌ´Ù.

´Ù.ÅÛÇø´ÀÇ ÀÌ¿ëÇÑ °¡»ó ÇÔ¼ö

¸ÞÀÓ ÇÁ·¹ÀÓÀ̳ª ºä Ŭ·¡½ºÀÇ ¼±¾ð¹®À» º¸¸é ±â¹Ý Ŭ·¡½º·Î ÅÛÇø´ÀÌ ÁöÁ¤µÇ¾î ÀÖ°í ÀÌ ÅÛÇø´ÀÇ Àμö·Î Áö±Ý ¼±¾ðÇϴ Ŭ·¡½º¸íÀÌ Àü´ÞµÈ´Ù. ¹º°¡ º¹ÀâÇØ º¸À̴µ¥ Á» ´õ °£´ÜÇÑ Çü½ÄÀ¸·Î Á¤¸®ÇØ º¸¸é ´ÙÀ½°ú °°´Ù.

 

class Child : public Parent<Child>

 

Áö±Ý ¼±¾ðÇÏ°í Àִ Ŭ·¡½º¸¦ »ó¼Ó ¸®½ºÆ®¿¡ »ç¿ëÇÏ´Â ½ÄÀε¥ Á» ÀÌ»óÇØ º¸ÀÌÁö¸¸ C++ ¹®¹ý»ó ÀÌ´Â ÇÕ¹ýÀûÀÌ´Ù. ¿Ö³ÄÇϸé ÄÄÆÄÀÏ·¯´Â ¼Ò½º¸¦ ¼ø¼­´ë·Î ÀÐÀ¸¸ç class Child ¼±¾ð¿¡ ÀÇÇØ Child¶ó´Â ¸íĪÀÌ Å¬·¡½º ŸÀÔ¸íÀ̶ó´Â °ÍÀ» ¸ÕÀú ¾Ë°Ô µÇ°í ±× ÈÄ Parent<Child>¸¦ ÄÄÆÄÀÏÇϱ⠶§¹®ÀÌ´Ù.

Ŭ·¡½º ÀÚ½ÅÀÌ »ó¼Ó ¸®½ºÆ®¿¡ ³ªÅ¸³ª´Â ÀÌ·± Çü½ÄÀº ÀϹÝÀûÀÎ C++ ÄÚµù¿¡¼­´Â °ÅÀÇ »ç¿ëµÇÁö ¾ÊÁö¸¸ ATL¿¡¼­ ¾ÆÁÖ ÈçÇÏ°Ô »ç¿ëµÈ´Ù. ÀÌ ¹®¹ýÀº ÄÄÆÄÀÏ Å¸ÀÓ¿¡ °¡»ó ÇÔ¼ö È£ÃâÀ» Èä³»³»´Â È¿°ú¸¦ ³½´Ù. ÀÌ ¹®¹ýÀÌ ¾î°¼­ °¡»ó ÇÔ¼ö¿Í °°Àº È¿°ú°¡ ³ª´ÂÁö °£´ÜÇÑ ÄÜ¼Ö ¿¹Á¦¸¦ ¸¸µé¾î ¹®¹ýÀ» Á¡°ËÇØ º¸ÀÚ.

 

¿¹ Á¦ : VirtualFunc

#include <stdio.h>

 

class Dog

{

public:

     virtual void Bark() { printf("mung mung\r\n"); }

};

 

class MadDog : public Dog

{

public:

     virtual void Bark() { printf("yaong yaong\r\n"); }

};

 

void KickDog(Dog *pDog)

{

     pDog->Bark();

}

 

void main()

{

     Dog Happy;

     MadDog DdangChil;

 

     KickDog(&Happy);

     KickDog(&DdangChil);

}

 

C++ ¹®¹ý¼­¿¡ ³ª¿Ã¸¸ÇÑ ¾ÆÁÖ ÀüÇüÀûÀÎ °¡»ó ÇÔ¼ö ¿¹Á¦ÀÌ´Ù. °³´Â ¢À» ¼ö ÀÖÀ¸¸ç µû¶ó¼­ Bark¶ó´Â ¸â¹ö ÇÔ¼ö¸¦ °¡Áø´Ù. Á¤»óÀûÀÎ °³´Â ¸Û¸ÛÀ̶ó°í ¢Áö¸¸ °³ÀÇ Á¾·ù¿¡ µû¶ó ¢´Â ¹æ¹ýÀÌ ´Þ¶óÁú ¼öµµ ÀÖÀ¸¹Ç·Î Bark´Â °¡»ó ÇÔ¼ö·Î ¼±¾ðµÇ¾ú´Ù.

ÀϹÝÀûÀÎ °³·ÎºÎÅÍ ÆÄ»ýµÈ ¹ÌÄ£°³´Â Bark ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ¿© ¾ß¿Ë ¾ß¿ËÀ̶ó°í ¢´Â´Ù. ¾îµð¼­ ¿Ü±¹¾î Çϳª ¹è¿î ¸ð¾çÀÌ´Ù. KickDog ÇÔ¼ö´Â °¡¸¸È÷ ÀÖ´Â °³¸¦ ¹ß·Î Â÷´Â µ¿ÀÛÀ» Çϴµ¥ Â÷ÀÎ °³´Â ¢±â ¸¶·ÃÀÌ´Ù. À̶§ ¾î¶² °³¸¦ °Çµå·È´Â°¡¿¡ µû¶ó ¢´Â ¼Ò¸®°¡ ´Þ¶óÁø´Ù. pDogÀÇ ½ÇÁ¦ ŸÀÔ¿¡ µû¶ó È£ÃâµÇ´Â Bark ÇÔ¼ö°¡ ¹Ù²î±â ¶§¹®ÀÌ´Ù.

main¿¡¼­ ÀϹÝÀûÀÎ °³ ÇØÇÇ¿Í ¹ÌÄ£°³ ¶¯Ä¥ÀÌ °´Ã¼¸¦ ¸¸µé°í µÎ °³¸¦ Â÷·Ê´ë·Î Â÷ º¸¾Ò´Ù. ÇØÇÇ¿Í ¶¯Ä¥ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¹ÝÀÀÇÒ °ÍÀÌ´Ù.

 

mung mung

yaong yaong

 

¶È°°Àº KickDog ÇÔ¼ö¸¦ È£ÃâÇßÁö¸¸ È£Ãâ °´Ã¼¿¡ µû¶ó ¹ÝÀÀÀÌ ´Þ¶óÁö´Â ÀüÇüÀûÀÎ ´ÙÇü¼º ¿¹Á¦ÀÌ´Ù. ¸¸¾à ÀÌ ¿¹Á¦°¡ ÀÌÇصÇÁö ¾Ê´Â´Ù¸é ÀÌÈÄÀÇ °­Á´ ´õ ÀÐÀ» ÇÊ¿ä¾ø´Ù. ¿· ¸Þ´ºÀÇ C/C++ °­Á¶õÀ¸·Î °¡¼­ 3ºÎ 30ÀåºÎÅÍ ²Ä²ÄÈ÷ ´Ù½Ã ÀÐÀº ÈÄ µ¹¾Æ¿À±â ¹Ù¶õ´Ù. ATLÀº ÀÌ·± ´ÙÇü¼ºÀÌ ÇÊ¿äÇÒ ¶§ °¡»ó ÇÔ¼ö¸¦ ¾²Áö ¾Ê°í ÅÛÇø´À» »ç¿ëÇÑ´Ù. ¶È°°ÀÌ µ¿ÀÛÇÏ´Â ¿¹Á¦¸¦ ATL·Î ¸¸µé¾î º¸ÀÚ. ¹æ½ÄÀº ´Ù¸£Áö¸¸ ½ÇÇà °á°ú´Â µ¿ÀÏÇÏ´Ù.

 

#include <stdio.h>

template <typename T> class DogBase

{

public:

     void KickDog()

     {

          T* pDog=(T *)this;

          pDog->Bark();

     }

};

 

class Dog : public DogBase<Dog>

{

public:

     void Bark() { printf("mung mung\r\n"); }

};

 

class MadDog : public DogBase<MadDog>

{

public:

     void Bark() { printf("yaong yaong\r\n"); }

};

 

void main()

{

     Dog Happy;

     MadDog DdangChil;

 

     Happy.KickDog();

     DdangChil.KickDog();

}

 

DogBase¶ó´Â Ŭ·¡½º ÅÛÇø´À» Á¤ÀÇÇ쵂 ÀÌ ÅÛÇø´ÀÇ KickDog ÇÔ¼ö´Â this¸¦ ÅÛÇø´ÀÇ Àμö ŸÀÔÀÎ TÀÇ Æ÷ÀÎÅͷΠij½ºÆÃÇÑ ÈÄ TÀÇ Bark ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. °£´ÜÇÏ°Ô º¸À̱â À§ÇØ C ½ºÅ¸ÀÏÀÇ Ä³½ºÆ® ¿¬»êÀÚ¸¦ »ç¿ëÇߴµ¥ C++ ½ºÅ¸ÀÏ·Î ¾²¸é ´ÙÀ½°ú °°´Ù.

 

T* pDog=static_cast<T *>(this);

 

Dog°ú MadDogÀº DogBase ÅÛÇø´À¸·ÎºÎÅÍ »ó¼ÓÀ» ¹ÞµÇ ÀÚ±â ÀÚ½ÅÀ» ÅÛÇø´ÀÇ Àμö·Î Àü´ÞÇÏ¿© ij½ºÆà ŸÀÔÀ» Á¦°øÇÑ´Ù. ±×¸®°í ÀÚ±â ÀÚ½ÅÀÇ °íÀ¯ÇÑ Bark ÇÔ¼ö¸¦ ºñ°¡»ó ÇÔ¼ö·Î Á¤ÀÇÇÑ´Ù. main¿¡¼­´Â µÎ °´Ã¼¸¦ ¼±¾ðÇÏ°í KickDog ÇÔ¼ö¸¦ È£ÃâÇߴµ¥ È£Ãâ °´Ã¼ÀÇ ÇÔ¼ö°¡ Á¤È®ÇÏ°Ô È£ÃâµÈ´Ù. ¿Ö ±×·±Áö´Â µÎ Ŭ·¡½º¸¦ ±¸Ã¼È­ÇØ º¸¸é ¾Ë ¼ö ÀÖ´Ù.

 

class Dog

{

public:

     void KickDog()

     {

          Dog* pDog=(Dog *)this;

          pDog->Bark();

     }

     void Bark() { printf("mung mung\r\n"); }

};

 

class MadDog

{

public:

     void KickDog()

     {

          MadDog* pDog=(MadDog *)this;

          pDog->Bark();

     }

     void Bark() { printf("yaong yaong\r\n"); }

};

 

DogÀÇ KickDog ÇÔ¼ö´Â this¸¦ ÀÚ±â ÀÚ½ÅÀÇ Å¸ÀÔÀ¸·Î ij½ºÆÃÇÑ ÈÄ ÀÚ½ÅÀÇ Bark ÇÔ¼ö¸¦ È£ÃâÇÏ°í MadDogÀÇ KickDog ÇÔ¼öµµ ¸¶Âù°¡Áö·Î this¸¦ MadDog ŸÀÔÀ¸·Î ij½ºÆÃÇÑ ÈÄ Bark ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. this¸¦ È£Ãâ Ŭ·¡½ºÀÇ Å¸ÀÔÀ¸·Î ¹Ù²Û ÈÄ È£ÃâÇϹǷΠÀÚ½ÅÀÇ Bark ÇÔ¼ö°¡ È£ÃâµÇ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù. ´Ù¸¸ ÀÌ Ä³½ºÆà ±¸¹®ÀÌ ·±Å¸ÀÓÀÌ ¾Æ´Ï¶ó ÄÄÆÄÀÏ Å¸ÀÓ¿¡ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ¼öÇàµÈ´Ù´Â Á¡ÀÌ ´Ù¸¦ »ÓÀÌ´Ù. ºÎ¸ðÀÇ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏÁö ¾Ê°í ±×´ë·Î »ó¼Ó¹Þ´Â ±â¹ýµµ º° ÀÌ»ó¾øÀÌ Àû¿ëµÈ´Ù. ´ÙÀ½ Äڵ带 Ãß°¡ÇØ º¸ÀÚ.

 

class DrunkenDog : public DogBase<MadDog>

{

public:

     void Drink() { printf("one shot\r\n"); }

};

 

void main()

{

     ....

     DrunkenDog JJong;

     JJong.KickDog();

     JJong.Drink();

}

 

¼úÃëÇÑ °³´Â ¹ÌÄ£°³·ÎºÎÅÍ »ó¼ÓÀ» ¹ÞÀ¸¸ç ¼úÁÖÁ¤À» ÇÏ´Â Ãß°¡ µ¿ÀÛÀ» °¡Áø´Ù. Bark¸¦ ÀçÁ¤ÀÇÇÏÁö ¾Ê´Â ´ë½Å DogBaseÀÇ Àμö·Î ºÎ¸ðÀÎ MadDogÀ» Àü´ÞÇÏ¿© ÀÌ Å¸ÀÔÀÇ Bark¸¦ È£ÃâÇϵµ·Ï Çß´Ù. ½ÇÇàÇØ º¸ÀÚ.

 

yaong yaong

one shot

 

¢À» ¶§´Â ºÎ¸ð ŸÀÔÀÎ MadDogÀÇ µ¿ÀÛÀ» µû¸£°í ¼úÁÖÁ¤À» ÇÒ ¶§´Â Àڱ⠳ª¸§´ë·ÎÀÇ µ¿ÀÛÀ» ÇÑ´Ù. ¿ÂÀüÇÏ°Ô ´ÙÇü¼ºÀÌ ¼º¸³ÇÏ¸ç °¡»ó ÇÔ¼ö¸¦ ¾²´Â °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ ³½´Ù.

±×·¸´Ù¸é ATLÀº ¿Ö ÄÄÆÄÀÏ·¯°¡ Á¦°øÇÏ´Â °¡»ó ÇÔ¼ö¸¦ ¾²Áö ¾Ê°í ÀÌ·± º¹ÀâÇÑ ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀϱî? ÀÌ ±â¹ýÀº ¸î °¡Áö ÀåÁ¡À» Á¦°øÇϴµ¥ ¸â¹ö ÇÔ¼ö È£Ãâ¿¡ °´Ã¼¸¦ Á÷Á¢ »ç¿ëÇϹǷΠÆ÷ÀÎÅ͸¦ ¾µ ÇÊ¿ä°¡ ¾øÀ¸¸ç µû¶ó¼­ NULL Æ÷ÀÎÅͷκÎÅÍ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â À§Çèµµ ¾ø´Ù. ¶ÇÇÑ ÄÄÆÄÀÏ Å¸ÀÓ¿¡ È£ÃâÇÒ ÇÔ¼ö°¡ °áÁ¤µÇ¹Ç·Î Á¤¹ÐÇÑ ÃÖÀûÈ­°¡ °¡´ÉÇØ ÈξÀ ´õ ¼Óµµ°¡ ºü¸£´Ù.

ATLÀÌ ÀÌ·± ¹æ½ÄÀ» »ç¿ëÇÏ´Â °¡Àå Å« ÀÌÀ¯´Â °¡»ó ÇÔ¼ö¸¦ À§ÇÑ vtableÀ» ¸¸µéÁö ¾Ê¾Æµµ µÇ±â ¶§¹®ÀÌ´Ù. »ç½Ç ÀϹÝÀûÀÎ C++ Äڵ忡¼­ vtableÀº ´Ü¼øÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­À̱⠶§¹®¿¡ ¸Þ¸ð¸®¸¦ ±×´ÙÁö ¸¹ÀÌ Â÷ÁöÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ATLÀÇ °æ¿ì´Â ±×·¸Áö ¾Ê´Ù. 20Áß ´ÙÁß»ó¼ÓÀ» ¾ÆÁÖ ¿ì½À°Ô ÇØ ´ë°í ±×·± »ó¼ÓÀÇ ´Ü°è°¡ 5´Ü°è~10´Ü°è¸¦ ³Ñ¾î°¡´Â °æ¿ì°¡ ¿Õ¿Õ ÀÖ´Ù º¸´Ï vtableÀÇ Å©±â°¡ °áÄÚ ¸¸¸¸ÇÏÁö°¡ ¾ÊÀº °ÍÀÌ´Ù.

ÀÛ°í °¡º­¿î ¶óÀ̺귯¸®¸¦ Ç¥¹æÇÏ´Â ATL·Î¼­´Â Å©±â³ª ¼Óµµ¿¡ ºÒ¸®ÇÑ °¡»ó ÇÔ¼ö¸¦ ¸¶À½´ë·Î ¾µ ¼ö ¾ø°í ±×·¡¼­ ´ëüµÇ´Â ¹æ¹ýÀ» ãÀº °ÍÀÌ ¹Ù·Î ÅÛÇø´À» ÀÌ¿ëÇÑ Ä³½ºÆÃÀÎ °ÍÀÌ´Ù. ÀÌ ¿¹Á¦°¡ Àß ÀÌÇصÇÁö ¾Ê¾Æµµ °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌÈÄ ATL Äڵ带 ºÐ¼®ÇÏ´Â °úÁ¤¿¡¼­ ÀÌ·± »ó¼Ó¹®À» º¸¸é ´ÙÇü¼ºÀ» Àú·ÅÇÏ°Ô ±¸ÇöÇϱâ À§ÇÑ ÄÚµå¶ó°í »ý°¢ÇÏ¸é µÈ´Ù.

¶ó.¹Í½ºÀΠŬ·¡½º

WTLÀÇ ÅÛÇø´ ±¸¹®Àº ¹Í½ºÀÎ(Mix in)À̶ó´Â ¾ÆÁÖ Àç¹ÌÀÖ´Â ±â¹ýÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. ¹Í½ºÀΠŬ·¡½º´Â ¹Ì¸® ±¸ÇöµÈ ±â´ÉÀ» ÅÛÇø´ »ó¼ÓÀ» ÅëÇØ ´Ù¸¥ Ŭ·¡½º¿¡ Á¦°øÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ±â¹ý ÀÚü¸¸À¸·Î º»´Ù¸é »ó¼Ó°ú À¯»çÇÏÁö¸¸ ÆÄ»ý Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â Á¡¿¡¼­ ´Ü¼øÇÑ »ó¼Ó°ú´Â È¿°ú°¡ Á» ´Ù¸£´Ù.

 

¿¹ Á¦ : MixIn

#include <stdio.h>

#include <windows.h>

 

template <typename T> class Sentinel

{

public:

     void OnThief()

     {

          T* pDog=(T *)this;

          for (int i=0;i<5;i++) {

              pDog->Bark();

              printf("¿Ô´Ù¸® °¬´Ù¸®...\r\n");

              Sleep(500);

          }

     }

};

 

class Dog : public Sentinel<Dog>

{

public:

     void Bark() { printf("mung mung\r\n"); }

};

 

class Cow : public Sentinel<Cow>

{

public:

     void Bark() { printf("ume ume\r\n"); }

};

 

void main()

{

     Dog Happy;

     Happy.OnThief();

 

     Cow So;

     So.OnThief();

}

 

ÀÌ ¿¹Á¦¿¡µµ ¿©ÀüÈ÷ °³°¡ µîÀåÇϴµ¥ Dog Ŭ·¡½º ±× ÀÚü´Â ´Ü¼øÈ÷ ¸Û¸ÛÇÏ°í Áþ´Â ±â´É¹Û¿¡ ¾ø´Ù. ÀÌ °³¿¡°Ô µµµÏÀ» ¦i´Â ±â´ÉÀ» Ãß°¡Çϱâ À§ÇØ Sentinel ¹Í½ºÀΠŬ·¡½º¸¦ Á¤ÀÇÇß´Ù. SentinelÀÇ OnThief ÇÔ¼ö´Â this¸¦ ÅÛÇø´ Àμö TŸÀÔÀ¸·Î ij½ºÆÃÇÑ ÈÄ Bark ÇÔ¼ö¸¦ È£ÃâÇϱ⸦ ´Ù¼¸¹ø ¼öÇàÇÑ´Ù. ¶ÇÇÑ ¿Ô´Ù¸® °¬´Ù¸® Çϸ鼭 µµµÏÀ» À§ÇùÇϱ⵵ ÇÑ´Ù.

¾Æ¹«¸® ¾Ö¿Ï°ßÀÏÁö¶óµµ ¿©·¯ ¹ø ¢°í À¸¸£··´ë¸é µµµÏ³ðµµ ±ÍÂú¾Æ¼­ ±×³É °¡±â ¸¶·ÃÀÌ´Ù. ¾î·µç µµµÏ³ðÀ» ¦i´Âµ¥´Â È®½ÇÈ÷ È¿°ú°¡ ÀÖ´Ù. main¿¡¼­ Dog ŸÀÔÀÇ °´Ã¼ Happy¸¦ »ý¼ºÇÑ ÈÄ OnThief ÇÔ¼ö¸¦ È£ÃâÇØ º¸¾Ò´Ù. ¢À¸¸é¼­ µµµÏÀ» À§ÇùÇÏ´Â µ¿ÀÛÀ» ¹«·Á ´Ù¼¸¹øÀ̳ª ¼öÇàÇÒ °ÍÀÌ´Ù.

 

mung mung

¿Ô´Ù¸® °¬´Ù¸®...

mung mung

¿Ô´Ù¸® °¬´Ù¸®...

 

¾ð¶æ º¸±â¿¡´Â º° ´ë´ÜÇÑ ±â´Éó·³ º¸ÀÌÁö ¾Ê´Â´Ù. Àúµý °É ÇÏ°í ½ÍÀ¸¸é OnThief ÇÔ¼ö¸¦ ±×³É Dog¿¡ ÀÛ¼ºÇØ ³ÖÀ¸¸é µÉ °Í ¾Æ´Ñ°¡? ÇÏÁö¸¸ OnThief°¡ ÇÏ´Â ÀÏÀÌ ÀÌ ¿¹Á¦Ã³·³ ±×¸® °£´ÜÇÑ µ¿ÀÛÀÌ ¾Æ´Ï¶ó¸é ¸Å Ŭ·¡½º¸¶´Ù ¶È°°Àº µ¿ÀÛÀ» ¹Ýº¹ÀûÀ¸·Î ±¸ÇöÇÏ´Â °ÍÀº ³¶ºñÀÌ´Ù. ¹Í½ºÀΠŬ·¡½º·Î Çѹø¸¸ Àß ÀÛ¼ºÇØ ³õÀ¸¸é ÆÄ»ý Ŭ·¡½º°¡ ÀÌ µ¿ÀÛÀ» ¾ÆÁÖ ½±°Ô Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù.

¹Ù·Î ¾Æ·¡ÂÊ¿¡ º¸¸é Cow Ŭ·¡½ºµµ Sentinel·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ¾Æ ¼Ò°¡ µµµÏÀ» ¦i´Â µ¿ÀÛÀ» ¸ÚÁö°Ô ¼öÇàÇÑ´Ù. °³¿Í´Â ´Þ¸® ¢´Â ¼Ò¸®°¡ ´Ù¸£±â´Â ÇÏÁö¸¸ À§ÇùÇÏ´Â È¿°ú´Â ºñ½ÁÇÏ´Ù. Bark ÇÔ¼ö°¡ ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇϱ⠶§¹®ÀÌ´Ù. °³³ª ¼Ò³ª Sentinel·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ±â¸¸ ÇÏ¸é µµµÏÀ» Àß ¦iÀ» ¼ö ÀÖ°Ô µÈ´Ù. Sentinel ÅÛÇø´Àº OnThief¶ó´Â µ¿ÀÛÀ» Á¤ÀÇÇϸç ÀÌ µ¿ÀÛÀº ÆÄ»ý Ŭ·¡½ºÀÇ ±â´ÉÀ¸·Î ¼¯¿©¼­ µé¾î°£´Ù. ±×·¡¼­ ¹Í½ºÀÎÀ̶ó°í ÇÑ´Ù.

±×·¸´Ù¸é »ó¼Ó°ú´Â ¹«¾ùÀÌ Æ²¸°°¡? »ó¼ÓÀº ºÎ¸ð¿¡¼­ ÀÚ½ÄÀ¸·Î ÀϹæÀûÀ¸·Î ¸â¹ö¸¦ ¹°·ÁÁÖ´Â °ÍÀÌÁö¸¸ ¹Í½ºÀÎÀº ºÎ¸ð°¡ ÀÚ½ÄÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù´Â ¸é¿¡¼­ ´Ù¸£´Ù. À̶§ ºÎ¸ð°¡ ÀÚ½ÄÀ» ÀνÄÇÏ´Â ¼ö´ÜÀº ¹Ù·Î ÅÛÇø´ÀÇ Àμö¸¦ ÅëÇؼ­ÀÌ´Ù. ´ç¿¬ÇÑ ¾ê±âÁö¸¸ ÅÛÇø´ Àμö´Â ºÎ¸ð°¡ ¿ä±¸ÇÏ´Â ÇÔ¼ö¸¦ ¹Ýµå½Ã ±¸ÇöÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù. Bark µ¿ÀÛÀ» ÇÒ ¼ö ¾ø´Â ¹ÙÄû¹ú·¹³ª Áö··ÀÌ´Â µµµÏÀ» ¦iÀ» ¼ö ¾ø´Ù. ¾Æ¹«¸® ¿Ô´Ù¸® °¬´Ù¸® ÇØ ºÁ¾ß ¹âÇô Áױ⸸ ÇÒ »ÓÀÌ´Ù.

WTL¿¡¼­ ¹Í½ºÀÎÀº ÅÛÇø´À» ÅëÇØ ¹Ì¸® ±¸ÇöµÈ Äڵ带 ÆÄ»ý Ŭ·¡½º·Î Àü´ÞÇÏ´Â ¾ÆÁÖ ÀϹÝÀûÀÎ ¹æ¹ýÀÌ´Ù. ´Ü¼øÇÑ ÇÔ¼ö È£Ãâ»Ó¸¸ ¾Æ´Ï¶ó ¸Þ½ÃÁö üÀΰú ÇÔ²² °áÇյǾî ƯÁ¤ ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ¹æ½ÄÀ» ºÎ¸ð À©µµ¿ì°¡ ¹Ì¸® ÇÁ·Î±×·¡¹ÖÇØ ³õÀ» ¼öµµ ÀÖ´Ù. ¹Í½ºÀÎÀ» ´çÀå ÀÌÇØÇϱâ´Â ½±Áö ¾ÊÀ¸¹Ç·Î ÀÏ´Ü ¿©±â±îÁö¸¸ Á¢¼öÇØ µÎ°í Â÷ÈÄ WTL ¼Ò½º¸¦ µé¿©´Ù º¸¸é¼­ ºÐ¼®ÇØ º¸±â ¹Ù¶õ´Ù.