SturdyCobble's Study Note

[프로그래밍] 3.3 제어문(3) - while, do~while, break, continue, goto 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 3.3 제어문(3) - while, do~while, break, continue, goto

StudyingCobble 2019. 8. 5. 23:17

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


 

※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

 

이번 글의 범위는 다음과 같습니다.

 

  while break, continue do~while goto
C/C++ O O O O
Java O O O X
Python O O X X

 

이번 글에서는 여러가지 제어문을 다뤄보겠습니다.

 

 먼저 반복문인 while문입니다. while문은 특정 조건식을 평가해서 조건이 성립하는 동안 연결된 블록의 내용을 반복합니다.

 

while( 조건식 ){
	실행할 내용;
}

while( 조건식 ):
	실행 내용

 

저번 글에서 다룬 비교 연산자 등을 이용해 다음과 같이 코드를 작성해 볼 수 있습니다. 아래 코드는 10 팩토리얼(10!)을 계산하는 예시입니다.

int i = 1;
int fac = 1;
while(i <= 10){
	fac = fac * i;
    i = i + 1;
}

i = 1
fac = 1
while(i <= 10):
    fac = fac * i
    i = i + 1

 

위 코드의 계산 결과 fac에는 10! = 10×9×8×7×6×5×4×3×2×1 = 3628800이 저장됩니다.

 C/C, Java에서는 i++;과 같이 증감연산자를 사용하여 i = i + 1;이라고 쓸 것을 간단히 나타낼 수 있습니다.(반대로 i--는 i = i - 1을 나타냅니다.)

 

위 코드를 순서도로 나타낸다면 아래와 같이 나타낼 수 있을 것입니다.

 

때로는 명령을 최소한 한 번은 실행해야 하는 경우가 있습니다. 예를 들자면, 입력을 받는 경우 최소한 한번의 입력을 받고, 조건에 맞지 않는 값을 입력했을 때 다시 입력하도록 요구해야 한다면, 코드를 두 번쓰는 일은 귀찮은 일일 것입니다.

 

100점이 넘는 점수를 받아오면 다시 입력을 받는 프로그램. 적어도 토플 점수는 아님. 토익점수도 아님.

위의 순서도를 보면 알겠지만, scan score 부분이 중복되어 사용되었습니다. C/C++, Java(Python 제외)는 do~while문으로 이 문제를 해결합니다.

 

do~while문을 사용한다면??

do~while문은 위와 같이 한번 코드를 실행하고 계속 반복할 수 있도록 합니다. 코드로는 다음과 같이 구현됩니다.

 

do{
실행내용
}while(조건식)

 

순서도에서 조건식이 실행 내용 뒤에 온 것처럼, 여기서도 조건식이 뒤로 갔다는 점이 특징입니다.

 

조건식은 참(True) 또는 거짓(False)의 값을 가지기에 다음과 같이 무한히 도는 반복문을 만드는 것도 가능합니다. 이때 , C/C++,Python에서는 1이 곧 True, 참과 같지만, (반대로 0은 거짓), Java에서는 true,false를 통해 참, 거짓을 나타내야 합니다. (1과 0에 대응되는 Boolean값으로는 Python에서는 True/False, C++에서는 true, false를 사용할 수 있습니다.) (이는 Java가 웬만하면 자동적인 형변환을 하지 않기 때문입니다.)

 

while(1):
    print("ENDLESS")
print("ROAD")

 

 

위 예제에서는 끝없이 ENDLESS가 출력되고, ROAD는 별다른 일을 하지 않는 이상 출력되지 못합니다. 하지만, 이러한 무한루프는 대부분 큰 의미를 찾기 힘듭니다.

 

 무한 루프의 경우도 그렇고 프로그래밍을 하다 보면 중간에 반복문의 흐름을 조절하기 위한 제어문이 필요한데, 이때 break문과 continue문이 사용됩니다. 네 언어 모두 break와 continue로 표시되며, C/C++,Java에서는 항상 그렇듯 세미콜론이 붙는다는 점만 다릅니다.

 

//반복문 안에서
break;
continue;

#반복문 안에서
break
continue

아래는 break문과 continue문이 어떻게 흐름을 조절하는 지 표시해줍니다.

i = 0
while(1):
    print(“break이전과“)
    if( i>= 1 ):
        break
    print(“break이후”)
    i = i + 1

위 예시는 다음과 같은 과정을 거쳐 실행됩니다. ( 형광펜 표시가 된 부분은 실행이 된 부분이며, break문으로 생략된 부분은 X표시로 표시하였습니다. (보기 편하도록 각 루프를 개별적으로 표시하였으며, 그 아래 루프가 종결된 후의 i의 값을 표시해두었습니다.)

 

즉, break문은 무조건 해당 반복문을 탈출합니다. 루프 중간에 삽입되었다면, break문을 만나는 즉시 반복이 중단되기에, 그 뒤의 내용은 실행되지 않습니다.

 

 

비슷한 예제로 break를 continue로 바꾸고 if문의 조건을 i == 1로 바꿔보았습니다.

 

i = 0
while(1):
    print(“continue이전과“)
    if( i == 1 ):
        continue
    print(“continue이후”)
    i = i + 1

 

continue문은 해당 조건 만족시 해당 루프의 뒷 부분을 생략하며, break문과는 다르게 반복문은 계속 진행합니다.

 

 

C/C++에는 goto문이라는 독특한 제어문이 존재합니다. 이는 label해둔 위치로 바로 이동하는 제어문입니다. 보기에는 단순하고 명료해보이지만, 남용하다간 코드가 꼬이게 되므로 자주 사용하지 않는 제어문입니다.

 

레이블:

//복잡한 코드

goto 레이블;

레이블의 이름은 당연히 변수이름처럼 영어대소문자등으로 시작하여 구성해야겠죠? 레이블의 위치는 어디든 상관없으며 콜론(:)으로 마무리해야 합니다. 특히 중첩된 반복문을 탈출하는 경우라면 엄청 단순하고 명료하지만, 남발하는 경우 다음과 같은 치명적인 문제가 있습니다.

 

위 코드는 매우 단순해 보이지만, 실제로는 네 개 식 사이를 오가는 무한 루프입니다. 이 사실을 코드만 봐서는 알기 힘들고, 나중에 코드의 실행결과를 예측불허하게 만듭니다. 

 

 

Java에는 goto없이 label만 존재합니다. 똑같이 콜론(:)을 이용하며, 반복문 앞에 사용될 수 있습니다. 그리고 break문 사용시 사용되어 특정 label이 붙은 반복문을 바로 탈출할 수 있습니다.

 

Loop1 : while(true){
	Loop2 : while(true){
    	Loop3 : while(true){
        	Loop4 : while(true){
            	break Loop1;
            }
        }
    }
}

 

이 경우 바로 가장 바깥의 Loop1 반복문을 탈출하게 됩니다.

Comments