do-while 은 일단 한 번은 한다
앞 글의 while 은 조건을 먼저 봤습니다. 그래서 처음부터 거짓이면
본문에 한 번도 들어가지 않습니다. 대부분은 그게 맞습니다.
그런데 이런 일이 있습니다. 사용자에게 입력을 받아서,
exit 라고 쓰면 끝내고 아니면 계속 받는 프로그램입니다.
string input = ???;
while (input != "exit")
{
input = Console.ReadLine();
}
조건을 검사하려면 input 에 값이 있어야 하는데,
값을 받으려면 반복문 안으로 들어가야 합니다.
검사가 먼저인 구조라 아직 받지도 않은 값을 검사하게 됩니다.
억지로 맞추려면 이렇게 됩니다.
string input = ""; // 아무 의미 없는 값을 넣어 둡니다
"" 는 뜻이 없습니다. 그냥 첫 검사를 통과시키려고 넣은 값입니다.
읽는 사람은 이 빈 문자열이 왜 있는지 알 수 없습니다.
먼저 한 번 하고 나서 더 할지 묻는 반복문이
do-while입니다.
do-while 은 이렇게 생겼다
do
{
한 번은 무조건 실행되는 코드
}
while (조건);
while 이 아래로 내려가 있습니다. 그리고 마지막에 세미콜론이 붙습니다.
이게 자주 빠뜨리는 부분입니다. while (조건) 뒤에 블록이 오지 않고
거기서 문장이 끝나기 때문에 세미콜론이 필요합니다.
앞에서 if (조건); 처럼 세미콜론을 잘못 찍으면 안 된다고 했는데,
do-while 은 반대로 찍어야 합니다. 붙는 자리가 다릅니다.
아까 그 코드를 다시 쓰면 이렇게 됩니다.
string input;
do
{
input = Console.ReadLine();
Console.WriteLine("입력: " + input);
}
while (input != "exit");
의미 없는 초기값이 사라졌습니다. 한 번은 받는다는 것이 문법으로 보장되니 받기 전에 검사할 일이 없습니다.
조건이 처음부터 거짓이어도 한 번은 돈다
두 반복문에 똑같이 처음부터 거짓인 조건을 줘 보겠습니다.
while 이었다면 아무것도 안 찍혔을 코드가 한 줄을 찍었습니다.
최소 1회가 보장된다는 것이 do-while 의 전부입니다.
언제 무엇을 쓰나
| while | do-while | |
|---|---|---|
| 검사 시점 | 본문 전 | 본문 후 |
| 최소 실행 횟수 | 0회 | 1회 |
| 어울리는 일 | 조건이 안 맞으면 안 해야 하는 일 | 해 보고 나서 판단하는 일 |
| 예 | 남은 적이 있는 동안 공격 | 메뉴를 띄우고 입력 받기 |
기준은 간단합니다. 한 번도 안 하는 것이 정상인가를 물어보면 됩니다.
장바구니에 담긴 물건을 하나씩 계산하는 코드는 빈 장바구니일 때
한 번도 안 도는 것이 맞습니다. while 입니다.
메뉴를 띄우고 입력을 받는 코드는 아무것도 안 띄우고 끝나면 안 됩니다.
do-while 입니다.
실제로는 while 을 훨씬 많이 씁니다.
do-while 은 “일단 한 번”이 정말 필요한 자리에만 쓰면 됩니다.
정리
do-while은 본문을 먼저 실행하고 조건을 나중에 봅니다.- 조건이 처음부터 거짓이어도 본문은 한 번 실행됩니다.
while (조건);의 세미콜론을 빠뜨리기 쉽습니다. 여기서는 찍는 것이 맞습니다.- 받기 전에 검사해야 하는 상황에서 의미 없는 초기값을 넣지 않아도 됩니다.
- 한 번도 안 하는 것이 정상이면
while, 아니면do-while입니다.