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;
}
}
- int m ; 까지의 T 메모리 구조
- square 메서드의 실행
- 12번째줄 수행
private static int square(int k) { int result; k = 25;
- 메서드 반환값 result 반환
result = k; return result; <-- }
- square 스택 프레임 종료
m = square(k);
- main 스택 프레임 닫는 중괄호로 소멸 ⇒ 프로그램 종료
m = square(k); } <--
스택 프레임간에는 서로의 변수에 접근할 수 없다
- 메서드는 서로의 고유공간을 침범하는 것은 허락되지 않는다
- square 와 main 메서드 내부의 지역변수 m 에 서로 접근하는 경우, 메모리 상의 주소를 명확하게 알고 있어야한다. 즉 , 포인터 문제가 발생한다
- 메서드 호출과 메모리 구조 문제
- 개요
메서드를 서로 다른 위치에서 호출시, 해당 메서드에서 내부 지역 변수에 어떻게 접근해야하는지가 중요한 문제입니다. 자바에서는 포인터의 개념을 사용하지 않는데, 어떤식으로 변수를 주고 받는 걸까
- 메서드 스택 구조 및 포인터
- 메서드가 호출시 마다, 스택 구조가 변경된다.
- 예를 들어, A() → B() → C() 와 같이 메서드 스택 프레임이 구성될 수 있으며
항상 같은 스택 프레임구조를 유지 하지 않는다.
하지만, 상위 스택 프레임에서 하단 메서드 스택 프레임 변수를 참조시에
포인터
의 개념이 필요하긴하다
- 대안
- 값에 의한 전달 (Call by Value)
- 자바에서 메서드 호출 시 인자로 전달되는 값은
변수 그 자체
가 아니라, 변수에 저장된 값의 복사본이다.
- 그래서, 메서드 내부에서 인자 값을 변경해도 원래 변수 값에는 영향을 미칠 수 없다.
- 자바에서 메서드 호출 시 인자로 전달되는 값은
- 값에 의한 전달 (Call by Value)
- 메서드 간 값의 전달 방법
- 인자로서의 전달
- 메서드 호출 시 인자로 값 자체를 전달한다.
- 반환 값을 사용
- 전역 변수 사용
- 전역 변수를 통해 값을 공유할 수 있으나, 코드의 유지보수성과 가독성 측면에서 권장되지 않습니다
- 인자로서의 전달
- 개요
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
멀티 스레드 / 멀티 프로세스의 이해 (0) | 2023.08.18 |
---|---|
변수와 메모리: 전역 변수 쓰지 말라니까요! (0) | 2023.08.17 |
지역 변수와 메모리 : 스택 프레임에 갇혔어요! (0) | 2023.08.17 |
블록 구문과 메모리 : 블록 스택 프레임 (0) | 2023.08.17 |
변수와 메모리 (0) | 2023.08.17 |