이 글에서는 재귀(recursion)를 활용하여 문장을 뒤집는 방법을 단계별로 살펴보겠습니다.
재귀란 무엇인가?
재귀 함수(recursive function)란 특정 조건이 충족될 때까지 자기 자신을 반복적으로 호출하는 함수를 의미합니다. 재귀는 항목을 자기 유사적인(self-similar) 방식으로 반복하는 과정으로, 프로그래밍 언어에서 하나의 함수가 동일한 함수 내부에서 자신을 호출할 수 있을 때 이를 재귀 호출(recursive call)이라고 부릅니다.
대부분의 프로그래밍 언어는 스택(stack)을 기반으로 재귀를 구현합니다. 일반적으로 어떤 함수(호출자, caller)가 다른 함수(피호출자, callee) 또는 자기 자신을 호출하면, 호출자는 실행 제어권을 피호출자에게 넘기게 됩니다. 이 전달 과정에서 필요한 데이터가 호출자로부터 피호출자로 함께 전달되기도 합니다.
입력 및 출력 예시
예를 들어 아래와 같은 문장을 입력했다고 가정해 보겠습니다.
입력
Enter the sentence : Have a nice evening
출력
The reversed input is: gnineve ecin a evaH
알고리즘
Step 1 - 시작 Step 2 - my_input과 my_result라는 두 개의 문자열 변수 선언 Step 3 - 사용자로부터 값을 입력받거나 값을 직접 정의 Step 4 - 재귀 함수 'reverseString'을 정의. 이 함수는 문자열을 입력받아 마지막 위치의 문자를 반환 Step 5 - 'my_input' 값이 빈 문자열이 아닐 때까지 함수를 재귀적으로 호출 Step 6 - 재귀 함수를 호출하며 'my_input' 값을 전달하고 반환값을 저장 Step 7 - 결과 출력 Step 8 - 종료
예제 1: 사용자 입력을 받아 처리하는 경우
아래 예제는 Scanner 객체를 사용해 사용자가 직접 문장을 입력하면, 재귀 함수를 통해 해당 문장을 뒤집어 출력합니다.
import java.util.Scanner;
public class Reverse {
public static void main(String[] args) {
String my_input, my_result;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined ");
System.out.print("Enter the sentence : ");
my_input = my_scanner.nextLine();
my_result = reverseString(my_input);
System.out.println("The reversed input is: " + my_result);
}
public static String reverseString(String my_input) {
if (my_input.isEmpty())
return my_input;
return reverseString(my_input.substring(1)) + my_input.charAt(0);
}
}실행 결과
Required packages have been imported A reader object has been defined Enter the sentence : Have a nice evening The reversed input is: gnineve ecin a evaH
예제 2: 문자열이 미리 정의된 경우
아래 예제는 문자열이 코드 안에 미리 정의되어 있는 경우입니다. 정의된 값을 그대로 읽어와 콘솔에 뒤집힌 결과를 출력합니다.
public class Reverse {
public static void main(String[] args) {
String my_input, my_result;
my_input = "Have a nice evening";
System.out.println("The string is defined as :" +my_input);
my_result = reverseString(my_input);
System.out.println("The reversed input is: " + my_result);
}
public static String reverseString(String my_input) {
if (my_input.isEmpty())
return my_input;
return reverseString(my_input.substring(1)) + my_input.charAt(0);
}
}실행 결과
The string is defined as :Have a nice evening The reversed input is: gnineve ecin a evaH
핵심 원리 정리
위 재귀 함수의 동작 원리는 간단합니다. 먼저 문자열이 비어 있는지 확인하여 빈 문자열이면 그대로 반환하는 종료 조건(base case)을 설정합니다. 그다음 substring(1)을 사용해 첫 번째 문자를 제외한 나머지 문자열로 자기 자신을 재귀 호출하고, 마지막에 첫 번째 문자(charAt(0))를 결과 뒤에 붙입니다. 이 과정이 반복되면서 문자열이 한 글자씩 뒤에서부터 쌓이게 되어 최종적으로 완전히 뒤집힌 문장이 만들어집니다.