데이터 타입 분류
데이터 타입에는 기본 타입과 참조 타입으로 분류된다.
기본 타입(primitive type)에는 정수 타입(byte, char, short, int, long), 실수 타입(float, double), 논리 타입(boolean)이 있다.
내가 오늘 공부해 볼 것은 참조 타입이다. 참조 타입은 객체 지향적 프로그래밍의 핵심이다. 참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입이 존재한다.
기본 타입 변수 VS 참조 타입 변수
기본 타입 변수는 값이 저장됨.
참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.
참조 타입 변수는 stack 영역에 존재하고 heap 영역에 객체 주소에 내용을 가져옵니다.
메모리 사용 영역
저번에 JVM을 공부할 때 클래스 로더가 파일을 로더하고 메모리의 용도에 따라서 영역을 나누어 관리한다고 했습니다.
그때 메모리 영역에는 Method Area(메서드 영역), Stack 영역(스택 영역), Heap 영역(heap 영역) 등이 존재합니다. 또 PC Register와 Native Method stack도 존재합니다.
자바에 존재하는 각각의 변수들이 Runtime에 알맞은 Data Areas에 들어가야 합니다.
자바의 변수 종류
자바에 존재하는 변수의 종류는 크게 4가지입니다.
지역 변수 (Local Variables)
void exampleMethod() {
int localVar = 10; // 지역 변수 선언
}
지역 변수는 메서드 내부나 코드 블록 내에서 선언되는 변수로서, 해당 블록 내에서만 유효한 변수입니다.
메서드가 실행될 때 생성되고, 메서드가 종료되면 소멸합니다. 메서드의 매개변수도 지역 변수에 해당합니다.
인스턴스 변수 (Instance Variables)
class MyClass {
int instanceVar; // 인스턴스 변수 선언
}
인스턴스 변수는 클래스 내에 선언되지만, 메서드 밖에서 선언되는 변수입니다. 객체가 생성될 때 메모리에 할당되며, 객체의 소멸과 함께 소멸합니다. 객체의 상태를 나타내는 데이터를 저장하기 위해 사용됩니다.
클래스 변수 (Static Variables)
class MyClass {
static int classVar; // 클래스 변수 선언
}
클래스 변수는 클래스 내에 static 키워드로 선언되는 변수로서, 해당 클래스의 모든 인스턴스들이 공유하는 변수입니다. 클래스가 로드될 때 생성되며, 프로그램이 종료되기 전까지 유지됩니다. 클래스 변수는 주로 상수 값이나 공유 데이터를 저장하는 데 사용됩니다.
매개변수 (Parameters)
void exampleMethod(int parameter) {
// 매개변수 parameter
}
메서드에 전달되는 값을 받아들이는 변수를 매개변수라고 합니다. 매개변수도 지역 변수에 해당하며, 메서드가 호출될 때 인자로 전달된 값으로 초기화됩니다.
Method(static) 영역
- 자바의 메모리 사용 영역 중 Method 영역은 JVM의 메모리 구조 중 하나입니다.
- Method 영역은 JVM이 실행 중인 프로그램의 모든 클래스와 인터페이스 코드를 저장하는 공간입니다.
- JVM이 읽어 들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수 (필드), 클래스 변수 (Static 변수), 상수 (final), 생성자(constructor)와 메서드(method) 등을 저장하는 공간입니다.
- Method 영역에 있는 것은 어디에서나 접근 가능합니다.
상수 풀이란?
상수 풀(Constant Pool)은 자바 클래스 파일(. class) 내에 저장되는 특별한 메모리 영역으로서, 클래스의 상수들을 저장하는 테이블입니다. 자바 컴파일러는 상수 풀을 생성하여 클래스 파일에 저장하고, 실행 시 JVM은 이 상수 풀을 사용하여 클래스의 상수 값을 참조합니다.
ex) 문자열 상수(String Constants), 정수 및 부동소수점 상수(Integer and Floating-point Constants), 클래스와 메서드의 참조(Class and Method References)
Stack 영역
- Stack 영역은 자바 프로그램 실행 시 메모리의 한 부분으로서, 메서드 호출과 관련된 데이터를 저장하는 공간입니다.
- 메서드가 호출될 때 스택 영역에 스택 프레임이 생기고 그 안에 메서드를 호출됩니다.
- Stack 은 후입선출 LIFO(Last-In-First-Out)의 특성을 가지며, 스코프(Scope)의 범위를 벗어나면 스택 메모리에서 사라진다.
- 메서드 호출 정보: 메서드가 호출될 때마다 Stack에 호출 정보가 저장됩니다. 호출 정보에는 호출한 메서드의 인자 값, 지역 변수, 복귀 주소 등이 저장됩니다.
- 지역 변수: 메서드 내에서 선언된 지역 변수들이 Stack에 저장됩니다. 지역 변수는 메서드가 실행될 때 생성되고, 메서드가 종료되면 소멸합니다.
- 메서드의 매개변수: 메서드의 매개변수도 지역 변수의 일종으로서 Stack에 저장됩니다. 메서드가 호출될 때 매개변수가 Stack에 전달되고, 메서드 내에서 사용됩니다.
- 복귀 주소(Return Address): 메서드가 실행된 후 호출한 메서드로 돌아가기 위한 복귀 주소가 Stack에 저장됩니다. 메서드 호출이 끝나면 복귀 주소를 참조하여 호출한 메서드로 돌아갑니다.
스택 프레임이란?
스택 프레임(Stack Frame)은 메서드가 호출될 때 생성되는 메모리 블록으로서, 해당 메서드의 호출과 관련된 정보들을 저장하는 데이터 구조입니다. 스택 프레임은 Stack 영역에 저장되며, 각각의 메서드 호출은 하나의 스택 프레임을 형성합니다.
스택 프레임은 메서드가 호출될 때마다 생성되고, 해당 메서드의 실행이 끝나면 소멸합니다. 메서드 호출과 관련된 데이터를 순차적으로 관리하여 호출된 메서드들 간의 상태를 효율적으로 유지하는데 사용됩니다. 따라서 스택 프레임은 메서드 호출 스택(Call Stack)의 요소로서 동작하며, 메서드의 중첩 호출과 관련된 정보를 처리하는 중요한 데이터 구조입니다.
Heap 영역
Heap 영역은 자바 프로그램 실행 시 동적으로 할당되는 메모리 영역으로서, 객체와 배열 등의 데이터 구조를 저장하는 공간입니다. Heap은 프로그램이 실행되는 동안 생성되는 모든 객체들이 저장되며, 가비지 컬렉션(Garbage Collection)에 의해 관리됩니다.
- 동적 할당: Heap 영역은 정적으로 크기가 할당되는 영역이 아니라, 프로그램 실행 중에 필요에 따라 동적으로 메모리가 할당됩니다. 객체나 배열이 생성될 때 Heap 영역에 해당 데이터 구조가 저장됩니다.
- 가비지 컬렉션: Heap 영역에 저장된 객체들은 더 이상 사용되지 않을 때 메모리에서 해제되어야 합니다. 이를 위해 자바는 가비지 컬렉션(GC)을 수행하여 더 이상 참조되지 않는 객체들을 식별하고 자동으로 메모리를 해제합니다.
- 스레드 공유: Heap 영역은 JVM 내의 모든 스레드에 의해 공유되는 메모리 영역입니다. 각 스레드는 Heap에 저장된 객체에 접근할 수 있습니다.
- 객체 생명 주기: Heap 영역에 저장된 객체들은 해당 객체의 생명 주기에 따라 메모리에 존재합니다. 객체가 생성되면 Heap 영역에 할당되고, 더 이상 참조되지 않는다면 가비지 컬렉션에 의해 제거됩니다.
- OutOfMemoryError: Heap 영역은 유한한 크기를 가지고 있으며, Heap 영역이 가득 차게 되면 OutOfMemoryError가 발생합니다. 이는 더 이상 객체를 생성할 수 없을 때 발생하는 오류입니다.
참고
'JAVA 공부' 카테고리의 다른 글
상속에 대해(2) (0) | 2023.08.14 |
---|---|
상속에 대해(1) (0) | 2023.08.13 |
Java 8, 11, 17 (0) | 2023.08.03 |
JVM, JRE, JDK에 대해서 (0) | 2023.08.03 |
스트림이란? (1) (1) | 2023.07.11 |