왜 코드 한 줄만 반복할 때에도 블록으로 감싸줘야 해요?

조회수 2697회

제가 C++강의를 듣고 있는데 거기 교재에서

  • 들여쓰기 잘 할 것
  • 연산자 우선순위를 믿지 말고 괄호를 써서 연산 순서를 표시할 것
  • 한 줄을 쓰더라도 { } 블록을 쓸 것 -> 왜죠????????
  • 비교를 할 때는 const 객체를 왼쪽에 쓸 것
  • 0 이상의 숫자에서는 unsigned를 쓸 것
  • delete 한 포인터는 NULL로 설정해 줄 것

이렇게 적혀있던데 다른 건 뭐 가독성이나 안전상의 이유 같은 걸로 납득할 수 있는데 한 줄 쓸 때도 {}을 쓰라는 건 이해가 안돼요.

제가 보기에는 소스코드 1같이 쓰는 건 코드가 더러워 보이기만 하는데 무슨 장점이 있길래 저렇게 쓰라는 거죠?

소스코드1

int j = 0;
for (int i = 0 ; i < 100 ; ++i)
{
    if (i % 2 == 0)
    {
        j++;
    }
}

소스코드2

int j = 0;
for (int i = 0 ; i < 100 ; ++i)
    if (i % 2 == 0)
        j++;

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    예를 들어서 설명하겠습니다.

    상황1

    소스코드 2에 변수 j를 추가해서 j와 i를 같이 증가시키는 코드로 바꿔봅시다.

    int j = 0;
    for (int i = 0 ; i < 100 ; ++i)
        if (i % 2 == 0)
            j++;
            i++;
    

    파이썬에서는 의도한 대로 실행될겁니다. 하지만 c++에서는 밑의 코드같이 실행됩니다.

    int j = 0;
    for (int i = 0 ; i < 100 ; ++i)
        if (i % 2 == 0)
            j++;
    i++;
    

    상황2

    다음은 코드를 테스트하는 상황에서 자주 발생하는 일입니다.

    if (condition)
      do_something();
    else
      do_something_else();
    must_always_do_this();
    

    와 같은 코드에서 else안의 do_something_else()를 주석처리하면

    if (condition)
      do_something();
    else
      //do_something_else();
    must_always_do_this();
    

    컴파일은 되지만 항상 호출돼야 하는 must_always_do_this()else문으로 들어가서 프로그램이 의도한 대로 실행되지 않습니다.

    물론 이런 상황들은 조금만 주의를 기울인다면 발생하지 않을 사소한 실수지만, 다들 한 번 씩 이런 경험해본 적 있지 않나요?

    이건 c++이 {}로 블록을 정하기 때문에, 눈으로 보고 예상하는 블록과 실제 블록이 달라 발생하는 일입니다.

    그래서 소스코드 1처럼 {}을 써주는게 블록을 따라가기가 쉽기 때문에 한 줄을 쓰더라도 {}을 명시하라고 하는겁니다.

    하지만 항상 저 교재를 따를 필요는 없다고 생각합니다. 나중에 코드를 바꿀 일이 있다거나 다른 사람이랑 같이 쓰는 코드라면 {}으로 묶어주는 게 좋겠지만, 간단한 조건 검사에서는 굳이 그럴 필요는 없지 않을까요?

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)