๋ฐ˜์‘ํ˜•

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ์š”?

ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ์•„์ฃผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ํ•ญ์ƒ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์•„๋ฌด๋ฆฌ ์ž˜ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด๋„, ๋ง‰์ƒ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด๋‚˜ ์กฐ์ž‘ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ์ง€๋Š” ์•Œ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ ์„œ์ (๊ธฐ์ดˆ ์–ธ์–ด ๋ฌธ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ์ฑ…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ• ๋“ฑ)์„ ๋ณด๋ฉด, ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด์•ผ ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ฐธ๊ณ ๋กœ, ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋‚˜์ค‘์— ์†Œ๊ฐœํ•  ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Handling)์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(Exception Handling) ๋ชจ๋‘๋ฅผ ํ†ต์นญํ•˜๋Š” ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์˜ˆ์™ธ(๋˜๋Š” ์˜ค๋ฅ˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์–ธ๊ธ‰ํ•  ์„ธ ๊ฐ€์ง€ ์™ธ์—๋„ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์˜ณ๊ณ  ๊ทธ๋ฅด๋‹ค๊ธฐ๋ณด๋‹ค๋Š” ์•„์ฃผ ๋ณดํŽธ์ ์ด๋‹ค๋ผ๋Š” ์˜๋ฏธ๋กœ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

1. ์˜ค๋ฅ˜ ๋ฌด์‹œํ•˜๊ธฐ

๋‹ค์†Œ ํ™ฉ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์€์—ฐ์ค‘์— ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

int printf_s(
   const char *format [,
   argument]...
);

https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/printf-s-printf-s-l-wprintf-s-wprintf-s-l?view=msvc-170

 

printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

์ž์„ธํ•œ ์ •๋ณด: printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

docs.microsoft.com

์ด ํ•จ์ˆ˜๋Š” ์ถœ๋ ฅ๋œ ๋ฌธ์ž ์ˆ˜ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋งค๋ฒˆ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์Œ์ˆ˜์ธ์ง€, ์ถœ๋ ฅ๋œ ๋ฌธ์ž ์ˆ˜์™€ ๊ฐ™์€์ง€ ํ™•์ธํ• ๊นŒ์š”? ์‚ฌ์‹ค ์ด ํ•จ์ˆ˜๊ฐ€ ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์•„์ฃผ ์ƒ๋‹นํžˆ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์›ฌ๋งŒํ•˜๋ฉด ๊ฑฐ์˜ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•  ๊ฒ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ, ์‚ฌ์†Œํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋“ค์€ ๊ทธ๋ƒฅ '๋ฌด์‹œ'ํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์ด ๋ชจํ˜ธํ•˜๊ณ  ๊ฒฌ๊ณ ํ•œ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ๋Š” ๋‹ค์†Œ ๊ฑฐ๋ฆฌ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์—๋Ÿฌ ์ฝ”๋“œ(Error Code) ๋ฐ˜ํ™˜ํ•˜๊ธฐ - Error Handling

ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์ ‘ํ•ด๋ดค์„ ํ…๋ฐ์š”. ์—๋Ÿฌ ์ฝ”๋“œ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๊ฐ€ ๋ฐ”๋กœ ๊ทธ๋Ÿฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ , int๋‚˜ ์—๋Ÿฌ๋ฅผ ์ •์˜ํ•œ struct๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์„œ์ ์—์„œ๋„ ์–ธ๊ธ‰ํ•˜๋Š” ๋‚ด์šฉ์ธ๋ฐ์š”. ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  if-else ๋ฌธ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

int result = doSomething();
if (result == 0)
{
    //๋™์ž‘ ์„ฑ๊ณต
}
else if (result == -1)
{
    //์—๋Ÿฌ1
}
else if (result == -2)
{
    //์—๋Ÿฌ2
}
//...

๋ฌผ๋ก , ๋ณดํ†ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

int result = doSomething();
if (result != 0)
{
    //์˜ค๋ฅ˜ ๋ณด๊ณ 
}
//...

์ด ๋ฐฉ๋ฒ•๋ก ์˜ ํ•ต์‹ฌ์€, ๋งค๋ฒˆ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๊ณผ ๋ฐ˜ํ™˜ ์ฝ”๋“œ์— ๋”ฐ๋ผ if-else๋ฌธ์ด ๋งŽ์•„์ง€๋ฉด ์œ ์ง€๋ณด์ˆ˜์— ๊นŒ๋‹ค๋กœ์›€์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

3. ์˜ˆ์™ธ(Exception) ์‚ฌ์šฉํ•˜๊ธฐ - Exception Handling

์–ด๋Š ์„œ์ ์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ํŒŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹ค๋“ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก , ํ•ญ์ƒ ์ข‹์€ ์ ๋งŒ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ฃ ). ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ์กฐ์น˜ํ•˜๊ธฐ๊ฐ€ ๊ฐ„ํŽธํ•˜๋ฉฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์›์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ C++ ๋ฌธ๋ฒ•์€ ์•„์ฃผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(๋ณธ๋ฌธ์—์„œ๋Š” ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

//C++
void doSomething()
{
    //...
    thorw std::exception("์˜ˆ์™ธ ๋ฉ”์‹œ์ง€");
}

int main()
{
    try
    {
        doSomething();
    }
    catch(const std::exception &e)
    {
        //e.what();
    }
}

ํŠน์ • ํ•จ์ˆ˜์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง‘(throw)๋‹ˆ๋‹ค. ๋˜์ ธ์ง„ ์˜ˆ์™ธ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด try-catch ๋ธ”๋ก๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ „ํŒŒ๋˜๊ณ , catch๋œ ์˜ˆ์™ธ์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ C#์—์„œ๋Š” Exception ๊ฐ์ฒด์˜ StackTrace๋ฅผ ํ†ตํ•ด ์–ด๋””์„œ ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์กŒ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

static void doSomething()
{
    throw new Exception("์˜ˆ์™ธ ๋ฐœ์ƒ!");
}

static void Main(string[] args)
{
    try
    {
        doSomething();
    }
    catch(Exception exc)
    {
        Console.WriteLine(exc.StackTrace);
        Console.WriteLine(exc.Message);
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด StackTrace๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์™€ ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง„ ์†Œ์Šค ์ฝ”๋“œ์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • C++ For Game Programmers - Second Edition, Michale J. Dickheiser

 

๋ฐ˜์‘ํ˜•