① 메서드 영역 (Method Area): 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역
② 힙 영역 (Heap Area): new 키워드로 생성된 객체와 배열이 생성되는 영역
③ 스택 영역 (Stack Area): 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
클래스 변수는 공유하기 위한 변수이기 때문에 인스턴스 별로 가지고 있을 필요가 없는 변수에 선언
값의 참조가 목적인 변수
값의 공유가 목적인 변수
그 값이 외부에서도 참조하는 값이라면 public으로 선언
<<Math.PI>> public static final double PI = 3.14159265358979323846;
- 이 값은 변하지 않기 때문에 인스턴스 생성 마다 각각의 메모리 공간을 잡을 필요 X
class NumberPrinter { private int myNum = 0; static void showInt(int n) { System.out.println(n); } static void showDouble(double n) { System.out.println(n); } void setMyNumber(int n) { myNum = n; } void showMyNumber() { showInt(myNum); } } public class ClassMethod { public static void main(String[] args) { NumberPrinter.showInt(20); NumberPrinter np = new NumberPrinter(); np.showDouble(3.15); np.setMyNumber(75); np.showMyNumber(); } }
메모리 생성 시기가 다르기 때문이다.
Static은 클래스가 가장 먼저 스캔되어 method area에 메모리 방이 생성되는데 인스턴스 변수는 객체 생성 후에 메모리 공간이 할당되므로 아직 메모리 할당이 되지 않은 변수를 사용하는 것은 불가능
static함수는 stiatc 변수를 사용 해야 한다. (static변수를 컨트롤 하는 것은 static함수)