반복문
for · while · foreach · do-while 로 같은 일을 되풀이합니다.
같은 일을 되풀이하기
1부터 100까지 더하는 코드를 sum += 1; sum += 2; 처럼
백 줄로 적을 수는 없습니다. 반복문은 같은 코드를 조건이 맞는 동안
되풀이하게 해서, 한 번만 적고 여러 번 실행되도록 만듭니다.
C#에는 네 가지가 있고, 무엇을 알고 있느냐에 따라 선택합니다.
-
for— 몇 번 돌지 알 때. 세는 숫자를 직접 다루므로 횟수가 정해진 일에 알맞습니다. -
while— 몇 번 돌지 모를 때. 조건이 거짓이 될 때까지 계속합니다. -
do-while— 조건을 나중에 보므로 본문이 최소 한 번은 실행됩니다. -
foreach— 담겨 있는 것을 처음부터 끝까지 하나씩 꺼낼 때. 몇 개인지 셀 필요가 없습니다.
1부터 5까지 더하기
아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.
int sum = 0; for (int i = 1; i <= 5; i++) { sum += i; } Console.WriteLine(sum);
코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.
괄호 안의 세 부분이 각각 시작, 계속할 조건,
한 번 돌 때마다 할 일입니다. 위 코드에서는
i 가 1에서 시작해 5 이하인 동안 돌고, 한 바퀴마다 1씩
늘어납니다. 그래서 본문이 다섯 번 실행되고 i 는
1·2·3·4·5 를 차례로 갖습니다.
실행 순서를 정확히 적으면 이렇습니다. 조건은 본문에 들어가기 전에 검사하므로, 처음부터 거짓이면 본문은 한 번도 실행되지 않습니다.
// 시작 → 조건 검사 → 본문 → 할 일 → 조건 검사 → 본문 → ... // i=1 1<=5 참 sum+=1 i=2 2<=5 참 sum+=2 // ... i=6 이 되면 6<=5 가 거짓이라 여기서 끝납니다
몇 번 돌지 모를 때는 while
while 은 조건 하나만 봅니다. 세는 숫자가 필요하면 직접
만들고 직접 늘려야 하는데, 그것을 빠뜨리면 조건이 영영 참이라 프로그램이
멈추지 않습니다. 반복문에서 가장 흔한 사고입니다.
int n = 1024; int count = 0; while (n > 1) { n /= 2; // 이 줄이 없으면 영영 끝나지 않습니다 count++; } // count 는 10
do-while 은 본문을 먼저 실행하고 조건을 나중에 봅니다.
그래서 조건이 처음부터 거짓이어도 한 번은 실행됩니다. 사용자에게
무언가를 물어보고 제대로 답할 때까지 다시 묻는 일에 어울립니다 — 묻기는 일단 한 번
해야 하기 때문입니다.
int i = 10; do { Console.WriteLine(i); // 10 이 한 번 출력됩니다 i++; } while (i < 5); // 조건은 이미 거짓
담긴 것을 하나씩 꺼낼 때는 foreach
값을 여럿 담아 둔 것을 처음부터 끝까지 탐색할 때는
foreach 가 짧고 안전합니다. 몇 개인지 셀 필요가 없고,
번호를 잘못 세어 범위 밖을 건드리는 실수도 생기지 않습니다. 값을 담아 두는 방법은
다음 단원에서 자세히 보고, 여기서는 대괄호에 값을 늘어놓은 것
정도로 두겠습니다.
int[] scores = { 90, 85, 77 }; for (int i = 0; i < scores.Length; i++) { Console.WriteLine(scores[i]); }
int[] scores = { 90, 85, 77 }; foreach (int s in scores) { Console.WriteLine(s); }
번호가 0부터 시작하고 조건이 <= 가
아니라 < 라는 점을 눈여겨보세요. 세 개짜리의 번호는
0·1·2 이므로 <= 3 으로 적으면 없는 자리를 건드려
실행 중에 예외가 납니다. foreach 에는 애초에 그 실수가
들어갈 자리가 없습니다.
다만 foreach 로 꺼낸 값은 고칠 수 없습니다.
담긴 값을 바꿔야 한다면 for 를 사용하세요.
중간에 빠져나오기
조건이 거짓이 되기를 기다리지 않고 그 자리에서 끝내려면
break, 이번 회차만 건너뛰고 다음으로 가려면
continue 를 사용합니다.
foreach (int n in numbers) { if (n < 0) continue; // 음수는 건너뜁니다 if (n > 100) break; // 100 을 넘으면 그만둡니다 Console.WriteLine(n); }
이 문법, 몇 버전부터 사용할 수 있나요
- 1.0for · while · do-while · foreach · break · continue
- 8.0await foreach — 하나씩 도착하는 것을 기다리며 탐색하기
- 12.0컬렉션 식 — [90, 85, 77] 로 값 늘어놓기
반복문 네 가지는 모두 C# 1.0부터 있었고 지금까지 문법이 바뀌지 않았습니다. 버전을 가릴 일이 거의 없는 단원입니다. 탐색할 대상을 만드는 방법과 기다리며 탐색하는 방법이 뒤에 더해졌을 뿐인데, 그것들은 3부와 4부에서 다룹니다.
직접 해보기
1부터 10까지 돌면서 짝수일 때만 출력해보세요. 2·4·6·8·10 이 한 줄씩 나오면 됩니다.
int[] scores = { 72, 95, 68, 88 }; 에서 가장 큰 값을
찾아 출력해보세요. Math.Max 없이 비교만으로 해보면
좋습니다.
- 횟수를 알면
for, 모르면while, 한 번은 해야 하면do-while입니다. - 담긴 것을 탐색할 때는
foreach가 짧고, 번호를 잘못 세는 실수가 없습니다. - 번호는 0부터이므로 조건에
<를 사용합니다.<=는 범위를 넘습니다. - 세는 값을 늘리는 줄을 빠뜨리면 영영 끝나지 않습니다.
C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.