public class Start5 {
static int share;
// 3번째 까지
public static void main(String[] args) { //4번째줄
share = 55; // 5
int k = fun(5, 7);//6번째
System.out.println(share);
}
private static int fun(int m, int p) {
share = m + p;
return m - p;
}
}
- 3번줄 까지의 T 메모리
- share 변수는 static 키워드가 붙어 있다
그러므로, T 메모리상 스태틱 영역의 변수 공간이 할당됨.
- share 변수는 static 키워드가 붙어 있다
- 4번 main 메서드 중괄호 여는 경우
- 중괄호를 만나자마자 main 스택 프레임이 스택메모리 공간에 쌓이게 된다.
- 또한 인자인 args 를 main 스택 프레임 공간안에서 쌓게된다.
- 5 ~ 함수 실행까지
- static 변수인 share 는 정적 영역의 클래스 메타데이터 안에서 관리된다.
- share 는 55 라는 값으로 치환됨.
k = fun( 5 ,7 )
- 에서 일단 메서드 스택 프레임이 main 스택 프레임안에 쌓이게 되며,
- 인자인 m 과 p의 값이 Call by Value 로 인하여 각각 5 과 7 로
- fun 메서드 스택 안에서 쌓이게 된다.
- fun 메서드 시작부터 종료시까지
- m+p 가 연산된다.
- 값은 최종 12 가 도출되며
- share 변수가
12
로 치환된다.- 또한 share 변수는 static 변수이기에, 사실상 정적 영역에서 fun 스택 프레임이 끌어다가 사용하는 개념이다
- 고로, share 변수의 원 위치인 정적 변수 값이 수정되어야 한다.
- 반환값은
-2
로 도출된다.
- 또한 fun 메서드의 끝나는 중괄호를 만난다면, 해당 메서드가 종료되어 스택이 소멸되게 된다.
- m+p 가 연산된다.
- int k 에 반환값이 담긴다.
- share 정적 변수의 출력
- share 는 12가 출력된다
- println 은 코드 실행의 영역이기에, T 메모리상에서는 관리 대상이 아니다.
(정정)변수 K 의 경우 fun 메서드 스택 안에 있는 것으로 표현이 되어 오해의 소지가 있습니다.
fun 메서드 스택이 수행되어 반환값이 k 변수에 들어가야합니다.
전역 변수와 지역 변수
변수의 유형
- 지역 변수
- 스택 프레임에 종속적인 변수
- 전역변수
- 스택 프레임에 독립적인 변수
- 여러 메서드들 사이에서 사용되므로, 코드 어디에서나 접근이 가능하다
전역 변수의 특징
- 전역 변수는 여러 메서드들이 공유하여 사용하므로
공유 변수
라고도 합니다
- 하지만, 큰 의미에서는 같은 개념의 인스턴스들끼리만 공유하기에, 완벽한 공유 변수는 아닙니다.
- 스레드 들간에서 공유되는 변수들이 더 넓은 의미의 공유 변수라고 할수 있다는 점을 기억해야합니다
전역 변수 사용 문제점
- 프로젝트의 규모가 커질 수록 전역 변수의 값에 대한 파악이 어려움
- 코드 추적없이는 PRM 불가능
전역 변수 사용 권한 사항
- 만약 사용한다면, 읽기 전용의 전역 상수로 사용해라!
- 예 : Math.PI 원주율..
멀티 스레드에서의 전역 변수
- 멀티 스레드 환경에서는 전역변수 사용이 문제가 될 수 있다!
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
필드 vs 속성 | 함수 vs 메서드 (0) | 2023.08.18 |
---|---|
멀티 스레드 / 멀티 프로세스의 이해 (0) | 2023.08.18 |
메서드 호출과 메모리: 메서드 스택 프레임2 (0) | 2023.08.17 |
지역 변수와 메모리 : 스택 프레임에 갇혔어요! (0) | 2023.08.17 |
블록 구문과 메모리 : 블록 스택 프레임 (0) | 2023.08.17 |