goto 제어문

Lucete_sw·2022년 8월 16일

C언어

목록 보기
2/8
post-thumbnail

| 사용  개념 :  goto  제어문

: 중간의 코드는 무시하고 원하는 부분으로 건너뛰어야 하는 상황에서 사용한다.
goto 제어문


 참고   스파게티 코드
: goto 제어문을 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여있다는 데서 붙여진 이름이다.
-> 가독성이 떨어지고, 유지보수가 어렵다



| 언제  사용하지??

효과적으로 goto 제어문을 사용할 때는, 주로 아래 두 가지 경우가 있다.
    1) 중첩루프를 빠져나올 때
    2) 중복 코드를 처리할 때

1) 중첩루프를 빠져나올 때


1)   중첩루프를  빠져나올  때

우리는 중첩루프를 빠져나올 때, 아래와 같이 break문을 사용해왔다.


 break문 

int n = 0;
bool exitOuterLoop = false;

for (int i = 0; i < 10; i++)
{
	for (int j = 0; j < 10; j++)
    {
    	if (n == 20)
        {
        	exitOuterLoop = ture;
            break;
        }
        n++;
    }
    if (exitOuterLoop == ture)
    	break;
}

break의 가장 큰 특징현재 루프만 끝낸다는 점이다.
따라서 위와 같이 중첩 루프의 안쪽 루프에서 break를 사용하면 바깥쪽 루프는 계속 반복된다.
때문에, 바깥쪽 루프를 제어하기 위해 'exitOuterLoop' 변수를 만들어 사용해야 한다.

이와 같은 경우 goto를 사용하면 간단하게 중첩루프를 빠져나올 수 있다.


 goto문 

int main()
{
    int n = 0;

	for (int i = 0; i <. 0; i++)
	{
		for (int j = 0; j < 10; j++)
    	{
    		if (n == 20)
        		goto EXIT;
    	
        	n++;
    	}
	}

EXIT:	//레이블 EXIT
	printf("%d\n",n);
    
    return 0; 
}

이처럼 goto다중루프를 빠져나올 때 유용하다.

2) 중복코드를 빠져나올 때


2)   중복코드를  빠져나올  때

예를 들어, 설문조사를 시행하는데 대상이 20대 미혼여성이라고 하자.
설문조사 대상에 부합하지 않으면 "대상에 부합하지 않습니다."라고 말하는 프로그램을 만들어보면 다음과 같다.


 goto 없이 

int main()
{
	int gender;	//성별	남자:1, 여자:2
    int age;	//나이
    int merry	//결혼여부	미혼:1, 기혼:2
    
    scanf("%d %d %d", &gender, &age, &merry);
    
    if (gender == 1)
    {
    	printf("대상에 부합하지 않습니다.\n");
        return 0;
    }
    
    if ((age<20) || (age>=30))
    {
    	printf("대상에 부합하지 않습니다.\n");
        return 0;
    }
    
    if (merry == 2)
    {
    	printf("대상에 부합하지 않습니다.\n");
        return 0;
    }
    
    return 0;
}

코드를 잘 보면 조건마다 중복되는 코드가 존재한다.
만약 조건이 늘어난다면 중복 코드는 더 늘어날 것이다.

goto를 사용하면 이런 상황에서 항상 실행해야 하는 중복 코드를 하나로 모을 수 있다.


 goto 

int main()
{
	int gender;	//성별	남자:1, 여자:2
    int age;	//나이
    int merry	//결혼여부	미혼:1, 기혼:2
    
    scanf("%d %d %d", &gender, &age, &merry);
    
    if (gender == 1)
    	goto EXIT;
    
    if ((age<20) || (age>=30))
    	goto EXIT;
    
    if (merry == 2)
    	goto EXIT;

EXIT:
	printf("대상에 부합하지 않습니다.\n");
    
    return 0;
}

이제 조건(20대 미혼여성)이 맞지 않을 때마다 EXIT로 이동하여 코드가 실행된다.

즉, 종료 직전에 항상 실행해야 하는 코드들을 한곳에 모아두고 goto를 사용하면 중복 코드를 없앨 수 있고, 코드의 의도 또한 명확해진다.



출처 : 남재윤, ⌜C언어 코딩 도장⌟, 길벗, 2021

profile
개발자_기록

0개의 댓글