코드일기장

[Java] JVM메모리 구조, 기본 재귀호출-팩토리얼 본문

Java

[Java] JVM메모리 구조, 기본 재귀호출-팩토리얼

won_hyeok2 2022. 1. 11. 18:04

 

🎯 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");
		}
	}
}

 

출력결과 4= 입력받은 수

 

 

 

 

🔑 재귀호출을 사용한 팩토리얼 코드

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 한다.


 

재귀의 기초 팩토리얼로 공부해보았다.

 

 

 

 

 

Comments