[잼민이도 이해하는 C언어 강의] 8. 반복문 / #while, #for, #do-while
지난 C언어 강의에서는
조건문이라는 문법을 배웠습니다.
조건문을 통해 특정한 조건을 만족할 때에만
실행할 수 있는 구조를 만드는 방법을 배웠는데
이번에는
특정한 조건을 만족한다면
계속 반복 실행할 수 있는 구조를 만드는
반복문에 대해서 배워보도록 하겠습니다.
1. while |
2. for |
3. do-while |
4. break, continue |
5. 중첩된 반복문 |
반복문에는 3가지의 종류가 있습니다.
if문에서 학습했던
if, else-if, else는 함께 사용하는 용도였지만
반복문의 whlie, for, do-while은
모두 하나하나가 성격이 다른 별개의 반복문입니다.
서로 다른 성격을 가지고 있기 때문에
상황에 맞게 반복문을 골라서 사용할 수 있어야합니다.
1. while
지난 시간에 학습했던
if문을 떠올려 봅시다.
if문은 if(조건식)과 같은 방식으로 사용하며
조건식이 참인경우 { } 내부를 실행하도록 설계된 문법이었습니다.
while도 비슷한 생김새를 가집니다.
아래 코드를 먼저 확인해봅시다.
#include <stdio.h>
int main(void)
{
int a = 1;
while(a < 5)
{
printf("#%d\n",a);
a++;
}
return 0;
}
if문과 상당히 비슷하죠?
작동 방식도 비슷합니다.
if문은 조건식이 참이라면 실행을 하고,
거짓이라면 실행을 하지 않는 구조였지만
whlie문은 조건식이 참이라면 실행을 하고,
{ } 를 빠져나오지 않고,
조건식을 한번 더 확인합니다.
만일 조건식이 또 참이라면
{ } 를 한번 더 실행합니다.
따라서 조건식이 거짓이될 때까지
즉, 조건식이 참인 동안에 반복되는 구조입니다.
(실제로 while은 ~동안에 라는 뜻을 가진 영단어죠)
따라서 아래와 같은 실행 결과를 보여줄 수 있습니다.
2. for
for문에 대해서 설명하기 앞서
반복문의 기본 구조에 대해서 알아봅시다.
반복문에 들어가는 3요소가 있습니다.
조건식, 초기식, 증감식입니다.
조건식은 반복문을 계속해서 작동시킬지 중단할지를 결정하는
중요한 요소기때문에 꼭 있어야하며,
초기식은 조건식을 처음에 확인하기 위해서
꼭 있어야하는 중요한 요소입니다.
초기 데이터가 없다면 조건식도 올바르게 작동할 수 없겠죠?
마지막 증감식은 초기 데이터에서 데이터를 증가 또는 감소시키는 식입니다.
이를 통해 반복문의 조건식을 언젠가 거짓으로 바꿔버릴 수 있습니다.
반복문은 조건식이 거짓이 되기 전까지
계속해서 실행됩니다.
따라서 증감식은 반복문이 올바르게 종료될 수 있도록 도와주기 위해
필요한 식입니다.
따라서 위 3요소인 조건식, 초기식, 증감식은
반복문에 필요한 3요소입니다.
위에서 먼저 보았던 while 예제도 마찬가지입니다.
잘 보면 이 3요소가 포함되어 있습니다.
#include <stdio.h>
int main(void)
{
int a = 1; // 초기식
while(a < 5) // 조건식
{
printf("#%d\n",a);
a++; // 증감식
}
return 0;
}
이렇게 말이죠
하지만 whlie문은 ( ) 내부에
조건식만 작성할 수 있도록 설계되어 있습니다.
for문은 ( ) 내부에 초기식, 조건식, 증감식을 모두 작성할 수 있도록
설계된 반복문입니다.
for(초기식 ; 조건식 ; 증감식)
과 같은 방식으로 작성합니다.
아래 코드를 보겠습니다.
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<5;i++)
{
printf("#%d\n",i);
}
return 0;
}
실행 결과는 아까와 동일하지만
내부 구조가 while과 다른 것을 볼 수 있습니다.
; 기호를 기준으로 초기식, 조건식, 증감식이
for문에 모두 작성되어 있습니다.
3. do-while
do-while문은
while과 매우 비슷합니다.
따라서 while와 직접 코드와 실행 결과를 비교하면서
do-while에 대해서 알아봅시다.
#include<stdio.h>
int main(void)
{
int a = -1;
while(0 < a)
{
printf("#%d",a);
a++;
}
return 0;
}
#include<stdio.h>
int main(void)
{
int a = -1;
do
{
printf("#%d",a);
a++;
}while(0 < a);
return 0;
}
비슷해 보이지만
두 코드는 다른 코드입니다.
위 코드는 앞서 배운 while문으로 작성된 코드이고,
아래 코드는 do-while문으로 작성된 코드입니다.
while문으로 작성된 코드부터 살펴봅시다.
"???? 아무것도 안나오는 데요??"
당연합니다.
초기식인 a = -1;과 조건식 0 < a를 보면처음부터 조건이 거짓인 것을 확인할 수 있습니다.
따라서 반복문이 한번도 실행되지 못하고 종료됩니다.
이번에는 아래 do-while을 활용한 코드를 봅시다.
분명 초기식, 조건식, 증감식이 모두 동일한데
이번에는 실행이 되었습니다.
실행 결과로부터 알 수 있듯이 딱 한 번만 실행된 것으로 보입니다.
분명 초기식과 조건식 증감식이 모두 똑같은데
어떻게 된 일 일까요?
그 이유는 바로 조건식의 위치입니다.
while문의 경우 조건식이 맨 위에 있습니다.
반면 do-while문의 경우 조건식이 맨 아래에 붙습니다.
따라서 while문은 반복문 구조가 시작하기 전에
조건을 확인하게 되고,
do-while문은 일단 조건과 상관없이 한 번은 실행을 한 뒤
조건을 확인하게 되는 것입니다.
그래서 어떠한 조건이 오더라도 do-while문은
최소 한 번은 반드시 실행을 할 수 밖에 없습니다.
4. break, continue
break와 continue는
반복문 내부에서 사용할 수 있는 제어문입니다.
break부터 알아봅시다.
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<10;i++)
{
if(5<i)
{
break;
}
printf("#%d\n",i);
}
return 0;
}
break는 번역하면 부수다, 깨부수다 등의 의미를 가지고 있습니다.
그 의미 그대로 반복문 내부에서
반복문의 조건식과 관계없이
break가 실행되면 무조건 반복을 중단하는 역할을 수행합니다.
(반복문을 깨부수는...)
위 코드도 마찬가지로
구조상 원래는 총 10번 반복되어야 하는 for문입니다.
하지만 중간에 i가 5보다 커지면 중단하는 break 때문에
i는 실제로 5까지만 증가할 수 있습니다.
break는 반드시 조건문과 함께 작성해야 합니다.
조건문과 함께 작성하지 않았다고 해서 문법적인 오류는 없지만
조건문이 없다면 break가 실행되자마자 반복문이 종료되는 것이기 때문에
사실상 반복문이 없는 것이나 마찬가지이기 때문입니다.
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<10;i++)
{
if(i%2 == 0)
{
continue;
}
printf("#%d\n",i);
}
return 0;
}
continue와 break의 차이는 반복 중단 여부에 있습니다.
break는 반복문을 중단하는 역할을 수행했지만
continue는 완전히 중단하지 않고 아래 코드를 생략하는 역할을 수행합니다.
continue를 만나면 continue를 기준으로 아래의 코드를 실행하지 않고,
생략한 뒤 다음 사이클로 넘어가게 됩니다.
위 코드에서 continue는
i가 2로 나누어 나머지가 0일 때,
즉, 짝수일 때 실행하기로 하였습니다.
따라서 i가 0, 2, 4, 6, 8인 경우
i를 출력하는 부분을 생략하고 다음 사이클로 넘어가게 됩니다.
continue 역시
break와 마찬가지의 이유로
조건문과 함께 작성해야 됩니다.
5. 중첩된 반복문
조건문 강의에서 학습했던 내용을 기억하시나요?
조건문을 중첩해서 사용할 수 있다는 사실을 강의했었습니다.
반복문도 마찬가지입니다.
반복문이 중첩된다면 어떤 모습이 될까요.
반복을 반복한다
반복문 중첩은 말로는 이해가 어렵습니다.
아래 예제를 먼저 확인해 봅시다.
#include<stdio.h>
int main(void)
{
int i, j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
반복문 내부에 반복문이 있는
중첩 반복문 구조입니다.
안 쪽에 있는 반복문부터 살펴봅시다.
*을 5번 출력하는 반복문을 확인할 수 있습니다.
바깥에 있는 반복문은
3번 반복하는 반복문입니다.
그럼 정리하자면
*을 5번 출력하는 반복문을 3번 반복한다.
로 해석할 수 있습니다.
따라서 별이 5개씩 3줄이 출력되는 결과를 볼 수 있습니다.
중첩 반복 구조를 사용할 때 한 가지 주의해야 될 점은
변수입니다.
위 코드에서도 i와 j를 굳이 두 개를 사용했습니다.
"i 변수 하나 두 번 쓰면 되지 굳이 변수 왜 두 개 만듬??"
i 하나로 중첩 반복문을 표현하게 되면
반복 횟수에 영향을 미치게 됩니다.
원래 i가 1씩 증가되어 3번만 실행되는 구조임에도
안쪽의 반복문의 증감식에 의해 i가 또 증가되면서
원하는 형태로 반복될 수가 없는것이죠
중첩된 반복문을 사용할 때에는
반복이 아직 끝나지 않았기 때문에
같은 변수를 사용하게 되면 서로에게 영향을 줄 수 있어서
서로 다른 변수를 사용해야 합니다.
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<3;i++)
{
printf("*");
}
puts("");
for(i=0;i<5;i++)
{
printf("*");
}
return 0;
}
하지만 이처럼 중첩 형태가 아닌
단순히 반복문을 두 번 사용하는 구조의 경우에는
서로 다른 변수를 굳이 두 개 만들 필요가 없습니다.
반복문이 중첩된 구조가 아니기에
서로에게 영향을 줄 일도 없을 뿐더러
순서대로 처음 등장한 반복문이 완전히 종료되고
다음 반복문이 실행되는 구조이기 때문입니다.
중첩 반복문 구조는
흔히 사용되는 방법이고,
응용되어 3번 이상 중첩되기도 하니
이 중첩 반복 구조에 대해서 잘 이해하는 것이 좋습니다.
이렇게 오늘은
프로그래밍의 꽃, 반복문에 대해서 알아보았습니다.
다음 강의에서는
배열에 대해서 학습해 보도록 하겠습니다.
'프로그래밍 > C언어' 카테고리의 다른 글
[잼민이도 이해하는 C언어 강의] 9. 배열과 문자열 / #array,#문자열 (1) | 2022.07.15 |
---|---|
[잼민이도 이해하는 C언어 강의] 7. 조건문 / #if, #else if, #else (0) | 2022.04.18 |
[잼민이도 이해하는 C언어 강의] 6. 연산자 / #산술연산자, #관계연산자, #논리연산자 (0) | 2022.04.15 |
[잼민이도 이해하는 C언어 강의] 5. 입력하기 / #scanf (3) | 2022.04.09 |
[잼민이도 이해하는 C언어 강의] 4. 변수란? / #변수 (1) | 2022.04.08 |