1. 재귀호출(recursive call)이란?
메서드의 내부에서 메서드 자신을 다시 호출하는 것을 '재귀호출(recursive call)'이라 한다.
→ 재귀호출을 하는 메서드를 '재귀 메서드'라 한다.
void method() {
method(); // 재귀호출. 메서드 자신을 호출한다.
}
메서드 입장에서는 자기 자신을 호출하는 것과 다른 메서드를 호출하는 것은 차이가 없다.
why? 메서드는 복사된 값으로 작업을 하기 때문! [값에 의한 호출(call by value)]
그러나, 위의 코드처럼 재귀호출 뿐이면 무한반복에 빠지게 된다.
따라서 재귀호출에는 조건문이 필수적으로 붙게 된다.
void method(int n) {
if(n == 0) {
return; // n의 값이 0일 때, 메서드를 종료한다.
}
System.out.println(n);
method(--n); // 재귀호출. method(int n)을 호출
}
2. 반복문 vs 재귀호출
모든 재귀호출 코드는 반복문으로 변경할 수 있다.
위의 코드를 반복문으로 변경하면 아래와 같아진다.
void method(int n) {
while(n != 0) {
System.out.println(n--);
}
}
반복문은 그저 같은 문장을 반복해서 수행하는 것이지만, 메서드를 호출하는 것은 매개변수 복사와 종료, 복귀할 주소 저장 등 추가로 필요한 작업들이 많다. 즉, 반복문보다 재귀호출의 수행시간이 더 오래 걸린다.
- 그럼에도 재귀호출을 사용하는 이유는?
재귀호출이 주는 간결함 때문.
→ 복잡하게 작성된 코드가 재귀호출로 작성하면 보다 단순한 구조로 바뀔 수도 있다.
- FactorialTest.java
public class FactorialTest {
public static void main(String[] args) {
int result = factorial(4); // 4! >> 4 * 3 * 2 * 1
System.out.println(result);
}
static int factorial (int n) {
int result = 0;
if (n == 1) {
result = 1;
} else {
result = n * factorial(n-1);
}
return result;
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판