전역변수와 지역변수에 대한 정정

 

변수와 메모리: 전역 변수 쓰지 말라니까요!

  • 에 대한 추가입니다.

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;
    }
}
  1. main 메서드의 시작
    • 프로그램 시작시 main 메서드가 호출됨
    • main 메서드의 스택 프레임이 생성되며, 스택영역의 맨 위에 위치합니다
  2. share 변수의 값 할당
  3. main 메서드 내에서 share 변수 (정적변수) 에 55 라는 값을 할당하게 됩니다.
  4. fun 메서드의 호출새로운 스택 프레임이 생성되어
    • main 메서드의 스택 프레임 위에 쌓입니다
  5. main 메서드에서 fun 메서드를 호출하며
  6. fun 메서드 내에서의 동작
    • fun 메서드 내에서 share = m + p; 문장이 실행되면
    • share 변수의 값이 5 + 7 인 12로 변경됨
  7. fun 메서드 반환값
  8. return m-p; 문장이 실행 ⇒ fun 메서드의 반환 값인 -2 가 k 변수에 저장
  9. fun 메서드 스택 프레임의 반환
    • 스택 프레임이 반환되며
    • main 메서드의 스택 프레임에 있던 k 변수에 반환값이 대입됨.
  10. 출력.
  11. share 변수 12 출력

Stack 프레임의 특성

  • 메서드의 호출과 반환에 따라 동적으로 생성되고 제거되는 구조
  • 메서드 호출의 중첩시마다, 스택 프레임이 쌓이며, 메서드가 반환될 때 해당 스택 프레임은 스택에서 제거됨.