자바의 메모리 구조 크게 다음과 같이 3가지로 나눌 수 있다
프로그램을 실행하는데 필요한 공토 데이터를 관리. 이 영역은 프로그램의 모든 영역에서 공유
자바 실행 시, 하나의 실행 스택이 생성. 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함
스택 프레임: 메서드를 호출할 때마다 하나의 스택 프레임으로 스택 영역에 쌓이며, 메서드가 종료되면 제거 됨
스택 영역은 각 쓰레드 수만큼 스택 영역이 생성됨
자바에서 특정 클래스로 인스턴스를 생성하면 힙 메모리에 생성한 수만큼의 인스턴스가 생기지만 내부의 메서드는 프로그램 동작 시점에서 이미 메서드 영역에서 메모리를 할당하고 있으므로 메서드에 대한 새로운 메모리 할당은 없음
여러 메서드를 계속해서 호출하는 경우, 먼저 호출한 메서드부터 스택 영역에 쌓인다.(이때 메서드는 메서드 영역에서 가져옴) 이후 메서드 내부에서 다른 메서드를 호출한다면 새로 호출한 메서드가 스택 프레임으로 호출 시 넘겨 받은 매게 변수와 함께 스택 프레임으로 스택 영역에 추가된다. 이후 해당 메서드 내부에서 생성한 인스턴스는 힙 영역으로 넘어가서 관리되게 된다. 스택 프레임이 제거 될 때 매게 변수 또한 사라지며 이후 힙 영역에서 관리하던 인스턴스를 참조하는 곳이 없다면 GC의 대상이 되어 사라지게 된다.
static 변수는 정적 변수, 또는 다른 말로 클래스 변수라고 한다.
즉 인스턴스 생성과 별개로 클래스 자체의 변수로, 클래스를 통해서 호출할 수 있는 변수이다. 이로인해 다양한 인스턴스에서 해당 변수를 공용으로 사용할 수 있다.
사용할 때는 인스턴스명.static 변수명, 클래스명.static 변수명 두 가지 방식으로 호출하여 사용할 수 있지만 인스턴스명.static 변수명로 호출할 경우 클래스 변수인지 한 번에 알아보기 어렵기 때문에 관례적은 클래스명.static 변수명 방식을 사용한다.
인스턴스 변수: static이 붙지 않은 멤버 변수 static 이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라 서 인스턴스 변수라 한다.
인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어진다.
클래스 변수: static이 붙은 멤버 변수 클래스 변수, 정적 변수, static 변수등으로 부른다.
static 이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.
클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다. 인스턴스와는 다르게 보통 여러곳에서 공 유하는 목적으로 사용
정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
static 메서드는 static 만 사용할 수 있다.static 이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.static 을 호출할 수 있다.static 을 호 출할 수 있다.멤버 메서드의 종류
static 이 붙지 않은 멤버 메서드static 이 붙은 멤버 메서드static 메서드등으로 부른다.클래스를 통한 접근 DecoData.staticCall()