728x90
★ 재귀 호출(Recursive Call)
- 자기가 자기 자신을 호출
- 에러 발생 X
- ex)
private static void test() {
System.out.println("메소드 호출");
test();
}
- ex 2)
private static void m15(int n) {
System.out.println(n);
n++;
if(n < 10) {
m15(n); //재귀 호출
}
else {
return;
}
}
- ex3)
- 팩토리얼 만들기
private static void m16() {
//팩토리얼
//4! = 4 x 3 x 2 x 1 = 24
int n = 4;
int result = m17(n);
System.out.println(result);
result = factorial(n);
System.out.printf("%d! = %d\n",n,result);
}
private static int factorial(int n) {
return (n==1)? 1: n* factorial(n-1);
}
- ex4)
- 파일의 개수를 세는 알고리즘을 재귀함수를 사용하지 않고 세려고 할 경우
private static void m17() {
String path = "/Users/kimdaehwan/Desktop/Quest/eclipse"; //원래는 이클립스 경로
File dir = new File(path);
int count = 0; //누적 변수
if (dir.exists()) {
File[] list = dir.listFiles();
//자식 파일 > 개수
for(File file : list) {
if(file.isFile()) {
count++;
}
}
//자식 폴더 > 탐색 + 파일 개수
for(File subdir : list) {
if(subdir.isDirectory()) {
//자식 폴더의 내용
File[] sublist = subdir.listFiles();
for (File subfile : sublist) {
if(subfile.isFile()) {
count ++;
}
}
for (File subsubdir : sublist) {
if(subsubdir.isDirectory()) {
//손자 폴더의 내용
File[] subsublist = subsubdir.listFiles();
for(File subsubfile : subsublist) {
count++;
}
}
}
}
}
System.out.printf("총 파일의 개수: %d개\n",count);
}
}
- ex5)
- 파일 개수를 세는 알고리즘을 재귀함수를 통해 세려고 하는 경우
private static int fileCount;
pirvate static int dirCount;
static {
fileCount = 0;
dirCount = 0;
length = 0;
}
public static void count(File dir) {
// 1. 부모 폴더를 가져오고
// 2. 자식 폴더를 재귀메소드를 통해 다시 자식폴더를 가져옴
// 3. 자식 폴더를 가져오고, 재귀 메소드를 통해 손자 폴더를 가져옴 .. 이런식으로 반복
//1. 목록 가져오기
File[] list = dir.listFiles();
//2. 파일 개수
for(File file : list) {
if(file.isFile()) {
fileCount++;
length += file.length();
}
}
//자식 폴더가 있어야만 이 for문이 실행됨.
//3. 자식 폴더 > 방금 행동을 반복
for (File subdir : list) {
if (subdir.isDirectory()) {
dirCount++;
count(subdir);
}
}
}
private static void m18() {
//C:\class\dev\eclipse > 탐색
//- 파일 11,598, 폴더 2,379
//- 730MB
String path = "/Users/kimdaehwan/Desktop/Quest/eclipse"; //원래 이클립스 폴더
File dir = new File(path);
if(dir.exists()) {
count(dir);
}
System.out.printf("총 파일 개수 : %,d개 \n", fileCount);
System.out.printf("총 폴더 개수 : %,d개 \n", dirCount);
System.out.printf("총 파일 크기 : %,dB \n", length);
System.out.printf("총 파일 크기 : %,dMB \n", length /1024/1024);
}
- ex6)
- 모든 하위 폴더를 포함하여 해당 폴더를 삭제하는 알고리즘
private static int fileCount;
pirvate static int dirCount;
static {
fileCount = 0;
dirCount = 0;
length = 0;
}
public static void delete(File dir) {
// 1. 부모 폴더를 가져오고
// 2. 자식 폴더를 재귀메소드를 통해 다시 자식폴더를 가져옴
// 3. 자식 폴더를 가져오고, 재귀 메소드를 통해 손자 폴더를 가져옴 .. 이런식으로 반복
//1. 목록 가져오기
File[] list = dir.listFiles();
//2. 파일 삭제
for(File file : list) {
if(file.isFile()) {
fileCount++;
file.delete();
}
}
//자식 폴더가 있어야만 이 for문이 실행됨.
//3. 자식 폴더 > 자식 폴더 빈폴더 > 삭제
for (File subdir : list) {
if (subdir.isDirectory()) {
dirCount++;
delete(subdir);
}
}
//4. 호출된 폴더 > 파일 모두 삭제 + 자식 폴더 없음 == 빈폴더;
dir.delete();
}
private static void m19() {
//폴더 삭제
String path = "/Users/kimdaehwan/Desktop/Quest/kind/폴더 삭제/delete";
File dir = new File(path);
if (dir.exists()) {
//System.out.println(dir.delete());
delete(dir);
}
System.out.println("폴더를 삭제했습니다.");
System.out.printf("삭제된 폴더는 %d개이고, 파일은 %d개입니다.", dirCount, fileCount);
}
728x90
'자바' 카테고리의 다른 글
JAVA STEP 44. File 입출력 예제 (0) | 2023.02.27 |
---|---|
JAVA STEP 43. File 입출력 (0) | 2023.02.27 |
JAVA STEP 41. File/Directory 조작 예제 (0) | 2023.02.24 |
JAVA STEP 40. File/Directory 조작 (0) | 2023.02.24 |
JAVA STEP 39. Hashset 직접 구현하기 (0) | 2023.02.24 |