일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 객체지향
- 자료구조
- 백준 알고리즘
- HTML
- bubble-sort
- 객체
- 2884
- LANG
- 클래스 패스
- 자동 형변환
- java
- 소수판정
- 백준
- 연결된 예외
- 형변환 연산자
- 암호론
- 디렉티브
- 재귀호출기본
- class
- JSP
- lang package
- 알고리즘
- BufferedWrite
- jvm
- 현대암호
- 공개키 암호
- 예외처리
- 프로그래밍
- try&catch
- OOP
- Today
- Total
코드일기장
[Java] JVM메모리 구조, 기본 재귀호출-팩토리얼 본문
🎯 JVM 메모리 구조
우선 JVM 메모리 구조 이미지와 함께 천천히 알아보자.

-메서드 영역 (Method Area)-
-클래스 정보와 클래스 변수가 저장되는 곳
-호출 스택 (Call Stack)-
-메서드의 작업공간, 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 만들고 메서드 수행이 끝나면 메모리를 삭제하는 곳
-힙 (Heap)-
-인스턴스가 생성되는 공간, new 연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성
🎯재귀 호출 (recursive claa)
재귀호출이란?
- 메서드 내에서 자기 자신을 반복적으로 호출하는 것
- 반복문 보다 효율은 좋지 않다.
- 이해하기 쉽고 간결한 코드를 작성할 수 있다 (클린 코드)
재귀호출 예
- 팩토리얼, 제곱, 트리 운행 등
이번 시간에는 재귀호출을 이용한 팩토리얼 프로그램을 만들어 보았다.
🔑 재귀호출을 사용하지 않은 팩토리얼 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int num=1;
for(int i=1;i<=N;i++) {
num=i*num;
System.out.print(num+"\n");
}
}
}

🔑 재귀호출을 사용한 팩토리얼 코드
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
System.out.print(factorial(N));
}
static int factorial(int n) {
int result=1;
if(n==1) {
result=1;
}else {
result=n*factorial(n-1);
}
return result;
}
}

간단한 원리
1. 일단 main 메서드가 실행된다. 입력받은 수 N이 factorial메서드 인자 값으로 들어간다.
2. 예시 코드 출력대로 factorial(4) 즉, N=4이므로 factorial메서드는 4를 입력받은 상태로 메서드가 실행된다.
(스택에 main메서드는 제외했다. factorial(4) 메서드가 스택에 할당)

3. factorial 메서드의 n의 값은 1이 아니므로 else문으로 들어가진다. else에서 factorial(n-1) 메서드가 호출된다.
factorial(3) 메서드가 호출된다는 소리이다.
(아직 factorial(4) 메서드는 종료가 안돼서 스택에 남아있고 실행이 중지 상태이다.)

4. factorial(3) 역시 n=3 이므로 else문으로 들어가진다. 여기서 factorial(n-1) 즉, factorial(2) 메서드가 호출

5. factorial(2) n=2 이므로 else문 들어가진다. else 문에서 factorial(n-1) 즉, factorial(1) 메스드가 호출

6. factorial(1) 메서드의 멤버 변수 n=1이다. if문이 true가 되어 return값으로 1을 내보낸 후 메모리에서 factorial(1) 메서드는 사라진다..
여기서 stack 제일 위에 있던 factorial(2)가 다시 실행된다. factorial(1)에서 return 값이 1이므로
result=2*1 //result=2*factorial(1)
그 후 return result를 내보낸다 즉 2를 내뱉는다.
7. 6번 패턴 그대로 스택에서 실행 대기 중인 메서드가 다시 차례대로 실행되는 것이다. factorial(2)가 종료되어서 메모리에 삭제된다. 스택 제일 위에 있던 factorial(3)이 다시 실행되어 n*factorial(2)의 return값 2
result=3*2 //result=3*factorial(2)
저 패턴 그래도 스택에 있던 factorial 메서드가 계속 실행된다.
result=4*6 //result=4*factorial(3)
최종적으로 스택 제일 밑에 있던 factorial메서드가 실행이 종료되면 예시 코드로 참고하면 4*6=24 즉, 24 값을 return 한다.
재귀의 기초 팩토리얼로 공부해보았다.
'Java' 카테고리의 다른 글
[Java] 사용자 정의 예외, 예외 되던지기 (예외처리 1-5) (0) | 2022.01.16 |
---|---|
[Java] 메서드에 예외 선언, finally 블럭 (예외처리 1-4) (0) | 2022.01.12 |
[Java] 멀티 catch 블럭, 예외 발생, checked와 unchecked (예외처리1-3) (0) | 2022.01.05 |
[Java] try-catch문(예외처리 1-2) (0) | 2021.12.27 |
Java_예외 처리(예외처리 1-1) (0) | 2021.12.23 |