변수와 메모리: 전역 변수 쓰지 말라니까요!
public class Start5 {
static int share;
public static void main(String[] args) {
share = 55;
int k = fun(5, 7);
System.out.println(share);
}
private static int fun(int m, int p) {
share = m + p;
return m - p;
}
}
- main 메서드의 시작
- 프로그램 시작시
main 메서드가 호출됨
main 메서드의 스택 프레임이 생성되며, 스택영역의 맨 위에 위치합니다
- share 변수의 값 할당
main 메서드 내에서 share 변수 (정적변수) 에 55 라는 값을 할당하게 됩니다.
fun 메서드의 호출새로운 스택 프레임이 생성되어
main 메서드에서 fun 메서드를 호출하며
fun 메서드 내에서의 동작
fun 메서드 내에서 share = m + p; 문장이 실행되면
share 변수의 값이 5 + 7 인 12로 변경됨
fun 메서드 반환값
return m-p; 문장이 실행 ⇒ fun 메서드의 반환 값인 -2 가 k 변수에 저장
fun 메서드 스택 프레임의 반환
- 스택 프레임이 반환되며
main 메서드의 스택 프레임에 있던 k 변수에 반환값이 대입됨.
- 출력.
- share 변수 12 출력
Stack 프레임의 특성
- 메서드의 호출과 반환에 따라 동적으로 생성되고 제거되는 구조
- 메서드 호출의 중첩시마다, 스택 프레임이 쌓이며, 메서드가 반환될 때 해당 스택 프레임은 스택에서 제거됨.