---
title: "do-while 은 일단 한 번은 한다"
description: "while 은 조건을 먼저 보고 do-while 은 본문을 먼저 실행합니다. 물어보기 전에 한 번은 해야 하는 일에 씁니다."
author: "유니얼"
pubDate: 2026-09-08
category: "programming/csharp/basics"
tags: ["C#", "기초"]
canonical: https://blog.unialgames.com/posts/csharp-do-while/
---
앞 글의 `while` 은 조건을 먼저 봤습니다. 그래서 처음부터 거짓이면
본문에 한 번도 들어가지 않습니다. 대부분은 그게 맞습니다.

그런데 이런 일이 있습니다. 사용자에게 입력을 받아서,
`exit` 라고 쓰면 끝내고 아니면 계속 받는 프로그램입니다.

```csharp
string input = ???;

while (input != "exit")
{
    input = Console.ReadLine();
}
```

조건을 검사하려면 `input` 에 값이 있어야 하는데,
값을 받으려면 반복문 안으로 들어가야 합니다.
검사가 먼저인 구조라 **아직 받지도 않은 값을 검사**하게 됩니다.

억지로 맞추려면 이렇게 됩니다.

```csharp
string input = "";      // 아무 의미 없는 값을 넣어 둡니다
```

`""` 는 뜻이 없습니다. 그냥 첫 검사를 통과시키려고 넣은 값입니다.
읽는 사람은 이 빈 문자열이 왜 있는지 알 수 없습니다.

> **먼저 한 번 하고 나서 더 할지 묻는 반복문이 `do-while` 입니다.**

## do-while 은 이렇게 생겼다

<figure class="diagram">
<svg viewBox="0 0 680 240" role="img" aria-label="while 은 조건을 먼저 보고 do-while 은 본문을 먼저 실행하는 것을 비교한 그림">
<text x="20" y="24" fill="var(--text-muted)" font-size="13">while</text>
<text x="380" y="24" fill="var(--text-muted)" font-size="13">do-while</text>
<g fill="var(--bg)" stroke="var(--border)">
<rect x="60" y="42" width="150" height="46" rx="8"></rect>
<rect x="60" y="136" width="150" height="46" rx="8"></rect>
<rect x="420" y="42" width="150" height="46" rx="8"></rect>
<rect x="420" y="136" width="150" height="46" rx="8"></rect>
</g>
<g stroke="var(--text-muted)" stroke-width="1.4" fill="none">
<path d="M135 88 L135 130"></path>
<path d="M210 159 L250 159 L250 65 L214 65"></path>
<path d="M495 88 L495 130"></path>
<path d="M570 159 L610 159 L610 65 L574 65"></path>
</g>
<g fill="var(--text-muted)" stroke="none">
<path d="M135 130 l-5 -9 l10 0 z"></path>
<path d="M214 65 l9 -5 l0 10 z"></path>
<path d="M495 130 l-5 -9 l10 0 z"></path>
<path d="M574 65 l9 -5 l0 10 z"></path>
</g>
<g text-anchor="middle" font-size="14">
<text x="135" y="71" fill="var(--accent)">조건 검사</text>
<text x="135" y="165" fill="var(--text)">본문</text>
<text x="495" y="71" fill="var(--text)">본문</text>
<text x="495" y="165" fill="var(--accent)">조건 검사</text>
</g>
<g text-anchor="middle" font-size="13" fill="var(--text-muted)">
<text x="135" y="215">거짓이면 본문 실행 0회</text>
<text x="495" y="215">거짓이어도 본문 실행 1회</text>
</g>
</svg>
<figcaption>먼저 오는 것이 조건이냐 본문이냐, 그 차이 하나다.</figcaption>
</figure>

```csharp
do
{
    한 번은 무조건 실행되는 코드
}
while (조건);
```

`while` 이 아래로 내려가 있습니다. 그리고 **마지막에 세미콜론이 붙습니다.**

이게 자주 빠뜨리는 부분입니다. `while (조건)` 뒤에 블록이 오지 않고
거기서 문장이 끝나기 때문에 세미콜론이 필요합니다.
앞에서 `if (조건);` 처럼 세미콜론을 잘못 찍으면 안 된다고 했는데,
`do-while` 은 반대로 **찍어야** 합니다. 붙는 자리가 다릅니다.

아까 그 코드를 다시 쓰면 이렇게 됩니다.

```csharp
string input;

do
{
    input = Console.ReadLine();
    Console.WriteLine("입력: " + input);
}
while (input != "exit");
```

의미 없는 초기값이 사라졌습니다. 한 번은 받는다는 것이 문법으로 보장되니
받기 전에 검사할 일이 없습니다.

## 조건이 처음부터 거짓이어도 한 번은 돈다

두 반복문에 똑같이 처음부터 거짓인 조건을 줘 보겠습니다.

<x-flow>
<script type="application/json">
{
  "label": "처음부터 거짓일 때",
  "dwell": 1.4,
  "lines": [
    "int count = 10;",
    "do",
    "{",
    "    Console.WriteLine(count);",
    "    count++;",
    "}",
    "while (count <= 3);",
    "Console.WriteLine(\"끝\");"
  ],
  "cases": [
    {
      "label": "do-while",
      "state": "count = 10",
      "path": [
        { "line": 0, "why": "10 은 3 이하가 아닙니다. 조건이 처음부터 거짓입니다.", "state": "count = 10" },
        { "line": 3, "why": "그런데 검사보다 본문이 먼저입니다. 그냥 실행됩니다.", "out": "10" },
        { "line": 4, "state": "count = 11" },
        { "line": 6, "why": "본문이 끝나고 나서야 조건을 봅니다.", "verdict": "거짓" },
        { "line": 7, "why": "거짓이니 여기서 끝입니다. 본문은 딱 한 번 돌았습니다.", "out": "끝" }
      ],
      "note": "같은 조건을 while 에 줬다면 출력은 \"끝\" 한 줄뿐입니다."
    }
  ]
}
</script>
</x-flow>

`while` 이었다면 아무것도 안 찍혔을 코드가 한 줄을 찍었습니다.
**최소 1회가 보장된다**는 것이 `do-while` 의 전부입니다.

## 언제 무엇을 쓰나

| | while | do-while |
| --- | --- | --- |
| 검사 시점 | 본문 전 | 본문 후 |
| 최소 실행 횟수 | 0회 | 1회 |
| 어울리는 일 | 조건이 안 맞으면 안 해야 하는 일 | 해 보고 나서 판단하는 일 |
| 예 | 남은 적이 있는 동안 공격 | 메뉴를 띄우고 입력 받기 |

기준은 간단합니다. **한 번도 안 하는 것이 정상인가**를 물어보면 됩니다.

장바구니에 담긴 물건을 하나씩 계산하는 코드는 빈 장바구니일 때
한 번도 안 도는 것이 맞습니다. `while` 입니다.

메뉴를 띄우고 입력을 받는 코드는 아무것도 안 띄우고 끝나면 안 됩니다.
`do-while` 입니다.

실제로는 `while` 을 훨씬 많이 씁니다.
`do-while` 은 "일단 한 번"이 정말 필요한 자리에만 쓰면 됩니다.

## 정리

- `do-while` 은 본문을 먼저 실행하고 조건을 나중에 봅니다.
- 조건이 처음부터 거짓이어도 본문은 한 번 실행됩니다.
- `while (조건);` 의 세미콜론을 빠뜨리기 쉽습니다. 여기서는 찍는 것이 맞습니다.
- 받기 전에 검사해야 하는 상황에서 의미 없는 초기값을 넣지 않아도 됩니다.
- 한 번도 안 하는 것이 정상이면 `while`, 아니면 `do-while` 입니다.