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 스위치 실패 피하기에서 보았던 스위치 실패의 변형이라고 할 수 있습니다.