C# 기초부터 마스터까지 — 2화
조건문, 반복문, 메서드로 흐름 만들기
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
프로그램은 값을 저장하는 것만으로 끝나지 않는다. 조건에 따라 다른 코드를 실행하고, 같은 작업을 반복하고, 의미 있는 단위로 메서드를 나눠야 한다.
조건문과 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 매개변수는 성공 여부와 계산 결과를 함께 돌려줄 때 사용할 수 있다.
메서드 이름은 내부 구현보다 호출하는 쪽의 의도를 보여줘야 한다. 조건과 반복이 길어지면 단순히 줄 수를 줄이지 말고, 하나의 메서드가 하나의 책임만 갖는지 확인하는 편이 좋다.