java.io 패키지의 File 클래스는 시스템에 존재하는 파일 또는 디렉터리(경로명)를 추상화하여 표현합니다. 특정 디렉터리 안에 있는 모든 파일과 하위 디렉터리의 목록을 조회하고 싶을 때, 이 클래스는 list()와 listFiles() 두 가지 메서드를 제공합니다.
list()와 listFiles()의 핵심 차이점
list() 메서드는 지정된 디렉터리 내의 모든 파일 및 디렉터리 이름(String)을 String 배열 형태로 반환합니다.
listFiles() 메서드는 지정된 디렉터리 내의 파일 및 디렉터리 객체(File)를 File 타입 배열 형태로 반환합니다.
정리하면 다음과 같습니다. 단순히 디렉터리 안에 어떤 파일들이 있는지 이름만 확인하면 된다면 list() 메서드를 사용하면 됩니다. 반면, 파일의 이름, 절대 경로, 크기, 수정 시간 등 상세 정보가 필요하다면 listFiles() 메서드로 각 파일의 File 객체를 가져온 뒤, 객체가 제공하는 getName(), getAbsolutePath() 같은 메서드를 호출하여 원하는 정보를 얻어야 합니다.
list() 메서드 사용 예제
import java.io.File;
import java.io.IOException;
public class ListOfFiles {
public static void main(String args[]) throws IOException {
// 디렉터리를 나타내는 File 객체 생성
File path = new File("D:\\ExampleDirectory");
// 모든 파일과 디렉터리 목록 조회
String contents[] = path.list();
System.out.println("지정된 디렉터리의 파일 및 디렉터리 목록:");
for(int i=0; i < contents.length; i++) {
System.out.println(contents[i]);
}
}
}
실행 결과
지정된 디렉터리의 파일 및 디렉터리 목록: SampleDirectory1 SampleDirectory2 SampleFile1.txt SampleFile2.txt SapmleFile3.txt
위 예제에서 볼 수 있듯이 list()는 파일과 디렉터리의 이름만 문자열 배열로 돌려주기 때문에, 추가적인 파일 정보를 얻으려면 경로를 직접 조합해야 하는 번거로움이 있습니다.
listFiles() 메서드 사용 예제
import java.io.File;
import java.io.IOException;
public class ListOfFiles {
public static void main(String args[]) throws IOException {
// 디렉터리를 나타내는 File 객체 생성
File path = new File("D:\\ExampleDirectory");
// 모든 파일과 디렉터리의 File 객체 배열 조회
File files [] = path.listFiles();
System.out.println("지정된 디렉터리의 파일 및 디렉터리 목록:");
for(File file : files) {
System.out.println("파일 이름: " + file.getName());
System.out.println("파일 경로: " + file.getAbsolutePath());
System.out.println(" ");
}
}
}
실행 결과
지정된 디렉터리의 파일 및 디렉터리 목록: 파일 이름: SampleDirectory1 파일 경로: D:\ExampleDirectory\SampleDirectory1 파일 이름: SampleDirectory2 파일 경로: D:\ExampleDirectory\SampleDirectory2 파일 이름: SampleFile1.txt 파일 경로: D:\ExampleDirectory\SampleFile1.txt 파일 이름: SampleFile2.txt 파일 경로: D:\ExampleDirectory\SampleFile2.txt 파일 이름: SapmleFile3.txt 파일 경로: D:\ExampleDirectory\SapmleFile3.txt
listFiles()는 각 항목을 File 객체로 반환하기 때문에 위 예제처럼 getName(), getAbsolutePath() 외에도 length()(파일 크기), lastModified()(최종 수정 시간), isDirectory()(디렉터리 여부) 등 다양한 메서드를 바로 활용할 수 있다는 장점이 있습니다.
어떤 메서드를 선택해야 할까?
두 메서드 모두 동일한 디렉터리 내용을 조회하지만, 반환 형태가 다르다는 점이 핵심입니다. 간단한 이름 나열에는 list(), 파일 속성 기반의 처리나 필터링에는 listFiles()를 사용하는 것이 효율적입니다. 특히 FileFilter나 FilenameFilter와 함께 사용하면 원하는 조건의 파일만 골라낼 수 있어 실무에서 더욱 유용하게 활용됩니다.