← SEARCHABLE ARCHIVE
C# · 2026-07-17

C# 기초부터 마스터까지 — 2화

조건문, 반복문, 메서드로 흐름 만들기

INTERACTIVE READING MODE →

본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.

프로그램은 값을 저장하는 것만으로 끝나지 않는다. 조건에 따라 다른 코드를 실행하고, 같은 작업을 반복하고, 의미 있는 단위로 메서드를 나눠야 한다.

조건문과 switch

string GetState(int health)
{
    if (health <= 0)
    {
        return "Dead";
    }

    return health < 30 ? "Danger" : "Normal";
}

int reward = rank switch
{
    "S" => 1000,
    "A" => 500,
    _ => 100
};

단순한 두 갈래는 if가 읽기 쉽고, 하나의 값을 여러 경우와 비교할 때는 switch가 잘 맞는다. _는 앞의 어떤 패턴에도 맞지 않는 나머지 경우다.

반복문

var damages = new[] { 10, 20, 15 };
int total = 0;

foreach (int damage in damages)
{
    if (damage <= 0)
    {
        continue;
    }

    total += damage;
}

foreach는 원소를 순서대로 읽을 때 편하다. 인덱스가 필요하거나 반복 범위를 직접 제어해야 한다면 for를 사용한다.

반복문 안에서 컬렉션의 원소를 추가하거나 삭제하면 열거가 무효화될 수 있다. 삭제할 대상을 따로 모으거나 뒤에서부터 순회하는 방식이 안전하다.

메서드와 조기 반환

bool TryAttack(Player attacker, Monster target, out int damage)
{
    damage = 0;

    if (!attacker.IsAlive || !target.IsAlive)
    {
        return false;
    }

    damage = Math.Max(1, attacker.Attack - target.Defense);
    target.TakeDamage(damage);
    return true;
}

처리할 수 없는 입력을 먼저 반환하면 정상 흐름의 들여쓰기가 깊어지지 않는다. out 매개변수는 성공 여부와 계산 결과를 함께 돌려줄 때 사용할 수 있다.

메서드 이름은 내부 구현보다 호출하는 쪽의 의도를 보여줘야 한다. 조건과 반복이 길어지면 단순히 줄 수를 줄이지 말고, 하나의 메서드가 하나의 책임만 갖는지 확인하는 편이 좋다.