본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
4장 : 제어문

입력 검증 루프 설계

외부 입력은 비어 있거나 형식이 다르거나 허용 범위를 벗어날 수 있습니다.

입력을 한 번 읽고 바로 사용하면 정상 경로와 오류 복구가 한곳에 섞입니다.

검증 루프는 읽기, 파싱, 의미 검사, 재시도 여부를 분리해야 합니다.

무한 재시도가 항상 친절한 것은 아니므로 횟수 제한이나 취소 경로도 필요합니다.

이 절에서는 제어문을 실제 입력 경계에 적용합니다.


문자열을 먼저 읽고 파싱한다

Scanner.nextInt 뒤 줄바꿈 문제를 피하려면 한 줄을 문자열로 읽고 필요한 타입으로 변환하는 방식이 단순합니다.

원본 입력을 오류 메시지에도 사용할 수 있습니다.


형식 오류와 범위 오류를 나눈다

숫자로 바꿀 수 없는 입력은 NumberFormatException, 숫자지만 범위를 벗어난 값은 조건식으로 처리합니다.

사용자에게 수정할 내용을 구체적으로 안내할 수 있습니다.

InputValidation.java는 형식 오류, 범위 오류, 정상 입력을 배열에 넣어 대화형 입력 없이 같은 재시도 흐름을 재현합니다. 성공한 8080에서만 반복이 끝나는 위치를 확인해 봅니다.

InputValidation.java
public class InputValidation {
    static Integer parsePort(String raw) {
        try {
            int port = Integer.parseInt(raw.trim());
            return port >= 1 && port <= 65_535 ? port : null;
        } catch (NumberFormatException error) {
            return null;
        }
    }

    public static void main(String[] args) {
        String[] attempts = {"abc", "70000", "8080"};
        for (String attempt : attempts) {
            Integer port = parsePort(attempt);
            System.out.println(attempt + " -> " + (port == null ? "retry" : port));
            if (port != null) break;
        }
    }
}

Integer.parseInt가 실패한 경우와 숫자는 맞지만 허용 범위를 벗어난 경우는 발견 지점이 다릅니다. 이 짧은 예제는 둘을 null로 합치지만, 사용자에게 원인을 안내해야 한다면 FORMAT_ERROR, OUT_OF_RANGE, VALID처럼 결과 타입을 나누어 정보를 보존합니다.

abc -> retry
70000 -> retry
8080 -> 8080

형식 오류와 범위 오류는 모두 재시도지만 서로 다른 검사 단계에서 발견됩니다.


성공 경로에서만 반복을 끝낸다

검사를 통과한 값을 별도 변수에 저장한 뒤 break하거나 메서드에서 반환합니다.

오류 경로에서 상태를 일부만 변경하지 않게 합니다.

break는 파싱과 범위 검사를 모두 통과한 지점에만 둡니다. 예외를 잡은 직후나 범위 검사 전에 반복을 끝내면 잘못된 값이 다음 로직으로 흘러가는 조용한 오류가 됩니다.

String raw = " 42 ";
try {
    int parsed = Integer.parseInt(raw.trim()); // 형식 검사
    if (parsed < 1 || parsed > 100) {          // 의미 범위 검사
        System.out.println("out of range");
    }
} catch (NumberFormatException error) {
    System.out.println("not a number");
}

재시도 정책도 입력 계약의 일부다

대화형 프로그램은 다시 물을 수 있지만 파일이나 API 처리는 실패를 호출자에게 전달하는 편이 낫습니다.

입력 채널에 맞는 복구 정책을 고릅니다.

빈 문자열, 문자가 섞인 값, 범위 바로 밖의 값, 유효한 값을 차례로 입력해 안내와 재시도 횟수를 확인해 보세요. 실제 서비스라면 무한 재시도 대신 횟수 제한이나 취소 입력을 둘지도 계약에 포함해야 합니다.


입력 검증은 예외를 숨기는 일이 아니라 형식, 의미, 재시도 정책을 각각 분명하게 만드는 일입니다.