if와 else로 경로 나누기
프로그램은 입력과 현재 상태에 따라 다른 경로를 선택해야 합니다.
if는 조건이 참일 때만 블록을 실행하고 else는 그 밖의 경로를 맡습니다.
여러 조건을 이어 붙일 때는 위에서 먼저 참이 된 한 경로만 실행됩니다.
조건의 순서가 겹치면 뒤 블록이 영원히 실행되지 않을 수도 있습니다.
여기서는 문법보다 경계값과 분기 순서를 설계하는 방법에 집중합니다.
조건은 하나의 불리언 질문이다
조건식이 무엇을 묻는지 긍정문으로 읽을 수 있어야 합니다.
계산과 상태 변경을 조건 안에 섞기보다 질문을 별도 변수로 이름 붙이는 편이 좋습니다.
else if는 위에서부터 첫 경로를 고른다
범위가 넓은 조건을 먼저 두면 더 구체적인 조건이 가려집니다.
점수 구간처럼 서로 겹칠 수 있는 조건은 가장 좁거나 높은 경계부터 배치합니다.
GradeBoundary.java는 등급 경계 바로 아래와 위를 연속으로 통과시킵니다. 79·80과 89·90을 묶어 보면 비교 연산자의 등호 하나가 어느 결과를 바꾸는지 곧바로 드러납니다.
public class GradeBoundary {
static String grade(int score) {
if (score < 0 || score > 100) {
return "invalid";
}
if (score >= 90) return "A";
if (score >= 80) return "B";
if (score >= 70) return "C";
return "F";
}
public static void main(String[] args) {
for (int score : new int[] {79, 80, 89, 90, 101}) {
System.out.println(score + " -> " + grade(score));
}
}
}등급 조건은 else if로 잇거나 예제처럼 각 경로에서 바로 반환하면 위에서 처음 참인 결과 하나로 끝납니다. score >= 60을 score >= 90보다 먼저 두면 95점도 첫 조건에 잡히므로, 범위가 좁고 기준이 높은 조건부터 배치합니다.
79 -> C
80 -> B
89 -> B
90 -> A
101 -> invalid79/80과 89/90처럼 경계 양쪽을 함께 실행하면 조건 순서와 포함 여부가 드러납니다.
점수 분기는 입력 유효성 검사와 등급 선택을 분리하면 읽기 쉽습니다. 먼저 0 미만이나 100 초과를 guard clause로 끝내고, 남은 범위에서는 90, 80, 70처럼 높은 경계부터 내려옵니다.
이 순서에서는 뒤의 각 조건이 암묵적으로 앞 경계보다 작다는 사실을 이미 알고 있습니다. score >= 80 && score < 90처럼 같은 조건을 반복하지 않아도 되므로 경계를 바꿀 때 수정 지점도 줄어듭니다.
중괄호는 한 줄이어도 유지한다
현재 한 문장뿐이어도 나중에 줄을 추가할 때 분기 밖으로 새어 나가는 오류를 막습니다.
일관된 블록은 코드 리뷰에서도 범위를 빠르게 보여 줍니다.
중괄호가 없는 if에는 바로 다음 문장 하나만 포함됩니다. 로그 한 줄을 나중에 끼워 넣었을 때 실제 처리 문장이 조건 밖으로 밀려나는 사례를 직접 만들어 보면, 한 줄 분기에도 중괄호를 유지하는 이유가 분명해집니다.
// 넓은 조건을 먼저 두면 뒤 조건이 가려진다.
if (score >= 60) {
System.out.println("pass");
} else if (score >= 90) { // score 90도 이미 첫 경로에서 끝남
System.out.println("excellent");
}// 한 줄이어도 중괄호를 유지한다.경계 바로 앞과 뒤를 대입한다
조건이 age >= 18이라면 17, 18, 19를 직접 실행해 봅니다.
경계 테스트는 조건식을 눈으로만 검토할 때 놓치는 오프바이원 오류를 찾습니다.
guard clause로 예외 경로를 먼저 끝낸다
유효하지 않은 입력을 메서드 앞부분에서 반환하거나 예외로 끝내면 정상 경로의 중첩이 줄어듭니다.
단, 종료 조건이 흩어지지 않도록 가까운 검증만 배치합니다.
검증 실패를 먼저 return하면 정상 경로가 한 단계 덜 들여쓰기 됩니다. 빈 문자열, 최솟값, 최댓값을 각각 넣어 어느 guard에서 끝나는지 확인하고, 통과한 입력만 핵심 로직에 도달하는지 살펴보세요.
분기문은 조건의 개수보다 경계가 겹치지 않고 모든 입력이 어느 경로로 가는지 설명되는지가 중요합니다.