자바 변수의 종류
변수는 크게 네 종류로 변수의 선언된 위치에 따라서 클래스변수, 인스턴스변수, 지역변수, 매개변수로 나뉜다.
public class Main {
public static void main(String[] args) { // 매개변수
int num = 0; // 지역변수
}
}
public class Page {
private int state = 0; // 인스턴스 변수
public static int page = 10; // 클래스 변수
public int get() {
return state;
}
}
변수명 | 선언위치 | 설명 | 저장 메모리 |
클래스 변수 (class variable) = static 변수 |
클래스 영역 | 클래스 영역에서 타입 앞에 static이 붙는 변 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의 |
Method |
인스턴스 변수 (instance variable) |
클래스 영역에서 static이 아닌 변수 개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능 * 객체/인스턴스 생성만하고 참조 변수가 없는 경우 가비지 컬렉터에 의해 자동 제거됨 |
Heap | |
지역 변수 (local variable) |
메서드 영역 | 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수 초기값을 지정한 후 사용할 수 있음 |
Stack |
매개 변수 (parameter) |
메서드 호출 시 '전달하는 값'을 가지고 있는 인수 (지역 변수처럼 선언된 곳부터 수행이 끝날 때까지 유효함) |
자바의 메모리 영역
자바 프로그램을 실행하게되면, JVM은 OS로 부터 메모리를 할당 받고 Method, Stack, Heap 각 세 영역에 맞춰서 할당하게 된다.
- 메소드 (Method) 영역 : 전역변수와 static 변수를 저장하며, Method 영역은 프로그램의 시작부터 종료까지 메모리에 남아있음
- 스택 (Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제. LIFO (Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워짐
- 힙 (Heap) 영역 : new 키워드로 생성되는 객체 (인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리
- PC Register : JVM이 실행하고 잇는 현재 위치를 저장하며, 스레드가 생성되면서 생기는 공간
- Native Method Stack : Java가 아닌 다른 언어로 구성된 메소드 실행이 필요할 때 사용되는 공간
자바의 각 메모리 영역이 할당되는 시점?
- Method : JVM 동작 후 클래스가 로딩 될 때 생성
- Stack : 메소드가 호출될 때 할당
- Heap : 런타임시 할당
원시 타입 vs 참조 타입의 메모리 영역
원시 타입 : Stack에 값이 그대로 저장되는 타입 / 참조가 없어서, 빠르게 값에 접근 가능
참조 타입 : Stack에 Heap의 어딘가를 가리키는 주소가 저장
'개발새발 > Java' 카테고리의 다른 글
인터페이스 vs 추상클래스 (0) | 2024.05.26 |
---|