더북(TheBook)

1.7 항상 괄호 사용하기

class BoardComputer {

    CruiseControl cruiseControl;

    void authorize(User user) {
        Objects.requireNonNull(user);
        if (user.isUnknown())
            cruiseControl.logUnauthorizedAccessAttempt();
        if (user.isAstronaut())
            cruiseControl.grantAccess(user);
        if (user.isCommander())
            cruiseControl.grantAccess(user);
            cruiseControl.grantAdminAccess(user);
    }
}

앞의 switch 문 비교를 if 문 여러 개로 바꾸었습니다. 그런데 한 가지 문제가 있습니다. 코드 내 들여쓰기가 잘못 읽힐 여지가 있습니다. if 뒤에 중괄호가 없어 조건이 바로 뒷줄에만 적용되거든요. 이로 인해 전체 메서드가 악의적으로 동작합니다. cruiseControl.grantAdminAccess(user); 줄이 항상 실행되고 모든 사용자에게 관리자 권한이 부여되죠! 정말 엉망진창입니다.

근본적인 원인은 들여쓰기가 아닙니다. 범위를 정의하는 중괄호가 빠졌기 때문입니다. 본질적으로 앞의 1.6 스위치 실패 피하기에서 보았던 스위치 실패의 변형이라고 할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.