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

hyo_·2021년 1월 18일
1

JAVA 

목록 보기
8/20

※ 본 글은 아래 도서를 공부한 후 정리한 내용입니다.

📚 스프링 입문을 위한 자바 객체지향의 원리와 이해


예제 코드의 T메모리 변화를 살펴보면서 전역변수와 메모리 관계가 어떠한지 알아보자!

(T메모리 -> TIL : 다시 보는 main() 메서드: 메서드 스택 프레임 참고)

Study5.java 파일

1 public class Study5{
2	static int share;
3    
4    public static void main(String[] args{
5    	share = 55;
6        
7        int k = fun(5, 7);
8        
9        System.out.println(share);
10   }
11    
12   public static int fun(int m, int p){
13    	share = m + p;
14        
15       return m -p;
16   }
17}

① 4번째 줄을 실행하기 전 T 메모리

  • 코드를 보면 share변수 앞에 static이 붙어있다. -> 스태틱 영역에 변수 공간 할당(Study5 클래스 안에 정의 되어있으므로 해당 클래스가 T 메모리 스태틱 영역에 배치될 때 그안에 공간 생성)

② 7번째 int k = fun(5,7) 줄을 실행 했을 때 T 메모리

  • main() 메서드 스택 프레임에 k 변수 공간을 생성 하고, fun() 메서드의 12번째 줄로 넘어감. -> fun() 메서드 스택 프레임 생성 반환값, 인자값 저장 변수 공간도 생성.

③ 13번째 줄 share = m + p 이 실행되고 나서의 T메모리

④ 15번째 줄 return m-p 이 실행되고 나서의 T메모리

⑤ 16번째 줄의 닫는 중괄호를 만나면 fun() 메서드 스택 프레임이 사라지면서 반환값이 k로 들어가짐-> 제어는 fun() 메서드를 호출 했던 7번째 줄로 옮겨짐

⑥ 8번째 줄의 닫는 중괄호를 만나면 main() 메서드 스택 프레임 소멸, T 메모리 반납이 일어남

정리

👉 5번째 줄과 13번째 줄을 보면 메서드 밖에서 선언된 share 변수는 메서드들 사이에서 공유해서 사용할 수 있는 전역 변수임을 알 수 있다. 여기서 기억해야 할 부분은 지역 변수는 스택 프레임에 종속적 이고, 전역 변수는 스택 프레임에 독립적이라는 것이다.

전역변수 사용을 지양하는 이유

전역변수는 코드 어느 곳에서나 접근할 수 있다고 해서 전역 변수라 하고, 메서드들이 공유해서 사용할 수 있어서 공유 변수라고도 한다.

만약 프로젝트 규모가 커진 상태에서 여러 메서드들이 전역 변수의 값을 변경 할 경우 T 메모리로 추적하지 않는 이상 전역 변수에 저장되어 있는 값을 파악하기 쉽지 않다. 이러한 이유때문에, 전역 변수의 사용은 되도록 피하는게 좋다.


🌞 Check it!! 🌞

  • 지역 변수는 스택 프레임에 종속적 !!

  • 전역 변수는 스택 프레임에 독립적 !!

  • 프로젝트 규모가 커질 경우 전역 변수 값을 추적 하기 쉽지 않음!! ➡ 전역변수 사용 지양

profile
🎓의지적인 삶을 살자!😊

0개의 댓글