4-1-나.블록 구조

앞에서 작성한 예제를 조금 변경하여 i에 7이 입력되었을 때 "행운의 7입니다."라는 메시지도 같이 출력해 보기로 하자.

 

     if (i == 7)

          printf("7을 입력했습니다.\n");

          printf("행운의 7입니다.\n");

 

i가 7일 때 printf를 두 번 호출하여 두 개의 메시지를 출력하도록 했다. 이렇게 하면 될 것 같지만 실행해 보면 i에 어떤 값을 입력하든지 "행운의 7입니다." 메시지는 항상 출력된다. 왜냐하면 컴파일러는 위 문장을 다음과 같이 해석하기 때문이다.

 

     if (i == 7)

          printf("7을 입력했습니다.\n");

     printf("행운의 7입니다.\n");

 

첫 번째 printf문은 if문의 조건에 따라 실행 여부가 결정되지만 두 번째 printf문은 if문과는 아무런 상관이 없는 독립된 문장이다. 첫 번째 printf문의 끝에 ;이 있어 여기서 if문이 이미 끝났다는 것을 분명히 명시하고 있다. 그래서 두 번째 printf문은 if문의 조건 평가와는 전혀 상관없이 항상 실행되는 것이다. if문의 조건이 두 번째 printf에까지 걸치지 않는데 if문의 기본 형식은 if (조건) 명령; 이지 if (조건) 명령들; 이 아니기 때문이다.

위와 같은 경우처럼 하나의 조건에 따라 복수 명령의 실행 여부를 통제하는 방법이 필요하다. 여러 개의 명령을 하나의 명령인 것처럼 묶을 때는 중괄호 { }를 사용하며 { }로 묶여진 다수 개의 문장을 복문 또는 블록(block)라고 한다. 예제를 다음과 같이 수정해 보자.

 

: if2

#include <Turboc.h>

 

void main()

{

     int i;

 

     printf("정수를 입력하세요 : ");

     scanf("%d",&i);

     if (i == 7) {

          printf("7을 입력했습니다.\n");

          printf("행운의 7입니다.\n");

     }

}

 

이렇게 하면 if (i == 7) 조건 여부에 따라 이어지는 { } 안의 복문들이 한꺼번에 실행되거나 한꺼번에 실행되지 않는다. { } 괄호가 없는 경우와 있는 경우를 순서도로 비교해 보자.

{ }로 묶었을 때와 그렇지 않을 때의 차이점을 분명히 알 수 있을 것이다. 하나의 조건 평가 결과에 따라 실행 여부가 같이 결정되는 명령의 집합을 만들 때 { } 괄호로 명령들을 묶어야 한다. { } 괄호는 명령의 그룹을 구성하는 역할을 하며 조건문 뿐만 아니라 반복문에서도 여러 개의 명령이 반복 대상일 때 많이 사용되므로 잘 알아 두도록 하자.

복문은 둘 이상의 명령을 하나로 묶을 때 사용하지만 if 조건에 명령이 하나만 걸리더라도 가급적이면 { } 괄호를 사용하는 것이 좋다. 다음 두 문장은 완전히 동일하다.

 

if (i == 7)

     printf("7을 입력했습니다.\n");

 

if (i == 7) {

     printf("7을 입력했습니다.\n");

}

 

블록 안에 하나의 명령만 들어 있지만 { } 괄호로 묶었으므로 형태상 복문이다. 이 조건에 포함되는 다른 명령이 추가될 경우 { } 괄호안에 명령만 써 넣으면 된다. 명령을 미리 { }안에 작성해 놓으면 명령이 추가될 때 실수를 줄일 수 있고 소스를 읽기도 편해진다. 미리 { } 괄호를 싸 두지 않으면 명령만 추가하고 { } 괄호로 묶는 것을 깜박 잊어 버리는 경우가 많다. 아예 if 문의 기본 형식을 다음과 같이 암기하고 있는 것이 좋다.

 

if (조건) { 명령들 }

 

if 문의 기본 형식에 원래부터 { }가 포함된 것으로 생각하는 것이 바람직하며 if문을 입력할 때도 조건 다음에 아예 { }를 먼저 입력해 놓고 이 안에 명령을 작성하는 습관을 들여야 한다. 설사 if 조건에 걸리는 명령이 하나밖에 없어 { } 괄호가 불필요하더라도 이 괄호 때문에 프로그램이 더 커지거나 느려지거나 하지는 않는다. 블록은 하나의 문장으로 취급되므로 문장이 들어갈 수 있는 위치라면 블록도 언제나 들어갈 수 있다.