자바

JAVA STEP 42. 재귀 메소드

2023. 2. 27. 10:50
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
'자바' 카테고리의 다른 글
  • JAVA STEP 44. File 입출력 예제
  • JAVA STEP 43. File 입출력
  • JAVA STEP 41. File/Directory 조작 예제
  • JAVA STEP 40. File/Directory 조작
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • 알고리즘
  • 자바
  • 웹페이지
  • 개발자
  • IT자격증
  • it
  • jsp
  • IT개발자
  • 앱개발자
  • JavaScript
  • DBA
  • 정보처리기사
  • 웹개발
  • 정보처리기사필기
  • 데이터베이스
  • 코딩테스트
  • 백엔드
  • 프론트엔드
  • IT자격증공부
  • 백준
  • DB
  • html
  • React
  • java
  • ajax
  • css
  • 웹개발자
  • 정보보안전문가
  • 개발블로그
  • jquery

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JAVA STEP 42. 재귀 메소드
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.