메서드 호출과 메모리: 메서드 스택 프레임2

public class Start4 {
    public static void main(String[] args) {
        int k = 5;
        int m;
        
        m = square(k);
    }
    
    private static int square(int k) {
        int result;
        k = 25;
        result = k;
        return result;
    }
}
  1. int m ; 까지의 T 메모리 구조
  1. square 메서드의 실행
  1. 12번째줄 수행
    private static int square(int k) {
        int result;
        k = 25;
  1. 메서드 반환값 result 반환
    		result = k;
        return result; <--
    }
  1. square 스택 프레임 종료
    m = square(k);
  1. main 스택 프레임 닫는 중괄호로 소멸 ⇒ 프로그램 종료
    m = square(k);
      } <--

스택 프레임간에는 서로의 변수에 접근할 수 없다

  1. 메서드는 서로의 고유공간을 침범하는 것은 허락되지 않는다
  1. square 와 main 메서드 내부의 지역변수 m 에 서로 접근하는 경우, 메모리 상의 주소를 명확하게 알고 있어야한다. 즉 , 포인터 문제가 발생한다
  1. 메서드 호출과 메모리 구조 문제
    1. 개요

      메서드를 서로 다른 위치에서 호출시, 해당 메서드에서 내부 지역 변수에 어떻게 접근해야하는지가 중요한 문제입니다. 자바에서는 포인터의 개념을 사용하지 않는데, 어떤식으로 변수를 주고 받는 걸까

    1. 메서드 스택 구조 및 포인터
      • 메서드가 호출시 마다, 스택 구조가 변경된다.
      • 예를 들어, A() → B() → C() 와 같이 메서드 스택 프레임이 구성될 수 있으며

        항상 같은 스택 프레임구조를 유지 하지 않는다.

        하지만, 상위 스택 프레임에서 하단 메서드 스택 프레임 변수를 참조시에 포인터 의 개념이 필요하긴하다

      • 대안
        • 값에 의한 전달 (Call by Value)
          • 자바에서 메서드 호출 시 인자로 전달되는 값은 변수 그 자체 가 아니라, 변수에 저장된 값의 복사본이다.
          • 그래서, 메서드 내부에서 인자 값을 변경해도 원래 변수 값에는 영향을 미칠 수 없다.
      • 메서드 간 값의 전달 방법
        1. 인자로서의 전달
          1. 메서드 호출 시 인자로 값 자체를 전달한다.
          1. 반환 값을 사용
          1. 전역 변수 사용
            • 전역 변수를 통해 값을 공유할 수 있으나, 코드의 유지보수성과 가독성 측면에서 권장되지 않습니다

Uploaded by N2T