Static이란
기본적으로 자바는 변수나 메서드를 메모리에서 Stack영역에 저장합니다
이 Stack영역은 사용될때만 호출되고나서 사라지는 메모리 영역입니다
하지만 앞에 Static을 붙이면 변수나 메서드가 Stack영역이 아닌 Method영역에 들어가게되고
데이터가 사라지지 않습니다 즉 전역(정적) 변수와 전역(정적) 메서드가 됩니다
선언
static int static_var = 10;
public static void static_method(){}
Java
복사
메모리 구조
만약 우리가 이런 코드를 작성했습니다
public class StaticTest {
static int num = 1;
static int staticM(int b) {
int staticNum = b + 1;
return staticNum;
}
public static void main(String[] args) {
int num2 = 2;
public int stackM(int a) {
int stackNum = a + 2;
return stackNum;
}
system.out.println(stackM(num1));
system.out.println(staticM(num2));
system.out.println(num1);
}
}
Java
복사
기본적으로 메모리에는 Method, Stack, Heap영역이 존재합니다
프로그램을 실행하면 기본적으로 main()이 있는지 확인합니다
JRE가 main()의 존재를 확인하면 메모리에 java.lang이라는 기본 패키지를 집어넣습니다
그 후 JVM이 우리가 작성한 클래스들과 임포트 패키지들을 Method영역에 넣습니다
여기서 main()과 같이 static으로 작성한 변수와 메서들들도 여기에 들어갑니다
그 다음 Main함수의 스택 프레임이 생성됩니다
그리고나서 함수 내부에 있는 변수들과 메서드가 스택에 쌓이게됩니다
(메서드는 메서드를 호출할때 스택영역에 쌓이게 됩니다)
저렇게 스택에 쌓이고 호출된 메서드와 변수는 다시 스택영역에서 사라지게 됩니다
하지만 여기서 static으로 호출된 변수와 메서드는 사라지지않고 계속 남아있습니다
이렇게 코드가 내려가다가 main함수의 닫는 중괄호를 만나게되면 main함수도 사라지게되고
그 다음 클래스도 닫는중괄호를 만나서 static영역에서 사라지고 프로그램이 종료됩니다