더북(TheBook)

위 코드에서 입력 매개변수인 speedPreset은 아직 정수입니다. 즉 어떤 정숫값이든 심지어 음수도 setPreset()에 넣을 수 있다는 뜻이죠. 누구도 STOP_PRESET과 같은 상수를 사용해야 한다고 강제하지 않습니다.

유효하지 않은 정숫값을 setPreset()에 넣어도 메서드는 특별히 하는 일이 없습니다. 조건을 확인한 후 상태를 변경하거나 오류를 던지지 않고 그냥 반환합니다. 충돌보다는 낫지만 프로그램에 어떤 버그 유형이든 야기할 수 있죠.

자바와 같은 정적 타입 언어는 이러한 오류를 가능한 한 빨리 심지어 애당초 프로그램을 실행하기 전에 발견할 수 있는 기능을 제공합니다. 오류를 빨리 찾을수록 고치는 비용도 낮아지죠!

그러면 컴파일러가 유효하지 않은 값을 거절하게 하려면 위 코드를 어떻게 바꾸어야 할까요?

class CruiseControl {

    private double targetSpeedKmh;

    void setPreset(SpeedPreset speedPreset) {
        Objects.requireNonNull(speedPreset);

        setTargetSpeedKmh(speedPreset.speedKmh); 
    }

    void setTargetSpeedKmh(double speedKmh) { 
        targetSpeedKmh = speedKmh;
    } 
}

enum SpeedPreset {
    STOP(0), PLANETARY_SPEED(7667), CRUISE_SPEED(16944);

    final double speedKmh;

    SpeedPreset(double speedKmh) {
        this.speedKmh = speedKmh;
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.