Search

재귀 호출

재귀 호출(Recursive Call)

메소드 내부에서 메소드 자신을 다시 호출하는 것
재귀 메소드 : 재귀 호출을 하는 메소드
void method() { method(); // 재귀 호출. 메소드 자신을 호출 }
Java
호출된 메소드는 독립적인 작업 수행 가능
값에 의한 호출(call by value)을 통해 원래 값이 아닌, 복사된 값으로 작업
재귀호출에는 조건문이 필수적
재귀 호출뿐이만 하면, 자기 자신만 계속 호출하는 무한 반복에 빠짐.
매개 변수 n을 1씩 감소시키며 재귀호출 하다, n 값이 0이 되면 중단하는 코드
void method(int n) { if (n == 0) return; // n 값이 0일 때, 메소드 종료 System.out.println(n); method(--n); // 재귀 호출. method(int n)을 호출 }
Java
재귀 호출은 반복문과 유사하며, 대부분의 재귀 호출은 반복문으로 변환 가능
바로 위 재귀 호출 메소드와 같은 코드
void method(int n) { while(n !=0) { System.out.println(n--); } }
Java
반복문에 비해 재귀 호출은 수행 시간이 더 오래 걸림.
단순 문장을 반복하는 것 외, 매개 변수 복사와 종료 후 복귀할 주소 저장 등 추가 과정 필요
PowerTest.java : x¹부터 xⁿ까지 합 구하기

재귀 호출을 사용하는 이유? → 논리적 간결함 때문

반복문과 조건문을 사용한 복잡한 코드보다 단순한 구조로 표현 가능
조금 더 비효율적이더라도, 알아보기 쉽게 작성하는 것이 논리적 오류 방지와 유지 보수에 유리
반복 작업이 필요한 경우, 먼저 반복문으로 작성해보고, 복잡하면 재귀 호출 방법을 꾀하자.
비효율적이더라도 논리적 간결함으로 얻는 이득이 클 때 사용

대표적인 재귀 호출로 작성하기 좋은경우 → 팩토리얼(Factorial)

FactorialTest.java
재귀 호출 사용에는 매개변수의 유효성 검사가 중요
스택의 저장 한계를 넘어서는, 스택오버플로우(StackOverflow) 에러 발생 위험
조건없이 무한 재귀 호출하는 경우
위 팩토리얼 연산 메소드에 0이나 100,000과 같은 값을 대입하면 스택에 계속 데이터가 쌓임.
다음과 같은 유효성 검사가 필요
FactorialTest2.java

참고 자료