์ฌ๋๋ค์ด ์์ธ๊ฐ ๋๋ฆฌ๋ค๊ณ ๋งํ๋ ๊ฒ์ ๊ณ์ ๋ณด์ง๋ง ์ฆ๊ฑฐ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ธ๊ฐ ์๋์ง ๋ฌป๋ ๋์ ์์ธ๊ฐ ๋ฐฐํ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฌผ์ด๋ณผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ธ๋ฅผ ์ธ์ ์ฌ์ฉํ ์ง, ๋๋ฆฐ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๋ด๊ฐ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ์์ธ๋ ์ฌ๋ฌ ๋ฒ ๋ฐํํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ๊ฐ ๋ฐํ ํ์ ๋ค๋ฅธ ์์ ์ ์ํํด์ผํ๋์ง ์ค์งํด์ผํ๋์ง ์ฌ๋ถ๋ ํ์ธํฉ๋๋ค. ๋ฐ๋ฉ ์ค์ง์๊ธฐ๋ฅผ ์ด๋ป๊ฒ ํ์ธํฉ๋๊น? ์์ธ ์ ํ๊ณผ ์คํ ์์น๋ฅผ ๋ณด์ ํ๋ ๋ ๋ฒ์งธ ์คํ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋์ฐฉํ ๋๊น์ง ๋ฐํํฉ๋๋ค. ๋๋ ๋ํ์ด ๋ ๋ฒ์งธ ์คํ์ด ๊ฑด ๋๋ฆฌ๋ ์ ์ผํ ์๊ฐ์ด ๋์ง๊ธฐ์ ๊ฐ ์๋ / ์ก๊ธฐ ๋๋ผ๊ณ ์ถ์ธกํ๊ณ ์์ต๋๋ค. ๋ฆฌํด ์ฝ๋๋ก ์ ์ฌํ ๋์์ ๊ตฌํํ๋ AFAICT๋ ๋์ผํ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ชจ๋ ์ถ์ธก ์ผ ๋ฟ์ด๋ฏ๋ก ์ค์ ๋ก ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์๊ณ ์ถ์ต๋๋ค.
์์ธ๋ ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
๋ต๋ณ
์ถ์ธกํ๋ ๋์ ์ ์ ๋ ์์ C ++ ์ฝ๋์ ์ฝ๊ฐ ์ค๋๋ Linux ์ค์น๋ก ์์ฑ ๋ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ดํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
class MyException
{
public:
MyException() { }
~MyException() { }
};
void my_throwing_function(bool throwit)
{
if (throwit)
throw MyException();
}
void another_function();
void log(unsigned count);
void my_catching_function()
{
log(0);
try
{
log(1);
another_function();
log(2);
}
catch (const MyException& e)
{
log(3);
}
log(4);
}
๋ก ์ปดํ์ผ g++ -m32 -W -Wall -O3 -save-temps -cํ๊ณ ์์ฑ ๋ ์ด์
๋ธ๋ฆฌ ํ์ผ์ ์ดํด ๋ณด์์ต๋๋ค.
.file "foo.cpp"
.section .text._ZN11MyExceptionD1Ev,"axG",@progbits,_ZN11MyExceptionD1Ev,comdat
.align 2
.p2align 4,,15
.weak _ZN11MyExceptionD1Ev
.type _ZN11MyExceptionD1Ev, @function
_ZN11MyExceptionD1Ev:
.LFB7:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
popl %ebp
ret
.LFE7:
.size _ZN11MyExceptionD1Ev, .-_ZN11MyExceptionD1Ev
_ZN11MyExceptionD1Ev์ด๋ค MyException::~MyException()์ปดํ์ผ๋ฌ๋ ์๋ฉธ์์ ์ธ๋ผ์ธ์ด ์๋ ์ฌ๋ณธ์ ํ์๋ก ๊ฒฐ์ , ๊ทธ๋์.
.globl __gxx_personality_v0
.globl _Unwind_Resume
.text
.align 2
.p2align 4,,15
.globl _Z20my_catching_functionv
.type _Z20my_catching_functionv, @function
_Z20my_catching_functionv:
.LFB9:
pushl %ebp
.LCFI2:
movl %esp, %ebp
.LCFI3:
pushl %ebx
.LCFI4:
subl $20, %esp
.LCFI5:
movl $0, (%esp)
.LEHB0:
call _Z3logj
.LEHE0:
movl $1, (%esp)
.LEHB1:
call _Z3logj
call _Z16another_functionv
movl $2, (%esp)
call _Z3logj
.LEHE1:
.L5:
movl $4, (%esp)
.LEHB2:
call _Z3logj
addl $20, %esp
popl %ebx
popl %ebp
ret
.L12:
subl $1, %edx
movl %eax, %ebx
je .L16
.L14:
movl %ebx, (%esp)
call _Unwind_Resume
.LEHE2:
.L16:
.L6:
movl %eax, (%esp)
call __cxa_begin_catch
movl $3, (%esp)
.LEHB3:
call _Z3logj
.LEHE3:
call __cxa_end_catch
.p2align 4,,3
jmp .L5
.L11:
.L8:
movl %eax, %ebx
.p2align 4,,6
call __cxa_end_catch
.p2align 4,,6
jmp .L14
.LFE9:
.size _Z20my_catching_functionv, .-_Z20my_catching_functionv
.section .gcc_except_table,"a",@progbits
.align 4
.LLSDA9:
.byte 0xff
.byte 0x0
.uleb128 .LLSDATT9-.LLSDATTD9
.LLSDATTD9:
.byte 0x1
.uleb128 .LLSDACSE9-.LLSDACSB9
.LLSDACSB9:
.uleb128 .LEHB0-.LFB9
.uleb128 .LEHE0-.LEHB0
.uleb128 0x0
.uleb128 0x0
.uleb128 .LEHB1-.LFB9
.uleb128 .LEHE1-.LEHB1
.uleb128 .L12-.LFB9
.uleb128 0x1
.uleb128 .LEHB2-.LFB9
.uleb128 .LEHE2-.LEHB2
.uleb128 0x0
.uleb128 0x0
.uleb128 .LEHB3-.LFB9
.uleb128 .LEHE3-.LEHB3
.uleb128 .L11-.LFB9
.uleb128 0x0
.LLSDACSE9:
.byte 0x1
.byte 0x0
.align 4
.long _ZTI11MyException
.LLSDATT9:
๋๋ผ๋ค! ์ผ๋ฐ ์ฝ๋ ๊ฒฝ๋ก์๋ ์ถ๊ฐ ์ง์นจ์ด ์ ํ ์์ต๋๋ค. ๋์ ์ปดํ์ผ๋ฌ๋ ํจ์ ๋์์๋ ํ
์ด๋ธ (์ค์ ๋ก๋ ์คํ ํ์ผ์ ๋ณ๋ ์น์
์ ์์)์ ํตํด ์ฐธ์กฐ๋๋ ์ถ๊ฐ ๋ผ์ธ ์ธ๋ถ ์์ ์ฝ๋ ๋ธ๋ก์ ์์ฑํ์ต๋๋ค. ๋ชจ๋ ์์
์ ์ด๋ฌํ ํ
์ด๋ธ ( _ZTI11MyExceptionis typeinfo for MyException)์ ๊ธฐ๋ฐ์ผ๋ก ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํ๋ฉ๋๋ค .
์ข์, ๊ทธ๊ฒ์ ์ค์ ๋ก ๋์๊ฒ ๋๋ผ์ด ์ผ์ด ์๋์๋ค. ๋๋ ์ด๋ฏธ์ด ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ป๊ฒํ๋์ง ์๊ณ ์์๋ค. ์ด์ ๋ธ๋ฆฌ ์ถ๋ ฅ์ ๊ณ์ํฉ๋๋ค.
.text
.align 2
.p2align 4,,15
.globl _Z20my_throwing_functionb
.type _Z20my_throwing_functionb, @function
_Z20my_throwing_functionb:
.LFB8:
pushl %ebp
.LCFI6:
movl %esp, %ebp
.LCFI7:
subl $24, %esp
.LCFI8:
cmpb $0, 8(%ebp)
jne .L21
leave
ret
.L21:
movl $1, (%esp)
call __cxa_allocate_exception
movl $_ZN11MyExceptionD1Ev, 8(%esp)
movl $_ZTI11MyException, 4(%esp)
movl %eax, (%esp)
call __cxa_throw
.LFE8:
.size _Z20my_throwing_functionb, .-_Z20my_throwing_functionb
์ฌ๊ธฐ์ ์์ธ๋ฅผ ๋์ง๋ ์ฝ๋๊ฐ ์์ต๋๋ค. ๋จ์ํ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์ค๋ฒ ํค๋๊ฐ ์์์ง๋ง ์ค์ ๋ก ์์ธ๋ฅผ ๋์ง๊ณ ์ก๋ ๋ฐ์๋ ๋ถ๋ช
ํ ๋ง์ ์ค๋ฒ ํค๋๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๋ค์ __cxa_throw์ ์ํํด์ผํฉ๋๋ค.
- ํด๋น ์์ธ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ฐพ์ ๋๊น์ง ์์ธ ํ ์ด๋ธ์ ๋์์ผ๋ก ์คํ์ ์ดํด๋ณด์ญ์์ค.
- ํด๋น ํธ๋ค๋ฌ์ ๋๋ฌ ํ ๋๊น์ง ์คํ์ ํธ์ญ์์ค.
- ์ค์ ๋ก ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ญ์์ค.
๊ฐ์ ๋จ์ํ ๋ฐํํ๋ ๋น์ฉ๊ณผ ๋น๊ตํ๋ฉด ์์ธ๊ฐ ์์ธ์ ์ธ ๋ฐํ์๋ง ์ฌ์ฉ๋์ด์ผํ๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
์๋ฃํ๋ ค๋ฉด ๋๋จธ์ง ์ด์ ๋ธ๋ฆฌ ํ์ผ :
.weak _ZTI11MyException
.section .rodata._ZTI11MyException,"aG",@progbits,_ZTI11MyException,comdat
.align 4
.type _ZTI11MyException, @object
.size _ZTI11MyException, 8
_ZTI11MyException:
.long _ZTVN10__cxxabiv117__class_type_infoE+8
.long _ZTS11MyException
.weak _ZTS11MyException
.section .rodata._ZTS11MyException,"aG",@progbits,_ZTS11MyException,comdat
.type _ZTS11MyException, @object
.size _ZTS11MyException, 14
_ZTS11MyException:
.string "11MyException"
typeinfo ๋ฐ์ดํฐ์ ๋๋ค.
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zPL"
.uleb128 0x1
.sleb128 -4
.byte 0x8
.uleb128 0x6
.byte 0x0
.long __gxx_personality_v0
.byte 0x0
.byte 0xc
.uleb128 0x4
.uleb128 0x4
.byte 0x88
.uleb128 0x1
.align 4
.LECIE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB9
.long .LFE9-.LFB9
.uleb128 0x4
.long .LLSDA9
.byte 0x4
.long .LCFI2-.LFB9
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI3-.LCFI2
.byte 0xd
.uleb128 0x5
.byte 0x4
.long .LCFI5-.LCFI3
.byte 0x83
.uleb128 0x3
.align 4
.LEFDE3:
.LSFDE5:
.long .LEFDE5-.LASFDE5
.LASFDE5:
.long .LASFDE5-.Lframe1
.long .LFB8
.long .LFE8-.LFB8
.uleb128 0x4
.long 0x0
.byte 0x4
.long .LCFI6-.LFB8
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI7-.LCFI6
.byte 0xd
.uleb128 0x5
.align 4
.LEFDE5:
.ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
.section .note.GNU-stack,"",@progbits
๋ ๋ง์ ์์ธ ์ฒ๋ฆฌ ํ ์ด๋ธ ๋ฐ ์ฌ๋ฌ ์ถ๊ฐ ์ ๋ณด.
๋ฐ๋ผ์ ์ ์ด๋ Linux์ GCC์ ๋ํ ๊ฒฐ๋ก ์ ์์ธ๊ฐ ๋ฐ์ํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ถ๊ฐ ๊ณต๊ฐ (์ฒ๋ฆฌ๊ธฐ์ ํ ์ด๋ธ์ ๊ฒฝ์ฐ)๊ณผ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ํ ์ด๋ธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์คํํ๋ ์ถ๊ฐ ๋น์ฉ์ ๋๋ค. ์ค๋ฅ ์ฝ๋ ๋์ ์์ธ๋ฅผ ์ฌ์ฉํ๊ณ ์ค๋ฅ๊ฐ ๋๋ฌผ๋ค๋ฉด ๋ ์ด์ ์ค๋ฅ๋ฅผ ํ ์คํธํ๋ ์ค๋ฒ ํค๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค .
๋ ๋ง์ ์ ๋ณด, ํนํ ๋ชจ๋ __cxa_๊ธฐ๋ฅ์ด ์ํํ๋ ์์
์ด ํ์ํ ๊ฒฝ์ฐ ์๋ ์ฌ์์ ์ฐธ์กฐํ์ญ์์ค.
๋ต๋ณ
์์ ์๋ ๋๋ฆฐ ์์ธ ๊ฐ ์ฌ์ค ์ด์์ต๋๋ค .
๋๋ถ๋ถ์ ํ๋ ์ปดํ์ผ๋ฌ์์ ์ด๊ฒ์ ๋ ์ด์ ์ฌ์ค์ด ์๋๋๋ค.
์ฐธ๊ณ : ์์ธ๊ฐ ์๋ค๊ณ ํด์ ์ค๋ฅ ์ฝ๋๋ ์ฌ์ฉํ์ง ์๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์ค๋ฅ๋ฅผ ๋ก์ปฌ์์ ์ฒ๋ฆฌ ํ ์์๋ ๊ฒฝ์ฐ ์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅ ์์ ์ ์ํด ๋ ๋ง์ ์ปจํ ์คํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์์ธ ์ฌ์ฉ : ์์ธ ์ฒ๋ฆฌ ์ ์ฑ ์ ์ด๋๋ ์์น์ ๋ฌด์์ ๋๊น?
์์ธ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ ์ฝ๋์ ๋น์ฉ์ ๊ฑฐ์ 0์ ๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ผ๋ถ ์์
์ด ์ํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋์ด๋ฅผ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๊ณ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ ํ ์์๋ ์ง์ ๊น์ง ๋ค์ ํ์ธํ๋ ๋น์ฉ๊ณผ ๋น๊ตํด์ผํฉ๋๋ค. ์์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ ๋ ๋ง์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
๋ํ ์ด๋ณด์๋ฅผ์ํ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์ธ ๊ฐ์ฒด๋ ์์ง๋ง ์ผ๋ถ ์ฌ๋๋ค์ ๊ทธ ์์ ๋ง์ ๊ฒ์ ๋ฃ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ธ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๋น์ฉ์ด ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ ๋ ๊ฐ์ง์
๋๋ค.
- ์์ธ์ ์ถ๊ฐ ํญ๋ชฉ์ ๋ฃ์ง ๋ง์ญ์์ค.
- const ์ฐธ์กฐ๋ก ์ก์๋ผ.
์ ์๊ฐ์๋ ์์ธ๊ฐ์๋ ๋์ผํ ์ฝ๋๊ฐ ์์ธ๊ฐ์๋ ์ฝ๋๋ณด๋ค ๋ ํจ์จ์ ์ด๊ฑฐ๋ ์ ์ด๋ ์์ธ๊ฐ์๋ ์ฝ๋๋งํผ ๋น์ทํ๋ค๊ณ ์๊ฐํฉ๋๋ค (ํ์ง๋ง ํจ์ ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๋ชจ๋ ์ถ๊ฐ ์ฝ๋๊ฐ ์์). ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฅ ์ฝ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฒ์์ ์์ฑํด์ผํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ฌด๋ฃ๋ก ์ ๊ณต๋์ง ์๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค (์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ๋ฌ๋ ์ฌ๋๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ ๋๋ค).
๋ต๋ณ
์์ธ๋ฅผ ๊ตฌํํ ์์๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก OS์ ์ผ๋ถ ๊ธฐ๋ณธ ์ง์์ ์์กดํฉ๋๋ค. Windows์์ ์ด๊ฒ์ ๊ตฌ์กฐํ ๋ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
Code Project : C ++ ์ปดํ์ผ๋ฌ๊ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋ํ ์ ์ ํ ๋ ผ์๊ฐ ์์ต๋๋ค.
์์ธ์ ์ค๋ฒ ํค๋๋ ์์ธ๊ฐ ํด๋น ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ํ๋๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ ์คํ ํ๋ ์ (๋๋ ๋ ์ ํํ๊ฒ๋ ๋ฒ์)์์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์๋ฉธ์์ผ์ผํ๋์ง ์ถ์ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ฑํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ํจ์์ ์๋ฉธ์๋ฅผ ํธ์ถํด์ผํ๋ ์ง์ญ ๋ณ์๊ฐ ์คํ์์๋ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ฑ๋ฅ ์ ํ๊ฐ ์์ด์ผํฉ๋๋ค.
๋ฐํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ํ ์์ค์ ์คํ ๋ง ํด์ ํ ์์๋ ๋ฐ๋ฉด, ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ค๊ฐ ์คํ ํ๋ ์์์ ์ํ ํ ์์ ์ด์๋ ๊ฒฝ์ฐ ํ ๋ฒ์ ์์ ์ผ๋ก ์คํ ์๋๋ก ํจ์ฌ ๋ ๋ค๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๋ต๋ณ
Matt Pietrek๋ Win32 Structured Exception Handling ์ ๋ํ ํ๋ฅญํ ๊ธฐ์ฌ๋ฅผ ์์ฑํ์ต๋๋ค . ์ด ๊ธฐ์ฌ๋ ์๋ 1997 ๋ ์ ์์ฑ๋์์ง๋ง ์ค๋๋ ์๋ ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค (๋ฌผ๋ก Windows์๋ง ์ ์ฉ๋จ).
๋ต๋ณ
์ด ๊ธฐ์ฌ ๋ ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋น์ฉ์ด ์๋นํ ๋ฎ์ง ๋ง ์ค์ ๋ก ์์ธ์ ๋ํ ๋ฐํ์ ๋น์ฉ์ด ์์์ ๋ฐ๊ฒฌํฉ๋๋ค. ์ข์ ๊ธฐ์ฌ, ์ถ์ฒํฉ๋๋ค.
๋ต๋ณ
๋ด ์น๊ตฌ๊ฐ ๋ช ๋ ์ ์ Visual C ++์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฝ๊ฐ ์ผ์ต๋๋ค.
๋ต๋ณ
๋ชจ๋ ์ข์ ๋๋ต.
๋ํ, ์ฝ๋๊ฐ ์์ธ๋ฅผ ๋์ง๋๋ก ํ์ฉํ๋ ๋์ ๋ฉ์๋ ์๋จ์์ ๊ฒ์ดํธ๋ก โif checksโ๋ฅผ ์ํํ๋ ์ฝ๋๋ฅผ ๋๋ฒ๊ทธํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด ์ง ์๊ฐํด๋ณด์ญ์์ค.
์ ์ข์ฐ๋ช ์ ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ทธ๊ฒ์ ๋ณด๋ ๋ค์ ์ฌ๋์ ์ํด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ 9 ๊ฐ์ ์์ ๋น์ ์ด๊ณ , ๋น์ ์ ๋น์ ์ ์ด๋ฆ์ ์ ์ฃผํ๊ณ ์ถ์ง ์์ต๋๋ค!