이번에는 저번 글 http://widevery.tistory.com/7 에 이어서 while문의 루프와 중첩에 대하여 알아 보겠습니다.





1. 무한루프


while문에서 while(조건식) 과 같이 조건식이 '참'인 경우 while문의 내용을 실행하고, 조건식이 '거짓'일 경우 while문을 종료하게 됩니다.


그렇다면 조건식이 '항상 참'인 경우에는 어떻게 될까? 라는 생각을 가져 볼 수 있습니다. 이와 같은 생각으로 다음과 같이 해볼 수 있습니다.



0을 제외한 나머지 값은 참으로 인식하니까 참으로 인식하는 값 중 대표적으로 많이 쓰이는 1을 조건식에 넣어서 실행 해볼까? 라는 생각을 가지고 실행하게 되면 위의 예제에서처럼 따로 멈춰주지 않는 이상 계속 실행을 하게 됩니다. ( Ctrl + C를 누르면 멈추게 됩니다.)


이렇듯 반복문의 탈출조건이 성립하지 않는 경우 무한루프를 형성한다고 합니다.


이러한 무한루프는 실수로 만들어지는 경우도 있지만, 의도적으로 만들어서 break문과 함께 사용하기도 합니다.

(break문은 추후 조건에 따른 흐름의 분기와 관련하여 내용을 다루면서 그 때 다시 다루도록 하겠습니다.)





2. while문의 중첩


while문의 중첩은 말 그대로 반복을 위해 사용한 while문 안에 while문이 존재하는 경우를 의미합니다.


다음 예제는 while문을 중첩시켜서 구구단 2~9단 까지 출력을 하는 예제인데, 해당 예제를 통해서 중첩된 while문의 코드 흐름을 이해하도록 하겠습니다.



위의 예제를 보시면 코드를 실행한 결과로 오른쪽에 구구단이 출력이 된 것과 해당 코드가 구구단을 출력하기 위한 코드라는 것을 확인 할 수 있습니다.


짧고 간단한 코드이지만 while문의 중첩을 모르는 상태에서 보게 될 경우 복잡해 보일 수가 있습니다.


우선 위 예제의 코드에서 다음과 같은 내용을 알 수 있습니다.


1) while문의 중첩

2) 원하는 결과의 출력을 위한 변수 초기화

3) while문의 조건 설정


이와 같은 내용들을 확인 할 수 있습니다.


먼저 while문에서 while(조건식) 의 '조건식'이 만족할 때까지 while문 내부에 있는 문장을 실행하는 것을 저번 글에서 알아 보았습니다.


그렇다면 while문의 내부에 while문이 있다면 while문 안쪽의 while문이 끝날 때까지 처음 작성한 while문은 계속 실행이 된다는 것을 알 수 있습니다.


이와 같은 내용을 바탕으로 위의 코드를 해석하면 첫 번째 while문의 조건이 i = 2 일 때 내부의 while문을 9번 실행하고, i가 하나씩 증가 되는 것을 알 수 있습니다.


i 값이 하나씩 증가하여 i 의 값이 9일 때까지 실행이 되고, i 가 10이 되면 while문을 실행하지 않고, while문을 종료 후 그 다음 문장을 실행하게 됩니다.


또한 위의 코드에서 첫 번 째 while문이 끝날 때까지 내부의 while문을 실행해야 되는데 9번째 줄에서 j = 1; 로 초기화를 시켜주는 이유는 초기화를 하지 않고 진행하게 될 경우 구구단을 정상적으로 출력하지 않게 됩니다.


초기화를 진행 해 주지 않으면 j의 값이 계속 10으로 지정 되어 있기 때문에 다음과 같이 실행 결과가 나오게 됩니다.



[구구단 출력 예제에서 곱해지는 값인 j 값의 초기화를 하지 않았을 경우]




또한 while문을 사용하지 않고 예제에 사용된 구구단 출력을 할 수도 있습니다.



[while문의 중첩을 활용하지 않고 출력을 한 경우]



위와 같이 효율이 떨어지게 됩니다.


따라서 반복문의 중첩을 자주 사용하게 됩니다.










이것으로 반복문 중 하나인 while문에 대하여 모두 알아 보았습니다.


다음 글에서는 반복문 중 하나인 'do~while문에 의한 문장의 반복'에 대하여 공부하고 글을 올리도록 하겠습니다.












'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - for문 (1)  (0) 2017.01.12
C언어 반복문 - do~while문  (0) 2017.01.09
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 printf 함수 와 scanf 함수  (0) 2017.01.01
C언어 상수와 기본 자료형  (0) 2016.12.27

+ Recent posts