파일 시스템을 다루다 보면 특정 디렉토리뿐만 아니라 그 안에 중첩된 모든 하위 디렉토리의 파일까지 한 번에 확인해야 하는 경우가 자주 있습니다. 이럴 때 재귀(Recursion) 기법을 활용하면 깊이에 상관없이 모든 파일과 폴더를 체계적으로 탐색할 수 있습니다. 아래 예제를 통해 그 구현 방법을 살펴보겠습니다.
예제 코드
import java.io.File;
public class Demo{
static void print_recursively(File[] my_arr,int my_index,int sub_level){
if(my_index == my_arr.length)
return;
for (int i = 0; i < sub_level; i++)
System.out.print("\t");
if(my_arr[my_index].isFile())
System.out.println(my_arr[my_index].getName());
else if(my_arr[my_index].isDirectory()){
System.out.println("[" + my_arr[my_index].getName() + "]");
print_recursively(my_arr[my_index].listFiles(), 0, sub_level + 1);
}
print_recursively(my_arr,++my_index, sub_level);
}
public static void main(String[] args){
String path_main = "파일이 포함된 폴더 경로";
File main_dir = new File(path_main);
if(main_dir.exists() && main_dir.isDirectory()){
File my_arr[] = main_dir.listFiles();
System.out.println("메인 디렉토리에서 나열된 파일 : " + main_dir);
print_recursively(my_arr,0,0);
}
}
}실행 결과
지정한 디렉토리 경로 내의 모든 형식의 파일이 계층 구조와 함께 나열됩니다
코드 동작 원리
Demo 클래스에는 print_recursively라는 재귀 함수가 정의되어 있습니다. 이 함수는 파일 배열(File[]), 현재 인덱스, 중첩 레벨 세 가지를 매개변수로 받아 해당 디렉토리 내의 모든 파일을 순회하며 목록을 출력합니다.
함수의 핵심 로직은 다음과 같습니다.
- 인덱스가 배열의 길이와 같아지면 재귀 호출을 종료합니다 (기저 조건).
- 중첩 레벨만큼 탭 문자를 출력하여 들여쓰기로 계층 구조를 시각적으로 표현합니다.
- 요소가 파일이면 이름을 그대로 출력하고, 디렉토리면 대괄호([])로 감싸서 표시한 뒤 해당 디렉토리의 파일 목록으로 재귀 호출을 수행하며 레벨을 1 증가시킵니다.
main 메소드에서는 파일들이 담긴 폴더의 경로를 정의하고, 이를 바탕으로 새로운 File 객체를 생성합니다. 이후 listFiles() 메소드를 사용해 해당 폴더 내의 모든 파일과 디렉토리 정보를 가져오고, 앞서 정의한 재귀 함수를 호출하여 결과를 콘솔에 출력합니다.
참고 사항
경로가 실제로 존재하는지(exists())와 디렉토리인지(isDirectory())를 먼저 검증하는 안전 장치가 포함되어 있어, 잘못된 경로 입력 시 오류 없이 프로그램이 종료됩니다. 또한 Java 8 이상 환경에서는 Files.walk() 스트림 API를 활용해 유사한 기능을 더 간결하게 구현할 수도 있습니다.