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


제가 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++;
  • 2016년 01월 15일에 작성됨

조회수 259


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처럼 {}을 써주는게 블록을 따라가기가 쉽기 때문에 한 줄을 쓰더라도 {}을 명시하라고 하는겁니다.

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


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close