프로그램을 개발하다 보면 상황에 맞는 다양한 반목문을 사용하여 소스를 작성하게 됩니다.
재귀 함수 또한 반복적인 작업을 처리할 때 사용됩니다.
1. 재귀 함수란?
재귀라는 단어가 생소할 수 있기 때문에 사전적 의미를 살펴보겠습니다.
재귀(recursion)는 어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻한다. 자기 언급과도 관련된 재귀는 언어학에서 논리학에 이르기까지 다양한 분야에서 연구되는 주제로, 특히 컴퓨터 과학과 수학에서, 재귀는 함수가 자신의 정의에 의해 정의될 때의 개념을 가리킨다.
(출처 : 위키백과)
재귀 함수(Recursive method)는 간단하게 생각하면 어떤 함수 내부에서 자기 자신 함수를 다시 호출하는 것입니다.
반복적인 일을 처리를 할 때 사용되곤 합니다.
2. 재귀 함수를 왜 사용하는가?
반복적인 일을 처리하기 위해 사용한다면 반복문을 사용하면 될 텐데 왜 재귀 함수를 사용해야 할까요?
대표적인 반복문은 for문과 while문이 있는데 저는 이 두 가지 반복문으로 로직을 구현할 수 없다고 생각이 될 때 재귀 함수를 사용합니다.
간단한 작업을 한다면 위의 반복문 두 가지로 처리가 가능하지만 복잡한 작업, 예를 들어
1. 이미 작업 과정에서 반복문을 많이 사용하고 있거나,
2. 동적으로 구성하기 때문에 얼마나 반복해야 할지 모르거나,
3. 반복문보다 재귀 함수가 가독성이 더 좋다고 느끼면
재귀 함수를 사용하기도 합니다.
최근에는 복잡한 처리 작업이 있는데 이 작업이 얼마나 반복해야 할지 모르고 while문 안에 넣기에는 좀 어색하다고 판단하여 재귀 함수를 사용한 적이 있었습니다.
모든 코딩 과정이 그렇지만 반복적인 작업에도 정답은 없고 각 상황에 가장 효율적인 방법을 사용하는 것이 좋다고 생각합니다.
3. 재귀 함수 사용법
재귀 함수를 사용하는 방법을 예제를 통해 알아보도록 하겠습니다.
public class TestClass
{
public static void main(String[] args)
{
recursiveTest(1);
}
public void recursiveTest(int count)
{
System.out.println("count : " + count);
count = count + 1;
recursiveTest(count);
}
}
처음으로 외부(main)에서 recursiveTest() 함수를 호출하고 그 후 함수 내부에서 다시 recursiveTest() 함수를 호출합니다.
예제에서 보는 것처럼 작성한다면, 소스만 봐도 알 수 있듯이 무한 루프에 빠지게 됩니다.
아무런 조건이 없이 함수를 계속적으로 호출하기 때문에 count가 1씩 증가하면서 콘솔에 표시하는 일이 무한 반복될 것입니다.
while 반복문과 같은 맥락으로 조건을 적용하여 무한 루프에 빠지지 않도록 주의하면서 코드를 작성해야 합니다.
간단한 조건을 적용한 예제입니다.
public class TestClass
{
public static void main(String[] args)
{
recursiveTest(1);
}
public void recursiveTest(int count)
{
System.out.println("count : " + count);
count = count + 1;
if(count <= 5)
{
recursiveTest(count);
}
}
}
결과
count : 1
count : 2
count : 3
count : 4
count : 5
count가 5보다 작거나 같은 경우에만 자기 함수를 호출하도록 조건을 줬더니 count가 5까지 표시되고 그 이후에는 더 이상 반복하지 않는 결과를 볼 수 있습니다.
반드시 무한 반복 현상을 주의하면서 활용해보시기 바랍니다.
'IT, 개발 > JAVA' 카테고리의 다른 글
Mac OS에서 이클립스 메소드 추적하기(함수 따라가기, 함수 호출되는 곳, 추적/역추적) (0) | 2022.07.18 |
---|---|
JAVA - 리스트 순서 뒤집기, 오름차순, 내림차순(ArrayList 순서 정렬, 변경) (0) | 2022.07.14 |
JAVA SimpleDateFormat 날짜 포맷 (Date to String) (0) | 2022.06.14 |
JAVA Map 삭제하기 (remove(), clear()로 해당 key값 삭제 or 전체 삭제) (0) | 2022.06.07 |
JAVA 날짜 시간 비교하기 예제 (Date - before, after) (0) | 2022.05.31 |