코드에 대한 간단한 질문

illos의 이미지

코딩 습관과도 관련된 이야기입니다만,

함수를 만들 때 실행되지 않아야 할 조건 등을 미리 걸러서 예외 처리를 하는 것이 좋은 습관으로 믿고 있습니다.

int foo(void)
{
if(unexpected_condition)
{
return -1; /*함수를 시행하지 말아야할 조건*/
}
else /*질문1: 여기 else를 쓰는 것과 안쓰는 것이 이론적이 아닌 실용적으로 차이가 있습니까? */
{
/*아래의 함수들이 매 실행될 때마다 컴퓨터는 if(unexpected_condition) 조건을 체크합니까? */
do_something1();
do_something2();
do_something3();
return 0;
}
}

위의 것을 아래와 같이 쓰는 습관은 좋지 않은 것 같습니다. 함수가 짧으면 상관 없는데 함수가 길어지면
괄호가 점점 깊어지니까요.

int foo_2(void)
{
if(!unexpected_condition)
{
do_something1();
do_something2();
do_something3();
return 0;
}
return -1;
}

HDNua의 이미지

1. foo 함수 내부의 if ~ else 구문에서 else 유무의 차이가 있는가?
>> 이 상황에선 if절 내에서 함수를 탈출하고 있기 때문에 결과적으로 차이는 없습니다.
일반적으로는 어떤 식으로든 조건을 통과한 다음에도 처리해야 할 과정이 남아있는 경우에
else절을 이용하여 그 과정을 else 이후에 집어넣지요.

2. else절 내부의 문장을 수행할 때마다 조건문이 체크되는가?
>> 상식적으로 그럴 이유가 없다고 생각합니다. do_something() 함수 내부에 그런 조건문이
있지 않은 한, 그냥 해당 문장 이하를 순차적으로 읽어내려가는 것이 전부겠지요.

3. 예외 처리의 위치
>> 예외는 예외가 발생할 지점에서 그때그때 처리를 하는 것이지,
모든 예외를 위로 올리거나 아래로 내려서 처리를 하는 것은 아닙니다.
스택에 대한 함수 push를 생각해봅시다.

int push(stack *pstack, int data)
{
    node *pnode;
    if (!pstack)    // 적절하지 않은 스택의 예외 처리
        return ERR_STACK_IS_NULL;
 
    pnode = make_node(data);
    if (!pnode)     // 노드 생성에 실패한 경우의 예외 처리
        return ERR_NODE_ALLOC_FAILED;
 
    pstack->size += 1;
    pnode->next = pstack->head;
    pstack->head = pnode;
 
    return 0;
}

'예외'는 말 그대로 예상하지 못한 상황을 말합니다.
foo_2와 같이 함수를 만들지 않는 이유는 함수를 사용하면서, 그 함수에서
올바른 결과보다 예외가 더 많이 발생할 거라고 생각하지는 않기 때문입니다.
괄호가 깊어지는 건 크게 신경써야 할 문제는 아닙니다.

-----
사실 예외 처리를 조건문으로 수행하는 건 코드를 분석하면서 해당 부분이
단순한 조건 분기인지, 예외 처리를 하는 건지 헷갈리게 하기 때문에
C++이라는 언어에서는 try ~ catch를 이용한 예외 처리 문법을 따로 지원합니다.
궁금하시면 더 찾아보시구요.

저는 이렇게 생각했습니다.

illos의 이미지

if(a!=0){ do_something1();}
else
{
do_something1();
/* 여기서 a가 0일 수도 있다는 뜻인지요? */
do_something2();
}

klyx의 이미지

"아래의 함수들이 매 실행될 때마다 "를, do_something1()가 실행되고, do_something2()가 실행되고, do_something3()가 실행되는 각각의 매번이라고 해석하신듯합니다.
당연히 매번 조건 체크를 해야 else절로 들어갈지 말지를 결정할 수 있습니다. 만약 if(foo()) {} else {} 라면 이 if문을 만날때마다 foo() 함수가 호출됩니다.

illos의 이미지

if(a!=0)
{
do_something_0();
return;
}
else
{
/*일단 여기로 들어온 이상*/
do_something_1();
/* 여기서는 a의 값이 무엇이든 상관 없이 실행됨*/
do_something_2();
}

/*그러므로 위의 코드는 아래와 같은 것으로 보이는데 맞나요?*/
if(a!=0)
{
do_something_0();
return;
}
do_something_1();
do_something_2();

결국 if ~ else ~ 절에서 판단은 한 번만 이뤄진다는 것이 핵심인 것 같은데 그게 맞는 것 같군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.