4-5-다.continue

continue는 루프의 나머지 부분을 무시하고 조건 점검부로 점프하여 루프의 다음 값을 실행하도록 하는 명령이다. 루프를 돌던 중에 특정 조건에 대해서는 처리를 제외시키고자 할 때 이 명령을 사용한다. 루프의 조건을 다시 점검하도록 할 뿐이지 루프를 처음부터 다시 시작하는 것은 아니므로 제어 변수의 값은 그대로 유지되며 다음 증감문으로 이동한다.

continue는 실전에서 그다지 자주 사용되지는 않으며 비교적 정밀한 제어 구조를 만들 때 가끔씩 사용된다. 짤막한 예제를 하나 만들어 보도록 하자.

 

: continue

#include <Turboc.h>

 

void main()

{

     int i;

 

     for (i=1;i<=50;i++) {

          if (i % 9 == 0)

              continue;

          if (i % 3 == 0)

              printf("%d\n",i);

     }

}

 

이 예제는 1~50까지 3의 배수들을 찾아 출력하되 9의 배수는 제외한다. 3의 배수인지를 점검해 보기 전에 먼저 9의 배수인지를 보고 9의 배수이면 뒤에 있는 3의 배수 점검문을 무시하고 루프의 증감문으로 점프한다. 그래서 9의 배수가 아닌 3의 배수만 출력된다. 실행해 보면 3, 6, 12, 15, 21, 24 등의 숫자들이 출력될 것이다. 이런 목적이라면 if (i % 3 == 0 && i % 9 != 0) 식으로 논리 연산자를 쓰는 것이 더 좋지만 continue 문의 동작을 살펴보기 위해 의도적으로 작성했다. 다음은 continue의 좀 더 실용적인 사용예이다.

 

for (i=1;i<=60;i=i+1) {

     if (i번 학생이 없다면) continue;

     i번 학생의 성적 처리

}

 

1번에서 60번까지 학생의 출석 번호로 루프를 돌며 성적을 처리하는 코드이다. 학생들의 출석 번호는 순서대로 매겨지는 것이지만 여러 가지 이유로 가끔 출석 번호가 비는 경우가 있다. 전학을 갔다거나 아니면 말썽을 피워 퇴학을 당했다거나 할 경우 이 번호의 학생에 대해서는 성적을 처리할 필요가 없다. 그래서 성적 처리 코드 앞쪽에 조건을 점검해 보고 없는 번호이면 continue 명령으로 루프 선두로 돌아가도록 했다. 이처럼 루프의 범위 중 특정 조건의 값은 반복 대상에서 제외시키고자 할 때 continue 명령을 사용한다.

break문과 마찬가지로 continue도 다중 루프 내에서 사용될 때 제일 안쪽 루프의 선두로만 돌아간다. 다음 코드에서 j루프 내에서 사용된 continue 명령은 j루프의 처음으로 돌아가도록 하며 i루프의 처음으로 돌아가는 것이 아니다. 만약 j루프 내에서 i루프의 선두로 가고 싶다면 이때는 break와 마찬가지로 별도의 탈출 변수를 사용해야 한다. 그러나 실전에서 이런 경우는 극히 드물다.

 

for (i=...) {

     for (j=...) {

          continue;

     }

}

 

다음 순서도는 for문의 경우 break와 continue가 어디로 점프하는지를 보인 것이다. 나머지 순환문도 비슷하게 동작하되 while, do~while문은 증감식이 없으므로 continue 명령에 의해 단순히 루프의 처음으로 돌아가기만 한다.

break와 continue는 반복문내에서 제어의 흐름을 조작하는 명령들이다. 따라서 반복문 내부가 아닌 경우에는 이 명령들을 사용할 수 없다. 만약 반복문이 아닌 곳에서 break를 사용하면 컴파일러가 에러로 처리할 것이다.

 

void main()

{

     ....

     break;          // 에러로 처리된다.

}

 

break는 반복문이나 switch 문의 case내에서 사용할 수 있다. 이에 비해 countinue는 반복문 내에서만 사용할 수 있으며 switch문에서는 사용할 수 없다. switch 문은 여러 번 실행되는 반복문이 아니므로 처음으로 돌아갈 경우가 없으며 따라서 continue 명령이 필요하지 않다. switch문 내에서 continue를 사용하면 switch 문의 선두로 돌아가 다중 분기를 다시 하는 것이 아니라 switch문을 감싸고 있는 루프의 선두로 가게 된다.

만약 switch문이 루프에 포함되어 있지 않고 단독으로 존재한다면 이때의 continue는 에러로 처리된다. continue는 반복문에서만 사용할 수 있다.

 

 ReflectSharp

화면을 깨끗하게 지우고 #문자를 대각선 방향으로 이동시키되 상하좌우의 벽에 닿으면 반사되도록 하여라. 임의의 키가 입력될 때까지(kbhit()가 참을 리턴할 때까지) 반복해야 하므로 무한 루프를 구성해야 한다. 배포 예제의 실행 파일을 보고 그대로 복원해 보아라.