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 | 
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 |