예제
package ex04.test;
public class ScopeEx01 {
int n1 = 1;
static int n2 = 2;
static void m1() {
int n1 = 10;
System.out.println("m1 : " + n1);
}
void m2() {
System.out.println("m2 : " + n1);
}
//메인 시작전에 static에 n2 변수와 m1메서드가 로드 되어 있음.
public static void main(String[] args) {
System.out.println("1");
m1();
System.out.println("2");
ScopeEx01 sc = new ScopeEx01();
System.out.println(sc.n1);
sc.m2();
}
}
(static은 메모리 공간에 처음 한번만 뜬다)
스코프란 변수를 선언하였을 때 선언한 변수를 사용할 수 있는 유효범위를 뜻한다.
이는 메모리 공간에 올라가 있는지 아닌지로 구분한다.
static을 변수 앞에 붙이면 main이 실행전에 메모리 공간에 변수가 올라간다.
위 예제를 보면 m1()함수는 동적할당(new)를 하지 않아도 현재 메모리 공간에 올라가 있기
때문에 호출 가능하지만, n1변수 같은 경우에는 static에 의해 메모리 공간에 올라가 있지
않기 때문에 곧바로 실행할 수 없고 new를 써서 동적 할당(heap) 하여야만 접근할 수 있다.
put = 넣다 pop = 빼다(메모리에 있는 값을 cpu에 전달)
실행순서도는
메모리에는 n2, m1(), main()이 떠있음
jvm이 static이 앞에 써있는 데이터를 stack에 올리는데 이때 이름만 우선 올라가 있는 상태(메모리 공간을 할당)
Stack에 있는 main 함수를 찾음
main을 실행함
main의 첫 번째 줄 실행(Queue에 put → 실행후pop) = 1