강좌 첫화면으로 최근 글 보기(Post)
갈래별로 보기 categories




  3.8. 제어문의 사용법



3.8. 제어문의 사용법


이미 앞부분에서 제어문에 대해서는 어느 정도 배우셨습니다. 그러나 다시 한 번 제어문의 사용법에 대해서 배우도록 하겠습니다. 제어문은 프로그램 흐름을 제어하는 문장입니다. 때로는 순서를 제어하고, 때로는 조건에 따라서 적절한 기능을 수행하도록 제어해줍니다. 이러한 제어문의 종류에는 어떤 것이 있으며, 이런 제어문을 벗어나는 방법으로는 어떤 방법이 있는지 알아보겠습니다.

3.8.1. 만약에 ~라면(if else)


'만약에 ~라면 ~을 해라'는 구조에 사용되는 제어문이 if문입니다.

프로그램을 짤 때 가장 기본적인 문장구조는 '만약에 ~라면'입니다. 즉 '만약에 a가 10보다 작으면 a에 10을 대입하라' 하는 문장을 생각해낼 수 있습니다. 이처럼 '만약에 ~라면 ~을 해라'라는 구조를 가진 문장이 if문입니다.

형식은 다음과 같습니다.

형식.1

if (조건식) 문장;


형식.2

if (조건식) {

문장;

....;

} // if문 다음의 {}로 둘러싼 부분을 실행부라고 합니다.


그리고 이 문장에서 한 걸음 더 나가서 '만약 ~라면' 무엇을 하겠지만, '만약 ~가 아니라면' 무엇을 할 것인가를 생각해내야 합니다. 즉 '만약에 a가 10보다 작으면 a에 10을 대입하고, 그렇지 않으면 a에 0을 대입하라' 하는 문장을 사용할 수 있습니다.

형식.3

if (조건식) 문장;

else 문장;


형식.4

if (조건식) {

문장;

....;

}

else {

문장;

....;

}


형식.5

if (조건식)

if (조건식) 문장;

else 문장;

else 문장;


C에서의 if 문에서 수식의 결과값이 0이면 논리적인 거짓으로, 0이 아니면 논리적인 참으로 간주합니다.

조건의 참, 거짓에 따라서 실행을 제어하므로 if문을 조건 제어문이라 합니다.

if문을 조건 제어문이라고도 말하는데, 이는 어떤 조건이 참, 거짓 여부를 판단하여 실행을 제어하는 문장이라는 뜻입니다. if 문 안에 또 다시 if문을 사용하는 중첩사용도 허용됩니다.

if문의 조건식은 ()로 싸며, 실행부 문장이 여러개일 경우에는 {}로 쌉니다.

if문을 사용할 때 조건식은 반드시 ( )로 둘러싸야 합니다. 그리고 if문에 의해서 판단을 한 다음에 실행을 해야 하는 명령문이 있는 부분을 실행부라고 하는데, 실행부의 문장이 여러 개일 경우에는 반드시 {}로 묶어야 합니다. 실행부의 문장이 하나 뿐일 경우에는 {}를 생략해도 됩니다.

if문은 조건식이 참일 경우 실행부를 실행합니다.

if문은 (조건식) 안의 조건식이 참이면 바로 다음에 나오는 실행부를 실행합니다. 만약 아니라면 아무 것도 실행하지 않습니다. 또는 if문의 조건식이 거짓일 경우에는 else 다음의 실행부에 있는 명령을 실행합니다.
다음의 예제를 test022.cpp로 만들어서 실행해보기 바랍니다.

// test022.cpp
// 3의 배수를 알려주는 예제

#include
#include

void main(void)
{
int n;
cout<<"원하는 수를 입력하세요 : ";
scanf("%d",&n);
if (n%3 == 0) {
cout<<" "< cout<<"는(은) "<<"3의 배수입니다.\n";
}
else
cout<<" "< }


**그림: test022.cpp의 소스파일 내용

한글프로그램을 띄우고 위의 프로그램을 실행파일로 만들어서 실행하면 3의 배수일 때는 3의 배수라고 화면에 표시해주고, 3의 배수가 아닌 수는 3의 배수가 아니라고 화면에 표시해줍니다.

test022.exe를 실행시키면 다음과 같이 숫자를 입력받습니다. 이때 15를 입력하면 3의 배수라고 알려줍니다.


**그림: test022.exe를 실행시키고 15를 입력하면 3의 배수라고 알려줍니다.

그리고 test022.exe를 실행시키고 14를 입력시키면 3의 배수가 아니라고 알려줍니다.


**그림: 14는 3의 배수가 아니라고 알려줍니다.

test022.cpp의 프로그램을 분석해봅시다.

test022.cpp의 프로그램을 한 줄씩 분석해보겠습니다.

// test022.cpp

// 3의 배수를 알려주는 예제


//과 사이에 주석을 달았습니다.

#include

#include


매크로명령어인 #include를 이용하여 헤더파일인 를 포함시켰습니다. 따라서 test022.cpp를 컴파일할 때 파일을 찾아서 필요한 정보를 함께 컴파일합니다.

void main(void)


main()이라고만 썼으므로 함수의 정의에 들어간다는 뜻입니다. main() 함수의 머리부분입니다.

{

int n;


{를 통하여 main() 함수의 몸통에 해당하는 부분을 시작합니다. 그리고 정수형 변수 n을 선언했습니다. 변수를 선언한다는 의미를 이제는 아실 것으로 생각합니다.

cout<<"원하는 수를 입력하세요 : ";


원하는 수를 입력하라고 화면에 글씨를 표시해줍니다. 이때 문장의 뒤에 줄바꿈문자인 \n을 사용하지 않았음을 눈여겨보시기 바랍니다.

scanf("%d",&n);의 &는 입력받은 수를 변수 n이 지정받은 번지에 넣으라는 뜻입니다.


scanf("%d",&n);


scanf() 함수를 이용하여 정수형 자료를 입력받습니다. 그리고 그 자료는 n이라는 변수에 대입합니다. 이때 자료를 입력받는 위치는 앞서 cout를 이용해서 출력했던 문장의 바로 뒤가 됩니다. 앞서의 문장에서 \n을 넣지 않은 이유는 바로 이 때문입니다. 만약 앞의 명령문에서 \n을 넣었다면 자료를 입력받는 위치는 "원하는 수를 입력하세요 : "라고 써진 문장의 밑줄이 됩니다. 아무래도 보기가 안 좋겠죠.

%d는 정수형 자료를 나타내는 형식이라는 것을 잘 알 겁니다. 눈여겨봐야할 부분은 &n입니다. 이전에는 이것이 무엇을 뜻하는지 모르고 막연하게 썼지만 이제는 정확하게 알고 넘어가야겠습니다.

&는 번지연산자로 변수의 번지에 자료를 대입해주는 연산자입니다.

&는 번지연산자임을 연산자 설명에서 말씀드렸습니다. 즉 scanf() 함수를 통해서 입력받은 정수형 자료를 n의 번지에 대입하는 겁니다. 그러니까, int n;이라는 문장을 통해서 n이라는 변수를 선언했고, 이를 통해서 34번지라는 주소를 배정받았다고 합시다. &n은 34번지에 scanf() 함수를 이용해서 입력받은 자료를 넣어주는 일을 합니다. 그래서 n에는 입력받은 정수가 대입되는 겁니다.

if (n%3 == 0) {


만약 n을 3으로 나눈 나머지가 0이라면 {로 시작하는 첫번째 실행부를 실행하라는 말입니다. %가 나머지를 반환해주는 나머지연산자라는 점을 기억해주시기 바랍니다.

cout<<" "<
cout<<"3의 배수입니다.\n";

}


if (n%3 == 0) 명령문을 통해서 만약 입력받은 숫자를 나눈 나머지가 0이라면 3의 배수가 확실하므로 3의 배수라고 화면에 출력해줍니다. 그리고 }로 첫번째 실행부를 닫았습니다.
예문의 두 줄은 한 줄로 묶을 수 있습니다. 'cout<<" "<
else

cout<<" "<
}


만약 n을 3으로 나눈 나머지가 0이 아니라면 3의 배수가 아닐 겁니다. 그래서 else문을 통해서 조건식을 만족하지 못할 때 화면에 3의 배수가 아니라고 표시하라고 명령내렸습니다. 이때 else문 다음의 실행부는 한 줄입니다. 그래서 {} 기호로 둘러싸지 않았습니다.

표: if문의 성격

if문은 조건에 따른 조건분기문으로 2가지 중 하나만 실행하는 명령문입니다.
조건식에는 상수,변수,연산식등이 올 수 있습니다.
조건식이 0이면 거짓이고, 0이외의 값이면 참으로 판단합니다.
만약 if문 뒤에 else가 없다면 때 조건식이 거짓인 상태로 아무 것도 실행하지 않습니다.
if문 다음에 실행해야 할 명령문이 2개 이상일 때는 {}로 싸서 여러 개의 문장을 처리할 수 있습니다.
if문 안에 또 다시 if문을 포함시킬 수 있습니다.

**요약: if문은 조건제어문으로 조건식이 참일 때 실행부를 실행합니다. 실행부는 단문이나 {} 기호로 묶은 복문이 올 수 있습니다.


3.8.2. ~하는 동안(while)


while문은 조건식을 만족하는 동안 계속해서 실행부를 반복합니다.

while문은 조건식을 만족하는 동안 실행부에 있는 명령문을 계속해서 반복하는 제어문입니다.

형식.1

while (조건식) 문장;


형식.2

while (조건식) {

문장;

....;

}


즉 조건식의 결과가 참(1)이면 실행부를 계속 반복해서 실행하고, 거짓일 경우에는 블럭을 빠져나갑니다. 여기서 말하는 블럭이란 개념은 어떤 제어문이 수행되는 구간을 말합니다. 이때 참일 동안 계속해서 반복실행하는 것을 맴돌이(loop)라고 합니다. 즉 루프를 돈다고 합니다.

while문을 사용할 때는 무한루프에 빠지지 않도록 주의해야 합니다.

그러므로 루프 안에 조건식의 결과를 변화시키는 문장이 들어있지 않으면 계속해서 맴돌이를 하게 되는데, 이것을 무한루프라고 합니다. 쉽게 말하면 무한루프에 빠졌다고 합니다. 그래서 조건식의 변수를 변화시켜 주는 명령문을 while문의 블럭 안에 넣어주어야 합니다.
만약 while문의 조건이 시작할 때부터 거짓이라면 while문의 실행부를 실행할 필요가 없어지므로 단 한 번도 실행부를 실행하지 않을 수 있습니다.

표: while문의 성격

조건반복문입니다.
조건식이 참인 동안에는 블럭 안의 내용을 반복 실행하고, 조건식이 거짓이면 블럭 안을 벗어납니다.
처음부터 조건이 거짓이면 한번도 수행하지 않습니다.
조건식을 참이면 계속해서 무한루프에 빠지므로 조건식을 거짓으로 만들 수 있는 명령문을 블럭 안에 넣어두어야 합니다.
while을 통해서 실행해야 할 명령문이 여러 개일 경우에는 {}를 이용해서 묶으면 됩니다.

3.8.3. ~인 동안 ~을 해라(do while)


do while문이 while문과 다른 점은 일단 한 번 실행한 후에 조건식을 검사한다는 점입니다.

이 문장은 조건식이 만족될 때까지 계속 순환하는 문장입니다. while문과 다른 점은 while문은 조건식을 만족하지 않는다면 실행을 하지 않으므로 한 번도 실행하지 않고 끝낼 수도 있으나, do while문은 일단 한 번은 실행한 뒤에 조건식을 검사한다는 점이 다릅니다. 그외는 while문과 다른 점이 없습니다. 때문에 가능하면 while문을 이용하고 do while문은 사용하지 않는 것이 좋습니다.

형식.1

do 문장;

while (조건식)


형식.2

do {

문장;

....;

} while (조건식);


표: do while문의 성격

조건반복문입니다.
조건식이 참인 동안에는 블럭 안의 내용을 반복 실행하고, 조건식이 거짓이면 블럭 안을 벗어납니다.
일단은 실행부의 문장을 한 번은 실행한 다음에 조건식을 검사합니다.
조건식이 참이면 계속해서 무한루프에 빠지므로 조건식을 거짓으로 만들 수 있는 명령문을 블럭 안에 넣어두어야 합니다.
do while을 통해서 실행해야 할 명령문이 여러 개일 경우에는 {}를 이용해서 묶으면 됩니다.

3.8.4. 일정한 주기로 반복할 때 쓰는 for문


for문은 while보다 더 간결하게 프로그램을 짤 수 있는 제어문입니다.

for 문은 if문과 함께 가장 많이 사용하는 제어문의 하나입니다. 사용법이 편하고 프로그램이 간결해지기 때문에 while문을 이용하는 경우보다 for문을 이용해서 프로그램을 짜는 경우가 많습니다. for문은 대부분의 while문을 대체할 수 있기 때문입니다. 사용형식은 다음과 같습니다.

형식.1

for ( 초기식 ; 조건식 ; 증감식) 문장;


형식.2

for ( 초기식; 조건식; 증감식)

{

명령문;

...

}


예를 들어서 다음과 같은 while문이 있다고 합시다.

n = 1;
while (n <= 10) {
printf("%d\n", n)
n+= 1;
}

위의 명령문을 for문으로 고치면 다음과 같이 한 줄에 가능해집니다.

for (n=1; n<=10; n+=1) printf("%d\n", n);


위의 문장을 살펴봅시다. 먼저 초기식을 통하여 n=1로 변수를 초기화했습니다. 그리고 n이 10보다 작거나 같을 동안 실행부의 명령을 실행합니다. 실행부의 명령은 n을 화면에 보여주는 것입니다. 실행부의 명령을 실행했으면 이번에는 증감식을 통하여 n에 n+1을 한 수를 대입합니다. 즉 첫번째 루프를 돈 후에 n=2가 됩니다. 이런 식으로 열 번의 루프를 돌게 됩니다. 그러다가 n이 11이 되면 조건식이 거짓이 되므로 for 문을 벗어납니다.

이처럼 for문은 개념이 더욱 간결하면서도 한 눈에 보기 편한 프로그램을 짤 수 있습니다. for문과 관련하여 몇 가지 내용을 나열하면 다음과 같습니다.

for문의 특징

for문은 증감식에 제한이 없습니다. 즉 루프 제어 변수를 +1, -1 이외의 단위로 증감시킬수 있습니다.
for문은 루프를 제어하는 변수의 자료형에 제한이 없습니다.
조건식에도 제한이 없습니다.
초기식, 조건식, 증감식은 필요에 따라 얼마든지 생략할 수 있습니다.
만약 for문에서 증감식을 생략하면 무한루프가 만들어집니다.
루프의 반복 횟수를 프로그램의 실행 도중에 변경할수 있습니다.
중간에 탈출하고 싶을 때는 break문을 사용하면 됩니다. 즉 break문을 쓰면 남아 있는 반복 횟수와는 상관없이 언제든지 for문을 탈출할 수 있습니다.
초기식과 증감식에는 ","연산자를 이용하여 여러 개의 변수를 초기화하거나 증감시킬 수 있습니다. 즉 for문에 쉼표 연산자를 쓰면 초기식과 증감식에 두 개 이상의 변수를 사용할 수 있는 겁니다. 이때 사용하는 , 기호는 쉼표연산자로 변수의 선언에서 변수를 구별해주는 구두점과 혼동해서는 안됩니다.
초기식은 for문이 처음 실행될 때 단 한번 실행이 되며 여러개의 식으로 구분하여 기술할 수 있습니다.
조건식은 루프가 한 번 실행될 때마다 검사를 합니다.
조건식은 단 한 개의 문장만을 사용할 수 있습니다.
for문의 조건식이 참(1)이면 루프를 반복하며 거짓(0)이면 루프를 빠져나갑니다.
for문 안에 또 다른 for문을 내포하여 중첩사용할 수 있습니다.
실행해야 할 명령문이 여러 개일 경우에는 {}를 이용해서 묶으면 됩니다.

**요약: for문은 조건반복문으로 조건식이 참인 동안에는 블럭 안의 내용을 반복 실행하고, 조건식이 거짓이면 블럭 안을 벗어납니다. 조건식이 계속해서 참이거나 조건식 등을 생략하면 계속해서 무한루프에 빠지므로 조건식을 거짓으로 만들 수 있는 명령문을 블럭
안에 넣어두거나 break문등을 넣어두어야 합니다. 실행해야 할 명령문이 여러 개일 경우에는 {}를 이용해서 묶으면 됩니다.

3.8.5. 여러 개 중에서 하나를 선택하는 switch문


swhitch문은 여러 개의 조건 중에서 하나를 선택할 때 사용하는 제어문입니다.

switch문의 형식은 다음과 같습니다.

형식.1

switch (수식) {

case 상수1: 문장;

....;

break;

case 상수2: 문장;

....;

break;

.

.

.

default: 문장;

....;

break;

}


switch문에 사용되는 수식은 정수형이어야 하지만 case 뒤의 정수가 상수이면 됩니다.

주의할 점은 수식은 반드시 정수형이거나 정수형으로 자동 변환되는 자료형이어야 합니다. 쉽게 말해서 수식에는 정수만 쓰라는 이야기입니다. 그러나 case 뒤에는 정수형일 필요가 없습니다. 대신 반드시 상수여야 합니다. 즉 문자 상수, 정수 상수 등의 상수 수식이어야 한다. case문 뒤에 변수를 사용해서는 안되는 겁니다.

switch문은 (수식)에 해당하는 상수를 case문 뒤에서 찾아봅니다. 만약 첫번째 case문 뒤의 수식이 switch문 뒤의 (수식)에서 조건을 건 상수라면 첫번째 case문 뒤의 명령문들을 실행하고 끝냅니다. 그러나 첫번째 case문의 상수가 (수식)의 수가 아니라면 다음 번 case문에 있나 찾아봅니다. 이렇게 쭉 찾아보다가 만약 값이 일치하는 곳이 없으면 default문 다음의 명령문들을 수행합니다. 그러므로 만약 default문을 생략한다면 아무 것도 안하고 빠져나오는 셈입니다.

case문 뒤의 명령문은 블럭이 아니므로 {} 기호로 묶지 않습니다.

이때 주의할 점은 case문 다음의 문장을 {}로 묶으면 안된다는 점입니다. case문 다음에는 여러 개의 명령문을 나열할 수 있지만 블럭이 아니므로 { }로 둘러싸면 안되는 겁니다. 그리고 가능하면 case문 다음의 명령문을 모두 실행한 다음에는 switch문을 빠져나갈 수 있도록 break문을 넣는 것이 좋습니다. 왜냐하면 조건에 맞는 case문을 실행한 뒤에도 다음 번 case문을 또 검사하면서 switch문의 끝까지 가기 때문입니다. switch문과 관련한 내용을 정리하면 다음과 같습니다.

switch문의 특징

수식에서 사용하는 것은 주로 변수입니다.
맨 마지막 부분에 사용하는 break문은 생략해도 되지만 관례상 생략하지 않는 것이 좋습니다.
마지막 부분의 default문은 필요에 따라 생략이 가능합니다.
defult문을 꼭 마지막에 둘 필요는 없습니다.
case문을 case 라벨이라고 부르는데, goto문의 라벨과 같은 역할을 합니다.
switch문은 블럭 안의 명령문을 실행하다가 break문을 만나면 즉각 switch 블럭을 탈출합니다.

switch문을 이용해 배수를 판별하는 프로그램을 만들어봅니다.

다음과 같은 파일을 test023.cpp로 만들어서 실행해보기 바랍니다.

// test023.cpp
// switch문을 이용해 4의 배수 판별하는 예제

#include
#include

void main(void)
{
int n;
cout<<"숫자를 입력해주세요: ";
cin>>n;
switch (n%4) {
case 0 : cout< break;
case 1 : cout< break;
case 2 : cout< break;
default : cout< break;
}
}


**그림: test023.cpp의 소스파일 내용

test023.cpp는 4의 배수를 판별하는 프로그램입니다. test023.exe를 실행시키면 숫자를 입력하라는 말이 나옵니다. 아래 화면처럼 9를 입력하면 나머지가 1이라고 알려줍니다.


**그림: 9를 입력하면 나머지가 1이라고 알려줍니다.


다시 test023.exe를 실행시킨 후에 이번에는 12를 입력해봅니다. 그러면 4의 배수라고 화면에 출력해줍니다.


**그림: 12라고 입력하면 4의 배수라고 알려줍니다.

test023.cpp를 좀더 자세하게 살펴보겠습니다.

// test023.cpp

// switch문을 이용해 4의 배수 판별하는 예제


#include

#include


void main(void)

{

int n;

cout<<"숫자를 입력해주세요: ";

cin>>n;


위의 명령문을 통해 정수형자료를 입력받아서 n이라는 변수에 대입시켰습니다.

switch (n%4) {


switch문의 시작입니다. (수식)의 내용이 (n%4)입니다. 즉 n을 4로 나눈 나머지를 수식으로 사용한 겁니다. 그리고 {를 통해서 switch문을 시작했습니다.

case 0 : cout<
break;


(n%4)의 수식대로 하면 나머지는 0과 1, 2, 3 중에 하나일 겁니다. 나머지가 0일 경우에는 4의 배수라는 내용을 화면에 출력해줍니다.

case 1 : cout<
break;

case 2 : cout<
break;

default : cout<
break;

}

}


나머지가 1일 경우에는 나머지가 1이라고 출력해주고, 나머지가 2일 경우에는 나머지가 2라고 화면에 출력해줍니다. 나머지가 0, 1, 2인 경우를 제외하면 3이 남습니다. 즉 n을 4로 나눈 나머지가 0도 1도 2도 아닐 경우에는 default문을 실행합니다. 그래서 나머지가 3이라는 내용을 화면에 출력해줍니다.

표: switch문의 성격

여러 개 중에서 하나를 선택하는 선택문입니다.
수식이 일치하는 case문이 있을 경우에는 case문 다음의 명령문들을 차례대로 실행합니다.
수식이 일치하는 case 라벨이 없을 경우에는 default 라벨을 실행합니다.
수식이 일치하는 case 라벨도 없고 default 라벨도 생략했을 경우에는 아무 일도 안하고 끝납니다.
case문 다음의 명령문은 여러 개가 올 수 있으나 {} 기호로 묶으면 안됩니다.

**요약: switch문은 여러 개의 조건 중에서 하나를 선택할 때 사용하는 제어문입니다. switch문에 사용되는 수식은 정수형이어야 하며 case 뒤에는 상수를 사용합니다. 맨 마지막 부분에 사용하는 break문은 생략해도 되지만 관례상 생략하지 않는 것이 좋습니다.
switch문은 블럭 안의 명령문을 실행하다가 break문을 만나면 즉각 switch 블럭을 탈출합니다.

3.8.6.제어문 블럭을 벗어나는 탈출문인 break문


break문은 while, for, do while, switch의 4가지 제어문 블럭을 벗어나는 탈출문입니다.

break문은 while, for, do while, switch 등의 4가지 제어문 블럭을 벗어나게 해줍니다. 만약 제어문을 중첩해서 사용했을 경우에는 안쪽 루프, 즉 블럭을 벗어나게 해줍니다. 이말은 break;문이 있는 블럭을 벗어나게 해준다는 말입니다.
break문의 사용 횟수에는 제한이 없으므로 루프 탈출 조건을 루프(제어문 블럭) 안에 여러 곳 둘 수 있습니다. 이미 switch문의 예제 프로그램 등에서 설명을 했으니 이전의 예제 프로그램을 참고하기 바랍니다.

3.8.7.반복순환문의 조건식으로 되돌아가는 continue문


continue문은 for, while, do while 등의 반복순환문에서만 사용합니다.

continue문은 루프의 조건식을 검사하는 부분으로 되돌아 가게 해줍니다. 그러므로 continue문은 for, while, do while 등의 반복순환문에서만 사용할 수 있습니다. if문이나 switch문에서 사용하지 않습니다.
while문의 블럭 안에서 continue문을 사용하면 프로그램의 제어가 루프의 맨 처음인 조건식으로 되돌아가지만 do while문 블럭 안에서 사용하면 루프의 맨 마지막에 있는 조건식으로 가게 된다는 점이 다릅니다.
continue문은 보통은 if문과 같이 쓰이는 경우가 대부분입니다. 즉 '만약 ~이 아니라면 처음으로 돌아가라'는 제어를 할 때 많이 사용합니다.

3.8.8. 가고 싶은 곳으로 이동시켜주는 goto문


goto문은 원하는 라벨로 이동시켜주는 명령문입니다.

goto문은 자신이 원하는 곳으로 이동을 시켜주는 명령문입니다. 자신이 원하는 곳은 곧 라벨이라고 말하는 곳입니다. 사용형식은 다음과 같습니다.

형식.1

goto label;

...


이때 가고자 하는 곳은 라벨이어야 하는데 라벨은 다음과 같은 형식을 가지고 있어야 합니다.

label:

...


라벨은 반드시 하나 이상의 문장이 있어야 하며 블럭 끝이면 안됩니다.

라벨을 만들 때 주의할 점은 라벨 이름 다음에는 반드시 하나 이상의 문장이 존재하여야 하며, 라벨 바로 다음이 블럭 끝이면 안된다는 점입니다. 제어문의 블럭을 벗어나기 위해서 goto문을 썼지만 정작 라벨에 가서 사용해야 할 명령문이 없다면 널문장을 써서라도 이를 해결해야 합니다.
그리고 블럭 안에 같은 이름이 라벨이 두 개 이상 있으면 안됩니다. 이때 말하는 블럭이란 {} 기호로 싼 블럭을 말합니다.

보기
{
if (a>10) goto next;
... // 이 표기는 next라는 라벨 사이에 많은 명령문이 있음을 뜻합니다.
next:
; // 이것이 널문장입니다.
}

goto문은 중첩된 루프를 한 번에 벗어날 수 있습니다.

goto문을 사용하면 중첩되어 있는 여러 가지 루프를 한 번에 벗어날 수 있습니다. 예를 들어서 다음과 같이 for문이나 if문을 계속 중첩했을 때 맨 안 쪽의 깊은 곳에서 맨 바깥쪽 제어문의 블럭을 바로 벗어날 수 있는 방법이 goto문입니다.

보기
for (...) {
for (...) {
for (...) {
...
if(....) {
if{
...
goto first;
}
}
...
}
}
}

first:
......

보기와 같이 사용하면 순식간에 바깥 for문을 벗어나 first 라벨로 이동할 수 있습니다. 그리고 first 라벨 다음 문장부터 다시 차례대로 명령문을 실행해나갑니다. 그러나 goto문은 매우 안좋은 명령문입니다. 그러므로 가능하면 사용하지 않도록 해야 합니다.
C는 BASIC과 달리 구조적인 언어입니다. 그래서 모듈별로 프로그램을 짤 수도 있고 객체지향이라는 개념을 지킬 수 있는 언어입니다. 때문에 goto문처럼 갑자기 불쑥 어디로 넘어가버리는 문장은 프로그램을 체계적으로 만들지 못하는 단점이 있습니다. 또 프로그램의 구조를 파악하기 힘들게 만듭니다. 그러나 꼭 필요하다면 goto문을 사용해도 무방합니다. 단지 goto문은 가능하면 사용하지 않는 것이 좋다는 점을 말씀드립니다.

**요약: goto문은 원하는 라벨로 이동하는 명령어로 이때 프로그램 어딘가에 반드시 라벨이 있어야 합니다. 라벨은 이름을 적고 : 기호를 붙여줌으로써 만들 수 있습니다. 라벨이름 뒤에는 반드시 하나 이상의 명령문을 붙여주어야 합니다.



표: 제어문의 종류:

선택문 : if-else문, switch문 (selection statement)
순환문 : while 문, do-while 문, for 문 (iteration statement)
점프문 : break 문, continue 문, goto 문, return 문(jump statement)

3.8.9. 루프를 중첩해서 활용하는 방법


제어문 안에 삽입한 제어문을 중첩루프문이라고 합니다.

처음에 프로그램을 짜면 제어문 안에 제어문을 넣는 일, 즉 루프 안에 루프를 넣는 중첩루프 사용을 꺼리기 마련입니다. 물론 루프를 중첩하지 않고도 짤 수 있다면 프로그램이 쉬워지므로 훨씬 좋습니다. 그러나 루프를 중첩해야 할 경우가 있습니다. 또는 루프를 중첩해서 사용하는 것이 경제적일 때도 있습니다.

구구단 출력 프로그램을 중첩루프를 이용해 만들어봅니다.

루프를 중첩하는 예제로서 간단하게 구구단을 출력하는 프로그램을 만들어보겠습니다. 아래의 프로그램을 test024.cpp로 만들어 실행해보기 바랍니다.

// test024.cpp
// 제어문의 중첩을 활용한 구구단

#include

void main(void)
{
int n,m;

for(n=1;n<=9;n++) { // 첫번째 for문
for(m=1;m<=9;m++) // 두번째 for문을 첫번째 for문 안에 중첩 사용
printf("%2d * %2d = %2d \n",n,m,(n*m)); // 구구단을 출력해줍니다.
}
}


**그림: test024.cpp의 소스파일 내용

test024.exe를 실행시키면 다음 화면과 같이 구구단을 화면으로 쭉 출력해줍니다.


**그림: test024.exe를 실행시키면 구구단을 출력해줍니다.

위의 중첩문은 복문기호인 {}를 사용했기 때문에 줄 수가 많습니다. 이를 좀더 간결하게 만들면 한 줄로 만들 수 있습니다. test0242.cpp와 같이 만들면 문장이 좀더 단순해집니다.

// test0242.cpp
// 제어문의 중첩을 활용한 구구단

#include

void main(void)
{
int n,m;
for(n=1;n<=9;n++) for(m=1;m<=9;m++) printf("%2d * %2d = %2d \n",n,m,(n*m));
}


**그림: test0242.cpp의 소스파일 내용

test0242.exe를 실행해도 실행결과는 test024.exe와 같습니다.


**그림: test0242.exe의 실행화면. test024.exe와 같습니다.




첫줄로(go top, go first line) 문화원첫화면으로(go dal site home) 강좌차림으로(go Chair) 사이트맵으로(go sitemap)




total chairpost