위 코드에서 입력 매개변수인 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; } }