#16 반복문(1)

코드의 특정 부분을 반복해봅시다

Table Of Contents

for

for 반복문은 다음처럼 사용합니다.

for (초기식; 조건식; 변화식) { 반복할 코드 }

for 반복문을 만나면, 컴퓨터는 이렇게 행동합니다.

  1. 초기식을 실행합니다.
  2. 조건식을 실행해서 참인지 거짓인지 따져봅니다.
    1. 조건식이 거짓이라면, 반복문을 종료합니다.
    2. 조건식이 참이라면, {} 안의 반복할 코드를 한 번 실행합니다.
  3. 변화식을 실행합니다.
  4. 2번으로 돌아가, 조건식 결과값에서 거짓이 나올 때까지 2~5를 반복합니다.

예시 1.

예시와 함께 살펴보겠습니다. for 반복문과 함께 hello world!를 100번 출력해 볼까요?

#include <stdio.h> int main(void) { for (int i = 0; i < 100; i++) { printf("Hello world!\\n"); } return 0; }

초기식: int i = 0

조건식 : i < 100

변화식 : i++

반복할 코드 : printf("hello world!\\n");

위 실행 순서에 대입해 봅시다.

  1. int i = 0을 실행합니다. 현재 i에는 0이 저장되어 있습니다.
  2. i < 100을 실행합니다. 0 < 100이므로 조건식의 결과는 참입니다.
    1. 결과가 참이므로 반복할 코드를 실행해 첫 번째 Hello world!를 출력합니다.
  3. 변화식 i++를 실행합니다. 이제 i에는 1이 저장되어 있습니다.
  4. 2번으로 돌아가, 다시 조건식을 실행합니다. 1 < 100이므로, 조건식의 결과는 참이고, 두 번째 Hello world!를 출력합니다.
  5. 변화식 i++를 실행하면 i에는 2가 저장됩니다.
  6. 위 과정을 계속 반복하다가 변화식 i++가 실행되고, i = 100인 상태가 되었다고 가정합시다.
  7. 100 < 100은 거짓이므로 더이상 {} 안의 코드를 실행시키지 않고, 반복문을 빠져나옵니다.

이해가 되나요?

예시 2.

이번에는 Hello world!처럼 똑같은 문장을 출력하지 말고, 구구단 2단을 출력해 봅시다.

반복문을 사용하지 않는다면 아래처럼 출력할 수 있겠죠?

#include <stdio.h> int main(void) { printf("2 * 1 = 2\\n"); printf("2 * 2 = 4\\n"); printf("2 * 3 = 6\\n"); printf("2 * 4 = 8\\n"); printf("2 * 5 = 10\\n"); printf("2 * 6 = 12\\n"); printf("2 * 7 = 14\\n"); printf("2 * 8 = 16 n"); printf("2 * 9 = 18\\n"); return 0; }

관찰해 보면, 라는 숫자는 동일하고, 19까지의 숫자는 계속 변화합니다. 등호 뒤의 결과값은 2와 19의 숫자를 곱한 값이고요. 그렇다면 위에서 i를 0100까지 변화시켰던 것처럼, 이번에는 i를 19로 변화시키면 되겠죠?

#include <stdio.h> int main(void) { for (int i = 1; i <= 9; i++) { printf("2 * %d = %d\\n", i, 2 * i); } return 0; }

위 코드가 이해되시나요?

예시 3.

if문 안에 if문을 넣었던 것 기억 나시나요?

for문 안에도 for문이 들어갈 수 있습니다.

이번에는 구구단 2단만 출력하지 말고, 2단부터 9단까지 출력해 보도록 합시다.

위에서 2단을 출력하는 방법은 알았으니, 2~9단은 이렇게 출력할 수 있겠네요.

#include <stdio.h> int main(void) { for (int i = 1; i <= 9; i++) { printf("2 * %d = %d\\n", i, 2 * i); } for (int i = 1; i <= 9; i++) { printf("3 * %d = %d\\n", i, 3 * i); } ... for (int i = 1; i <= 9; i++) { printf("9 * %d = %d\\n", i, 9 * i); } return 0; }

관찰해 보면 2~9까지의 숫자가 계속 변화하고, 나머지 내용은 전부 같네요. 이럴 경우에는 i 대신에 다른 변수를 선언하고, 그 변수를 2부터 9까지 증가시켜주면 됩니다.

#include <stdio.h> int main(void) { for (int j = 2; j <= 9; j++) { for (int i = 1; i <= 9; i++) { printf("%d * %d = %d\\n", j, i, j * i); } } return 0; }

변수가 늘어서 조금 복잡해졌습니다. 코드를 다시 확인해볼게요.

for (int j = 2; j <= 9; j++) { for (int i = 1; i <= 9; i++) { printf("%d * %d = %d\\n", j, i, j * i); } }

for문이 2개 사용되었습니다. 바깥의 for문은 2부터 9까지를 반복하도록 만드는 for문입니다. 2~9단을 순서대로 출력하기 위함이죠. j가 2에서 9까지 커지면서 각각 한 번씩 안쪽의 for문을 실행하면, 2단, 3단, 4단, ... 9단이 순서대로 출력됩니다.

안쪽의 for문은 현재 바깥쪽 for문에서 선언된 j를 가지고, j단을 출력하는 코드입니다. 예제 2번에서 본 코드에 j를 그대로 넣은 것과 같습니다.

코드가 복잡해서 이해되지 않는다면, 언제든지 이해되지 않는다고 말해주세요!

예시 4.

for문의 초기식, 조건식, 변화식, 실행할 코드는 빈칸이어도 괜찮습니다.

예를 들어서

for (int i = 1; i < 10; i++) { }
int i = 1; for (; i < 10;) { }
for (int a = 10;;a++) { printf("%d\\n", a); }

등등의 식이 가능합니다.

첫 번째 식은 i++를 반복하다가 i가 10이 되면 종료됩니다. 하지만 나머지 두 식은 조건문을 벗어나지 않기 때문에, 무한으로 실행됩니다. 이런 경우를 막기 위해서는 break나 continue 등을 이용해서 반복문을 제어해 주어야 합니다. break와 continue는 다음 글에서 알아보도록 하겠습니다.

while

이번에는 while 반복문에 대해서 알아봅시다. while 반복문은 이렇게 생겼습니다.

while (조건문) { 반복할 코드 }

for문과는 달리 초기식과 변화식이 없습니다.

while 반복문을 만나면, 컴퓨터는 이렇게 작동합니다.

  1. 조건문이 참인지 거짓인지 확인한다.
    1. 참이라면 반복할 코드를 실행한다.
    2. 거짓이라면 while문을 종료한다.
  2. 1을 계속 반복한다.

for문을 while문의 문법에 맞게 바꾸려면

초기식 while (조건문) { 반복할 코드 변화식 }

처럼 쓰면 됩니다.

예시 1.

구구단 2단을 출력하는 예시를 다시 살펴볼까요?

for문으로 작성한 코드는 아래와 같았습니다.

for (int i = 1; i <= 9; i++) { printf("2 * %d = %d\\n", i, 2 * i); }

이 코드를 그대로 while문으로 옮기면 이렇게 됩니다.

int i = 1; while (i <= 9) ( printf("2 * %d = %d\\n", i, 2 * i); i++; }

예시 2.

while문 역시 중첩해서 쓸 수 있습니다.

2단부터 9단까지를 출력하려면 아래처럼 쓰면 됩니다.

int i = 1, j = 2; while (j <= 9) ( while (i <= 9) ( printf("%d * %d = %d\\n", j, i, j * i); i++; } j++; }

저는 j = 2를 바깥쪽 while문 밖으로 썼지만, 안으로 넣어도 괜찮습니다.

예시 3.

for문과 while문을 함께 써도 괜찮습니다.

int j = 2; while (j <= 9) ( for (int i = 1; i <= 9; i++) { printf("%d * %d = %d\\n", j, i, j * i); } j++; }

반대로 for문을 밖에 쓰는 방법 또한 괜찮습니다.

while문에서 역시 조건식이나 반복할 코드를 비워두어도 괜찮습니다.

Do While

do while 반복문은 while 반복문과 비슷하게 동작합니다.

do { 반복할 코드 } while (조건문)

비슷하면서 조금 다르게 생겼죠? do while문은 반복할 코드가 조건문보다 앞에 있습니다. 따라서 조건문을 실행하기 전에, 반복할 코드가 먼저 한 번은 실행됩니다.

for문이나 while문에서는 반복문이 한 번도 실행되지 않고 종료될 수 있습니다.

for (i = 0; 1 == 2; i++) ...
while (1 > 2) ...

이러한 코드에서는 for, while 안의 반복할 코드가 한 번도 실행되지 않고 종료되겠죠?

하지만 do while문에서는 조건문에 이런 내용이 들어가 있어도 반복할 코드가 무조건 한 번은 실행된다는 점이 다릅니다.