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

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;
    }
}
  1. 3번줄 까지의 T 메모리
    • share 변수는 static 키워드가 붙어 있다

      그러므로, T 메모리상 스태틱 영역의 변수 공간이 할당됨.

  1. 4번 main 메서드 중괄호 여는 경우
    • 중괄호를 만나자마자 main 스택 프레임이 스택메모리 공간에 쌓이게 된다.
    • 또한 인자인 args 를 main 스택 프레임 공간안에서 쌓게된다.
  1. 5 ~ 함수 실행까지
    • static 변수인 share 는 정적 영역의 클래스 메타데이터 안에서 관리된다.
    • share 는 55 라는 값으로 치환됨.
    k = fun(  5 ,7 )
    • 에서 일단 메서드 스택 프레임이 main 스택 프레임안에 쌓이게 되며,
    • 인자인 m 과 p의 값이 Call by Value 로 인하여 각각 5 과 7 로
    • fun 메서드 스택 안에서 쌓이게 된다.
  1. fun 메서드 시작부터 종료시까지
    1. m+p 가 연산된다.
      • 값은 최종 12 가 도출되며
    1. share 변수가 12 로 치환된다.
      • 또한 share 변수는 static 변수이기에, 사실상 정적 영역에서 fun 스택 프레임이 끌어다가 사용하는 개념이다
      • 고로, share 변수의 원 위치인 정적 변수 값이 수정되어야 한다.
    1. 반환값은 -2 로 도출된다.
    1. 또한 fun 메서드의 끝나는 중괄호를 만난다면, 해당 메서드가 종료되어 스택이 소멸되게 된다.
  1. int k 에 반환값이 담긴다.
  1. share 정적 변수의 출력
    • share 는 12가 출력된다
    • println 은 코드 실행의 영역이기에, T 메모리상에서는 관리 대상이 아니다.

(정정)변수 K 의 경우 fun 메서드 스택 안에 있는 것으로 표현이 되어 오해의 소지가 있습니다.

fun 메서드 스택이 수행되어 반환값이 k 변수에 들어가야합니다.

전역 변수와 지역 변수

변수의 유형

  • 지역 변수
    • 스택 프레임에 종속적인 변수
  • 전역변수
    • 스택 프레임에 독립적인 변수
    • 여러 메서드들 사이에서 사용되므로, 코드 어디에서나 접근이 가능하다

전역 변수의 특징

  • 전역 변수는 여러 메서드들이 공유하여 사용하므로 공유 변수 라고도 합니다
  • 하지만, 큰 의미에서는 같은 개념의 인스턴스들끼리만 공유하기에, 완벽한 공유 변수는 아닙니다.
  • 스레드 들간에서 공유되는 변수들이 더 넓은 의미의 공유 변수라고 할수 있다는 점을 기억해야합니다

전역 변수 사용 문제점

  • 프로젝트의 규모가 커질 수록 전역 변수의 값에 대한 파악이 어려움
  • 코드 추적없이는 PRM 불가능

전역 변수 사용 권한 사항

  • 만약 사용한다면, 읽기 전용의 전역 상수로 사용해라!
  • 예 : Math.PI 원주율..

멀티 스레드에서의 전역 변수

  • 멀티 스레드 환경에서는 전역변수 사용이 문제가 될 수 있다!

Uploaded by N2T