// show 메소드는 static이기 때문에 static 변수만 접근할 수있음.
// 때문에 static이 아닌 a변수는 접근할 수 없어 에러가 남.
public static void show()
{System.out.printf("a=%d, statNum=%d\n", a, staNum);}
hello.java →(compiler)→.class→인터프리터 → 실행
⇒ .class 파일은 중간단계파일
⇒ compile 타입에 할당되는 메모리 : 정적메모리
⇒ 실행타입에 할당되는 메모리 : 동적메모리(heap)
—> 정적메모리 동적메모리 저장 되는 영역들도 따로 정리해서 올려야 할 듯
static이 붙어있는 변수나 메서드는 실행타입에는 없다! 왜냐면 정적메모리일때 만들어지고, 실행(동적메모리일때 만들어지는 게 아니니까)
그리고, static이 붙어있는 거는 static끼리만 놀게하자. 저장되는 영역 이다르니까.
(동적 부분에 저장된 애들하고도 접근할 순 있으나 권장하지 않음(에러뜸))
static이 붙어있는 애들은 객체 이름이 아닌 클래스 이름으로 접근하는 것이 원칙
why? —>
static이 붙어있는 애들은 위 이미지에서 Calc 라는게 생성되기 이전에 생성되어서 이미 정적메모리에 올라가 있음.
즉, 객체이름= new 클래스이름(); 으로 만들어도 객체이름으로 불러오는건 권장X
왜냐면 클래스 안에서 선언하니까 클래스의 멤버는 맞으나, 객체가 만들어질때(실행, 힙영역, 동적메모리)는 이미 생성된 뒤(컴파일러, 정적메모리)니까. 객체에는 존재하지 않음.
public static void main([String[] args){}
다른게 실행되기 전에 메인 함수가 가장 먼저 실행되어 있어야 하기 때문.