¡Ô µ¨ÆÄÀÌ °ÔÀÓ Á¦ÀÛ ¼ÒÇ°

 ¡å Assembled Sprite

Delphi

¼Ò½ºêó

Assembled Sprite°¡ ¹«¾ùÀ̳Ä. ¹ú½á ¾Ë°í ÀÖ¾ú´Ù¸é ÀÌ»óÇÑ °ÍÀÌ´Ù ³»°¡ Áö¾î³½ ¸»À̴ϱî.
ÀÌ°ÍÀÇ ¾ÆÀ̵ð¾î´Â Compiled SpriteÀÇ ¿ø¸®¸¦ ±Ù°£À¸·Î ÇÑ´Ù.

´Ü, Compiled Sprite´Â ½Ç½Ã°£¿¡ ÄÄÆÄÀÏµÈ µ¥ÀÌÅ͸¦ ¸¸µé ¼ö ÀÖ°í ±×°ÍÀ» ¾Æ¿¹ ¾î¼Àºí·¯ ¼öÁØ¿¡¼­ ¸µÅ©Çϱ⵵ ÇÑ´Ù. ({$L ..}¿É¼ÇÀÌ´ø°¡..) ÇÏÁö¸¸ ÀÌ°ÍÀº Àü󸮸¦ ÅëÇØ pascal inline assembly language Äڵ带 »ý¼ºÇÏ°í ±×°ÍÀ» ´Ù½Ã µ¨ÆÄÀÌ ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏÇÏ¿© ½ºÇÁ¶óÀÌÆ®¸¦ ÀÚ½ÅÀÇ ½ÇÇà ÆÄÀÏ ¼ÓÀ¸·Î ¼û±ä´Ù. 

¿¹Àü¿¡ MMX¸¦ ÀÌ¿ëÇÑ '¹«ºÐ±â ½ºÇÁ¶óÀÌÆ®'±â¹ýÀ» ¼Ò°³ÇÑ ÀûÀÌ ÀÖ´Ù.
±×¶§´Â MMX ¸í·É¾î¿¡ ±âº»À¸·Î Æ÷ÇԵǾî ÀÖ´Â ¸¶½ºÅ· ¸í·ÉÀ» ½è´ø °ÍÀÌ´Ù. ±×·¡¼­ ½ºÇÁ¶óÀÌÆ® Ãâ·Â¿¡ Çʼö Äڵ忴´ø if ¹®À» »¬ ¼ö ÀÖ¾ú´Ù. ±×·¸´Ù¸é À̹øÀÇ Assembled Sprite´Â ¹«¾ùÀΰ¡? ÀÌ°ÍÀº if ¹® »Ó¸¸ ¾Æ´Ï¶ó sprite Ãâ·Â ·çƾÀ̶ó¸é ÇʼöÀûÀ¸·Î °¡Áö°í ÀÖ´ø for ·çÇÁ 2°³¸¦ ¸ðµÎ »ý·«ÇÑ °ÍÀÌ´Ù.
 

ÀÚ ±×·³ ¿ø¸®ºÎÅÍ ¼³¸íÇϱâ À§ÇÑ ±âº» Á¶°ÇÀ» º¸ÀÚ¸é, 

1. µ¨ÆÄÀÌ´Â ÀζóÀÎ ¾î¼Àºí¸®¾î¸¦ Áö¿øÇÑ´Ù.
2. µ¨ÆÄÀÌ´Â ÇÔ¼öÇü ŸÀÔÀ» ¼±¾ð ÇÒ ¼ö ÀÖ´Ù.
3. µ¨ÆÄÀÌ´Â fastcallÀ» Áö¿øÇÑ´Ù.

÷ºÎÆÄÀÏ (28K) (Delphi 5¿¡¼­ ÀÛ¼ºµÇ¾úÀ½)

1. ¿ø¸®

°íÀüÀûÀÎ ½ºÇÁ¶óÀÌÆ® Ãâ·Â ·çƾÀº ÀÌ·¸´Ù.
 
for y = 0 to sprite.height - 1
    for x = 0 to sprite.width - 1
        if sprite.data[x][y] <> color_key
            frame_buffer[x_offset + x][y_offset + y] = sprite.data[x,y]
        end if
    end for
end for
 
ÀÌ ·çƾÀ» º¸¸é Å©°Ô Á¡ÇÁ¹®ÀÌ 3±ºµ¥ ÀÖ´Ù. for ·çÇÁ º¹±Í¸¦ À§ÇÑ 2°³¿Í if ¹®À» À§ÇÑ 1°³ÀÌ´Ù. ƯÈ÷ if¹®Àº for ·çÇÁ 2°³ »çÀÌ¿¡ Ç×»ó È£ÃâµÇ´Â °ÍÀ̹ǷΠÆÛÆ÷¸Õ½º ÀúÇϸ¦ °¡Á®¿À´Â ÁÖµÈ ¿øÀÎÀÌ µÈ´Ù. ±×·¡¼­ ³ª¿Â °ÍÀÌ ÈçÈ÷ '0¹ø ¾ÐÃà'À̶ó°í ºÒ¸®´Â ¦Åü RLEÀÌ´Ù. ÀÌ°ÍÀº if ¹®Àº Á¦°ÅÇÒ ¼ö ÀÖÁö¸¸ Àû¾îµµ 2°³ÀÇ for ¹®(ÆÐÅÏ¿¡ ij¸®Áö ¸®ÅÏ Á¤º¸¸¦ ³ÖÀ¸¸é 1°³·Î °¡´É)ÀÌ ÇÊ¿äÇÏ´Ù.
 
±×·³ ÀÌÁ¦ ¸»ÇÏ°íÀÚ ÇÏ´Â Assembled Sprite¸¦ º¸ÀÚ. ÀÌ°ÍÀº ½ºÇÁ¶óÀÌÆ®ÀÇ raw data·ÎºÎÅÍ Àü󸮸¦ ÅëÇØ inline assembly language¸¦ »ý¼ºÇÑ´Ù°í Çß´Ù. ±×¸®°í ±× ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
ÀÌ°ÍÀº ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍÀ̱ä ÇÏÁö¸¸ µ¥ÀÌÅÍ ÀÚü°¡ ÇϳªÀÇ ÄÄÆÄÀÏ °¡´ÉÇÑ inline assembly language ÀÌ´Ù.
 
    jmp @@START
    [sprite header]
 
@@START:
    [sprite data copying]
    [transparent data skipping]
    .......
    [sprite data copying]
    [transparent data skipping]
 
    ret
 
@@DATA00001:
    [sprite data]
@@DATA00002:
    [sprite data]
    .......
 
º¸½Ã´Ù½ÃÇÇ ¸ÞÀÎ ·çƾ¿¡ Á¡ÇÁ¹®Àº ÀüÇô ¾ø´Ù. °è¼Ó Á¤ÇØÁø´ë·Î µ¥ÀÌÅ͸¦ º¹»çÇÏ°í ½ºÅµÇÑ ÈÄ ret¸¦ ¸¸³ª¼­ ÇÔ¼ö¸¦ ³¡³»¸é µÈ´Ù.
¶ÇÇÑ »ç¿ëÇÏ´Â »ç¶÷µµ ´ÜÁö ÇÔ¼öó·³ ºÎ¸£±â¸¸ ÇÏ¸é ¾Ë¾Æ¼­ Ãâ·ÂÀÌ µÈ´Ù.
 
µ¥ÀÌÅÍ°¡ ½ÇÇàÆÄÀÏ ¼Ó¿¡ ÇÔ¼öÀÇ ÇüÅ·Π¼û±â ¶§¹®¿¡ À¯ÃâµÇ±âµµ ¾î·Æ°í, Àüü foot-printµµ ÀÛ¾ÆÁø´Ù.
÷ºÎÆÄÀÏÀÇ »ùÇÃÀ» ±âÁØÀ¸·Î ÇßÀ» ¶§ , ÀϹÝÀûÀΠ¸®¼Ò½º Çü½ÄÀ¸·Î´Â (22080+bmpÇì´õ)bytes °¡·®ÀÌ Áõ°¡Çϴµ¥ ¹ÝÇØ ÀÌ ¹æ½ÄÀ» ¾²¸é 18432bytes¸¸ ´Ã¾î ³µ´Ù. (Delphi 5¿¡¼­ Å×½ºÆ®)
¹°·Ð ´ÜÁ¡µµ ÀÖ´Ù.
 
1. ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ¿¡ Ãâ·Â ·çƾÀÌ »ðÀԵDZ⠶§¹®¿¡ Ư¼öÈ¿°ú¸¦ Áֱ⠾î·Æ´Ù.
   (Ư¼öÈ¿°ú¸¦ ÁÖ·Á¸é ±×°ÍÀÌ °¡´ÉÇϵµ·Ï Àü󸮱⸦ »õ·Î ¸¸µé¾î¾ß ÇÑ´Ù.)
2. Ŭ¸®ÇÎÀÌ ¾î·Æ´Ù.
   (Á÷Á¢ frame buffer¿¡ ¾²´Â °ÍÀº Ŭ¸®ÇÎÀÌ ºÒ°¡´ÉÇÏ°í Àû¾îµµ double bufferingÀÌ µÇ¾î¾ß Ŭ¸®ÇÎ
    È¿°ú°¡ °¡´ÉÇÏ´Ù.)
3. ½ºÇÁ¶óÀÌÆ® Çü½ÄÀÌ ¾Æ´Ò¶§´Â µµ¸®¾î »çÀÌÁî°¡ Ä¿Áø´Ù.
4. ÇÑ ¼Ò½º´Â ÇϳªÀÇ color depth¿¡¸¸ À¯È¿ÇÏ´Ù.

2. ÷ºÎ ÆÄÀÏ ¼³¸í

Uni1.pas
    Assembled Sprite¸¦ ½ÇÇèÇÒ ¼ö ÀÖ´Â 3°³ÀÇ ¹öÆ°ÀÌ ÀÖ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.
    ¿ÞÂÊ µÎ °³ÀÇ ¹öÆ°Àº °¢°¢ Assembled Sprite¿Í ÀÏ¹Ý ½ºÇÁ¶óÀÌÆ® Ãâ·Â ·çƾ¿¡ ´ëÇÑ ¼Óµµ ºñ±³´Ù.
    °¡Àå ¿À¸¥ÂÊÀÇ ¹öÆ°Àº 'test.bmp'¸¦ Àо ±×°ÍÀº Assembled Sprite ÄÚµå·Î Ãâ·Â ÇØ ÁÖ´Â ¿¹Á¦´Ù.
    ¸ðµç ¿ë¹ýÀº ÀÌ ¾È¿¡ µé¾î°¡ ÀÖ´Ù. ¿¹Á¦´Â ºñ·Ï 15bits Ä÷¯¿¡¼­ µ¿ÀÛÇÏÁö¸¸ ÃæºÐÈ÷ 8 bits index
    mode³ª 32 bits true color mode¿¡¼­µµ µ¿ÀÛÇϵµ·Ï ¼öÁ¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
 
UFrameBuffer.pas
    TBitmapÀ» »ó¼Ó¹Þ¾Æ ¸¸µç °¡»ó frame buffer¸¦ ±¸ÇöÇϱâ À§ÇÑ Å¬·¡½º´Ù.
    ÀÌ frame buffer¸¦ ÅëÇØ ½ºÇÁ¶óÀÌÆ®¸¦ Ãâ·ÂÇÏ°í ÃÖÁ¾ÀûÀ¸·Î form¿¡ ³ªÅ¸³ª°Ô ÇÑ´Ù.
 
UAsmSprite.pas
    Assembled Sprite¸¦ ¸¸µé±â À§ÇÑ Å¬·¡½º´Ù.
    ƯÁ¤ÇÑ bmp¿Í ±×¿¡ ´ëÇÑ color key¸¦ ÁöÁ¤Çϸé TStringListÀÇ ÇüÅ·ΠÄڵ带 »ý¼ºÇØ ³½´Ù.
    ÇöÀç´Â 15 bits Àü¿ëÀÌÁö¸¸ ¾à°£ÀÇ ¼öÁ¤À¸·Îµµ ÃæºÐÈ÷ ´Ù¸¥ ¸ðµå¿ëÀ» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù.
 
USpriteData.pas
    Assembled Sprite¸¦ ÅëÇØ ¸¸µé¾îÁø ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ°¡ ÀÖ´Â unit´Ù.
 

3. ÷ºÎ ³»¿ë ¼³¸í (UAsmSprite.pas)

    ÀÌ unitÀº ÇϳªÀÇ Å¬·¡½º·Î ÀÌ·ç¾îÁ® ÀÖ´Ù. ±â´ÉÀº TBitmapÀ¸·Î Assembled Sprite ½ºÆ®¸µÀ» »ý¼ºÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.

    ¾Æ·¡´Â ±× Ŭ·¡½ºÀÇ ¼±¾ðÀÌ´Ù.

    ==========================================================================
    TAssembledSprite = class
    public
        constructor Create(const srcImage: TBitmap; const Id: string;
                           colorKey: word);
        
    procedure Free();
    public
        spriteCode: TStrings;
    end;
    ==========================================================================

    »ý¼ºÀÚ¿¡´Â srcImage¶ó°í ÇÏ´Â TBitmap Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¹Þ´Â´Ù. ÇöÀç´Â srcImageÀº PixelFormatÀÌ pf15bit¸¸ Áö¿øµÈ´Ù. (ÇÏÁö¸¸ ÃæºÐÈ÷ È®Àå °¡´ÉÇÏ´Ù) ±×¸®°í Assembled SpriteÀÇ À̸§ÀÇ Á¢¹Ì»ç¸¦ ºÙÀÏ ¼ö ÀÖ´Â Id¶ó´Â ½ºÆ®¸µÀ» ¹ÞÀ¸¸ç, ¸¶Áö¸· ÆĶó¹ÌÅÍ·Î Ä÷¯Å°¸¦ ¹Þ´Â´Ù. ¹°·Ð À̶§ÀÇ Ä÷¯Å°µµ pf15bit ÇüÅ·ΠÁÖ¾î¾ß ÇÑ´Ù.

    ÀÌ Å¬·¡½º´Â »ý¼º ½Ã »ý¼ºÀÚ¿¡ ÆĶó¹ÌÅ͸¦ ³Ñ±â±â¸¸ Çϸé Assembled Sprite·Î ±¸¼ºµÈ TStringListÇüÀÇ public ÇʵåÀÎ spriteCode¿¡ ±× °á°ú°¡ µé¾î °¡°Ô µÈ´Ù.

    ±×·¸´Ù¸é À̹ø¿¡´Â Assembled Sprite¸¦ ¸¸µå´Â ¿ø¸®¸¦ ¾Ë¾Æ º¸ÀÚ.

    ´ÙÀ½°ú °°Àº ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ(1byte ´ÜÀ§)°¡ ÀÖÀ¸¸ç Ä÷¯Å°´Â $00 À̶ó°í Çϸé,

    00 00 00 00 00 1A 35 36 85 00 00 00 15 7F 35 56 00 00 1E 3D 00 00 00

    ¾Æ¸¶µµ °íÀüÀûÀÎ Äڵ忡´Â ¾î¶² Á¤ÇØÁø ½ºÇÁ¶óÀÌÆ® ó¸® ·çƾ¿¡¼­ 00ÀÎ Ä÷¯Å°¸¦ ÆǺ°ÇÏ¿©, Ä÷¯Å°°¡ ¾Æ´Ò ¶§¸¸ È­¸é¿¡ Ãâ·ÂÇÏ·Á°íÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ Assembled Sprite¿¡¼­´Â À§ÀÇ °ÍÀ» ´ÙÀ½°ú °°Àº assembly language ÄÚµå·Î ¸¸µé¾î ÁØ´Ù.

    =========================================================================
    mov  edi, 5 // Ãâ·Â ¹öÆÛ 5 bytes À̵¿
    lea  esi, @@DATA0001 // @@DATA0001 ¹øÁö¸¦ esi·Î ÁöÁ¤
    mov  ecx, 4 // º¹»çÇÒ ¹ÙÀÌÆ® ¼ö ÁöÁ¤
    rep  movsb  // º¹»ç

    mov  edi, 3
    lea  esi, @@DATA0002
    mov  ecx, 4
    rep  movsb

    mov  edi, 2
    lea  esi, @@DATA0003
    mov  ecx, 2
    rep  movsb

    mov  edi, 3
    ......

    ret
    // ÇÔ¼ö ³¡

    @@DATA0001:
        db $1A, $35, $36, $85
    @@DATA0002:
        db $15, $7F, $35, $56
    @@DATA0003:
        db $1E, $3D
    ==========================================================================

    Ä÷¯Å°¸¦ Á¦¿ÜÇÑ µ¥ÀÌÅ͸¸ ÇÔ¼ö ³»¿¡ Æ÷ÇÔµÇ¸ç ½ºÅµµÇ´Â Ä÷¯Å°¿¡ ´ëÇÑ Á¤º¸´Â assembly language·Î Ç¥ÇöµÈ´Ù. ¿©±â¼­´Â ¾î¶°ÇÑ Á¡ÇÁ¹®µµ ¾î¶°ÇÑ ºñ±³¹®µµ »ç¿ëµÇÁö ¾Ê°í ¿ÀÁ÷ Ãâ·ÂÀ» À§ÇØ ¹öÆÛ Æ÷ÀÎÅ͸¦ Áõ°¡½ÃÅ°´Â ¸í·É¸¸ÀÌ Á¸ÀçÇÑ´Ù.

    ÀÌ·¸°Ô ¸¸µé¾îÁø assembly language´Â spriteCode¶ó´Â TStringList Çü ÀνºÅϽº ¾È¿¡ 'ÇÔ¼öÀÇ ¼Ò½º ÄÚµå' ÇüÅ·ΠÁ¸ÀçÇÑ´Ù. µû¶ó¼­ ÀÌ°ÍÀ» º¹»çÇÑ ÈÄ ½ÇÁ¦ ÀÚ½ÅÀÇ ÆÄÀÏ¿¡ »ðÀÔÇÏ¿© ÄÄÆÄÀÏ Çϱ⸸ ÇÏ¸é ¸ðµç °ÍÀÌ ³¡ÀÌ´Ù. (³»¿ëÀº ÷ºÎÇÑ ¿¹Á¦¸¦ Á÷Á¢ ½ÇÇà½ÃÄÑ º¸¸é ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù.)

    °¡Àå °£´ÜÇÑ »ç¿ë ÇüÅ´ ´ÙÀ½°ú °°´Ù.

    ==========================================================================
    var
        bgImage: TBitmap;
        spriteCode: TAssembledSprite;
    begin
        bgImage := TBitmap.Create;
        bgImage.LoadFromFile(
    './test.bmp');
        bgImage.PixelFormat := pf15Bit;

        spriteCode := TAssembledSprite.Create(bgImage,
    'Test', $001F);
        Memo1.Lines.Assign(spriteCode.spriteCode);
        spriteCode.Free;

        bgImage.Free;
    end;
    ==========================================================================

4. ÷ºÎ ³»¿ë ¼³¸í (UFrameBuffer.pas)

    ÀÌ Å¬·¡½º´Â Assembled Sprite¸¦ À§Çؼ­ Ưº°È÷ ±¸ÇöÇÑ °¡»ó frame buffer Ŭ·¡½ºÀÌ¸ç ½ÇÁ¦·Î´Â TBitmapÀ» »ó¼Ó¹Þ¾Æ ÀÌ¿ëÇÏ°í ÀÖ´Ù.

    ¾Æ·¡´Â ±× Ŭ·¡½ºÀÇ ¼±¾ðÀÌ´Ù.

    ==========================================================================
    TSpriteProc = procedure(const pAddr: pointer; const pitch: longint); register;

    TFrameBuffer =
    class(TBitmap)
    public
        constructor Create(w, h: integer);

    private
        m_pSurface: pointer;
        m_pitch: longint;

    public
        procedure DrawImage(x, y: integer; const proc: TSpriteProc); overload;
        
    procedure DrawImage(x, y: integer; const bitmap: TBitmap;
                            
    const colorKey: word); overload;
        
    procedure Flush(const canvas: TCanvas; x, y: integer);

    end;
    ==========================================================================

    TSpriteProc ŸÀÔÀº Assembled Sprite·Î ¸¸µé¾îÁø ÇÔ¼ö¿¡ ´ëÇÑ Å¸ÀÔÀÌ´Ù. ÇÔ¼öÀÌÁö¸¸ º¯¼öó·³ ¾µ ¼ö ÀÖ°Ô Çϱâ À§Çؼ­ ÀÌ·± ÇüÅ·Π¼±¾ðÇß´Ù. ÀÚ¼¼ÇÑ ¿ë¹ýÀº ¾Æ·¡ÀÇ ³»¿ëÀ» ÂüÁ¶ÇÏ¸é µÈ´Ù.

    TFrameBuffer Ŭ·¡½ºÀÇ »ý¼ºÀÚ Create()´Â frame bufferÀÇ Å©±â¸¦ Á¤ÀÇÇÑ´Ù. w¿Í h´Â °¢°¢ ³Êºñ¿Í ³ôÀ̸¦ ³ªÅ¸³»¸ç color depth´Â ÀÏ´Ü 16 bits·Î °íÁ¤µÇ¾î ÀÖ´Ù. (¿ª½Ã ¼öÁ¤ °¡´ÉÇÏ´Ù.)

    public ¸Þ¼Òµå´Â µü 3°³°¡ ÀÖ´Ù. ±× Áß¿¡ ù ¹ø° DrawImage()´Â (x, y)ÀÇ À§Ä¡¸¦ Á»ó´Ü ÁÂÇ¥·Î ÇÏ¿© Assembled Sprite¸¦ Ãâ·ÂÇÏ°Ô ÇØÁØ´Ù. ½ÇÁ¦ procÀº ÇÔ¼öÀÌÁö¸¸ ¿©±â¼­´Â ÆĶó¹ÌÅÍó·³ »ç¿ëÇÏ¸é µÈ´Ù. µÎ ¹ø° Drawimage()´Â TBitmap Ŭ·¡½ºÀÇ À̹ÌÁö µ¥ÀÌÅ͸¦ ¹Þ¾Æ¼­ ¶È°°Àº Ãâ·ÂÀ» ÇÑ´Ù. ÀÌ°ÍÀÌ Á¸ÀçÇÏ´Â ÀÌÀ¯´Â ´ÜÁö ¼Óµµ ºñ±³¸¦ À§Çؼ­ÀÌ´Ù. ±×¸®°í ¸¶Áö¸· ¸Þ¼Òµå´Â Flush()ÀÌ´Ù. ÀÌ°ÍÀº ÁöÁ¤ÇÑ canvasÀÇ (x, y)ÀÇ À§Ä¡¸¦ Á»ó´Ü ÁÂÇ¥·ÎÇÏ¿© frame bufferÀÇ ³»¿ëÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù.

    ±¸Çö ÀÚü´Â ¾ÆÁÖ °£´ÜÇϹǷΠ÷ºÎµÈ ¼Ò½º¸¦ ÅëÇؼ­ È®ÀÎÇϱ⠹ٶõ´Ù.

5. ÷ºÎ ³»¿ë ¼³¸í (USpriteData.pas)

    Assembled Sprite¸¦ ÅëÇØ ¸¸µé¾îÁø ÇÔ¼ö¸¦ µû·Î unitÀ¸·Î ¶¼¾ú´Ù. º¸½Ã´Ù½ÃÇÇ ÄÚµå ÀÚüÀÇ ¶óÀμö°¡ ³»¿ë¿¡ ºñÇØ ±²ÀåÈ÷ Å©±â ¶§¹®¿¡ µû·Î ºÐ¸®ÇÑ °ÍÀÌ´Ù. ¶óÀÎ ¼ö´Â ¸¹Áö¸¸ ÀÌ µ¥ÀÌÅ͸¦ Á÷Á¢ bitmapÀ¸·Î ´Þ°í ´Ù´Ï´Â °Íº¸´Ù´Â ¹ÙÀ̳ʸ®ÀÇ Å©±â°¡ ÀÛ¾ÆÁø´Ù.