goto 명령문
반복문을 사용하지 않고 반복문의 동작을 수행하는 것이 가능하도록 해주는 명령문이 존재한다. 이럴때 사용하는 것이 goto이다. goto 명령문을 이용한 코드의 흐름은 다음과 같다.
C언어를 배우게 되면, goto를 배우면서 가급적 사용하지 말라는 이야기를 듣게 되는데, goto를 적절히 사용하면 코드의 중복을 없앨 수 있다. 특히 에러처리에 굉장히 유용해서 리눅스 커널에서 자주 쓰이는 명령문이기도 하다. 사용 방법은 간단하다.
먼저, 넘어가고자 하는 지점에 레이블이란 것을 지정해주어야 한다. 각각의 레이블은 이름들을 가지는데, 이때 레이블 뒤에 콜론(:)을 써주어야 한다. 그리고 해당 레이블로 넘어가고자 한다면, goto 레이블; 을 작성해주면, 그 사이의 코드는 전부 무시하고 레이블로 한번에 이동된다. 예제 코드는 다음과 같다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
if (num1 == 1) // num1이 1이면
goto ONE; // 레이블 ONE으로 즉시 이동
else if (num1 == 2) // num1이 2이면
goto TWO; // 레이블 TWO로 즉시 이동
else // 1도 아니고 2도 아니면
goto EXIT; // 레이블 EXIT로 즉시 이동
ONE: // 레이블 ONE
printf("1입니다.\n");
goto EXIT; // 레이블 EXIT로 즉시 이동
TWO: // 레이블 TWO
printf("2입니다.\n");
goto EXIT; // 레이블 EXIT로 즉시 이동
EXIT: // 레이블 EXIT
return 0;
}
실행 결과
1 (입력)
1입니다.
if문 아래에 보면 ONE:, TOW:, EXIT:가 존재하는데 이들이 각각 레이블이다. 그리고 입력된 num1에 따라 goto를 사용해서 해당 레이블로 바로 이동시켜준다. 실제 실행 결과를 보면 1을 입력하면 "1입니다"가 출력된다. 이 때의 흐름을 보면, if(num==1)이 참이기 때문에 goto ONE;이 실행된다. 그러면 ONE이라는 레이블로 바로 이동하는데, 그 아래에 "1입니다" 출력문을 실행하고, goto EXIT를 실행해서 EXIT레이블로 이동하게 된다. 그 아래엔 return 0;가 있기 때문에 프로그램이 종료된다.
위와 같은 코드는 썩 좋은 코드는 아니다. 이를 goto 대신에 if만 사용하여 표현하면 아래와 같다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1;
scanf("%d", &num1);
if (num1 == 1) // num1이 1이면
printf("1입니다.\n");
else if (num1 == 2) // num1이 2이면
printf("2입니다.\n");
return 0;
}
코드의 길이가 줄어든 것이 확연히 보인다. 이러하듯, goto를 사용하는게 유리한지 아닌지를 잘 판단해서 사용해야 한다. goto를 주로 사용하는 곳은 중첩 루프를 한번에 벗어날 경우이다. 중첩 반복문에서 안쪽 루프에서 break를 사용하면 해당 반복문만 빠져나오고 바깥의 반복문은 계속 진행되는데, 중첩 반복문을 한번에 나오는 방법으로 goto를 사용할 수 있다.
#32.4 퀴즈
레이블의 이름 짓는 규칙은 변수의 이름을 정하는 규칙과 같다. 숫자로 시작할 수 없고, 숫자, 대, 소문자 모두 가능하며 언더바(_)도 사용이 가능하다. 답은 d, e.
goto는 goto와 레이블 사이의 코드를 모두 무시하고 이동하며, 중첩 루프를 한번에 빠져나올 수 있고, 아래의 방향이 아닌 위의 방향으로도 이동할 수 있다. 답은 b, d, e.
#32.5 연습문제: switch에서 반복문 빠져나오기
#include <stdio.h>
int main()
{
int num1 = 1;
for (int i = 0; i < 10; i++)
{
switch (num1)
{
case 1:
printf("1입니다.\n");
① ______________
default:
break;
}
}
②___________
return 0;
}
1입니다가 한번에 출력되게끔 하려면, break를 사용하거나 goto를 사용해야 하는데 해당 문제에는 빈칸이 2개 이므로 1번엔 goto 명령문, 2번엔 레이블의 이름이 들어가면 된다. 답은 goto EXIT; , EXIT: .
#32.6 심사문제: 중첩 루프 빠져나오기
goto를 이용해 해당 레이블로 이동하면, 프로그램이 종료되는 순간까지 그 아래로 내려가면서 실행한다. 200과 300을 출력하려면 200이 출력되는 코드 위로 이동해야하는데, EXIT1로 이동하면 100도 출력되기 때문에 EXIT2로 이동하면 된다. 그러면 200을 출력하고 그 아래로 내려가서 300을 출력하고 프로그램이 종료되게 된다. 답은 EXIT2.
'Programming > C' 카테고리의 다른 글
[ProjectH4C] 코딩도장 Unit 34 ~ 35 Write-Up (0) | 2020.07.22 |
---|---|
[ProjectH4C] 코딩도장 Unit 33 Write-Up (0) | 2020.07.16 |
[ProjectH4C] 코딩도장 Unit 27~31 Write-Up (0) | 2020.07.16 |
[ProjectH4C] 코딩도장 Unit 26 Write-Up (0) | 2020.07.15 |
[ProjectH4C] 코딩도장 Unit 23 ~ 25 Write-Up (0) | 2020.07.15 |