[Java] 반복문 대신 재귀로 코드의 의도를 드러내기

2025. 11. 3. 08:12Dev./Java

728x90
반응형

과제에서 readUserInput() 메서드에 잘못된 입력이 들어오면 while문으로 유효한 조건의 입력이 들어올 때까지 반복하도록 구현했다. 과제 해설을 들으며 재귀함수를 사용해 직관적으로 나타낼 수 있었다는 사실을 알았다. 동작은 같아도 사고의 방향이 다르단거에 다시한번 개발의 매력을 느끼며 반복문과 재귀에 대해 알아보려고 한다. 

재귀함수란?

재귀 함수(Recursive Function)는 자기 자신을 다시 호출하는 함수로, 큰 문제를 작은 하위 문제로 나누어 해결할 수 있을 때 사용된다.

장점

  • “다시 시도한다”는 의미 구조가 코드에 자연스럽게 드러남
  • 깔끔하고, 로직이 분리돼 읽기 쉬움

단점

  • 스택 프레임이 쌓이기 때문에 너무 많은 입력을 재귀로 처리하면 StackOverflowError 가능성 있음 ( 입출력은 재귀보다 반복이 일반적)

반복문 보다 재귀가 자연스러운 상황

  1. 문제가 자기 자신과 닮아 있을 때
    ex) 전체 문제 = 작은 문제 + 나머지 문제
    ex) 트리 탐색, 하노이의 탑, 피보나치, 백트래킹, 정렬(merge sort, quick sort)
  2. 한 단계의 결과가 다음 단계의 호출로 이어질 때
    ex) 이 단계 처리 → 다음 단계로 넘어가기로 자연스러운 흐름
    ex) 함수가 자기 자신을 통해 다음 상태를 호출함으로서 코드 구조 깔끔
  3. 반복보다 ‘논리적 흐름’이 더 중요할 때
    ex) 조건이 맞지 않으면 다시 시도한다 같은 상황에서 while문보다 return 함수호출()이 더 직관적으로 읽힘
  4.  

작성한  코드

기본적인 입출력 루프지만 본질적인 메소드의 로직은 조건을 만족할 때까지 반복이라는 의미를 갖고있다. 단순 반복이 아닌 검증 반복의 메소드라 반복보다 논리적 흐름이 더 중요한 상황이라고 생각이 들었다.

물론 입력은 사용자의 행동에 따라 언제 끝날지 모르기 때문에 재귀로 호출시 스택에 계속 쌓일 수 있기 때문에 반복문이 잘 맞는 구조이기도 하다! 반복문 사용시에는 return을 만나면 루프가 자연스럽게 종료되기 때문에 계속 물어본다는 동작에서 보면 안전하고 명확하기도 하다.

public int readUserInput(int min, int max) {
    while (true) {
        System.out.print("선택: ");
        String input = scanner.next();
        try {
            int value = Integer.parseInt(input);
            if (value >= min && value <= max) return value;
            System.out.printf("잘못된 입력입니다. %d~%d 사이에서 선택해주세요.\n", min, max);
        } catch (NumberFormatException e) {
            System.out.printf("숫자를 입력해주세요. %d~%d 사이에서 선택해주세요.\n", min, max);
        }
    }
}

재귀 호출 수정 코드

public int readUserInput(int min, int max) {
    System.out.print("선택: ");
    String input = scanner.next();

    try {
        int value = Integer.parseInt(input);
        if (value >= min && value <= max) return value;
        System.out.printf("잘못된 입력입니다. %d~%d 사이에서 선택해주세요.\n", min, max);
    } catch (NumberFormatException e) {
        System.out.printf("숫자를 입력해주세요. %d~%d 사이에서 선택해주세요.\n", min, max);
    }
    return readUserInput(min, max);
}

재귀로는 이 메서드의 의도를 확실히 표현할 수있다. 이 메서드를 보았을 때 입력이 잘못되면 다시 호출한다는 논리 흐름을 파악 할 수 있다.

반복문과 재귀

  반복문 재귀
실용성 ✅ 더 안정적 (입출력 루프에 적합) ⚠️ StackOverflowError 가능성
의도 표현 반복적 다시 시도의 논리적 흐름
실행 흐름 루프 구조 자기 호출 구조
추천 상황 입력, 서버 요청, UI 반복 알고리즘, 탐색, 단계적 처리

배운 점

  • 반복문은 입출력 같은 순환에 적합하고 재귀는 논리적인 흐름을 표현하기에 적합하다.
  • 이번 과제 코드는 반복문이 실용적이지만 사고 자체를 재귀적 구조로 문제를 인식하는게 중요하다는 생각이 들었다.
  • 동작은 같아도 사고의 방향은 다르다!! 
728x90
반응형