티스토리 뷰
인스턴스의 정의
자바에서 "인스턴스"란 클래스의 구조를 바탕으로 생성된 실제 객체를 의미합니다. 좀 더 구체적으로 설명하자면, 클래스는 객체의 청사진(설계도)이며, 이 설계도를 기반으로 메모리에 생성된 실체가 바로 인스턴스입니다. 이 인스턴스를 통해 클래스에 정의된 속성과 메서드를 사용할 수 있게 됩니다.
메서드 영역(Method Area), 인스턴스 영역(Instance Area, Heap), 스택 영역(Stack Area) 차이
자바에서 메서드 영역(Method Area), 인스턴스 영역(Instance Area, Heap), 그리고 스택 영역(Stack Area)은 모두 JVM 메모리 구조의 중요한 구성 요소로, 각각의 역할과 특징이 다릅니다. 이들을 비교하면 다음과 같습니다.
메서드 영역(Method Area)
- 정의: JVM이 시작될 때 생성되며, 클래스 정보, 메서드, 필드, 인터페이스 정보, 정적 변수(static variables), 그리고 런타임 상수 풀 등이 저장됩니다.
- 특징:
- 공유 메모리: 모든 쓰레드가 공유하는 메모리 영역입니다.
- 클래스 로딩: 클래스가 처음 로딩될 때 해당 클래스의 구조 정보가 이 영역에 저장됩니다.
- 정적 멤버: 클래스의 정적 변수와 메서드가 저장되며, 클래스의 인스턴스와는 무관하게 사용될 수 있습니다.
- 수명 주기: JVM이 종료될 때까지 존재합니다.
인스턴스 영역(Instance Area, Heap)
- 정의: 힙 영역(Heap Area)이라고도 불리며, 객체와 배열이 생성되는 메모리 영역입니다.
- 특징:
- 개별 객체 저장: 각각의 객체와 배열이 저장되며, 객체들은 독립된 메모리 공간을 가집니다.
- 쓰레드 간 공유: 힙 영역 역시 여러 쓰레드가 공유할 수 있는 영역입니다.
- Garbage Collection: 사용하지 않거나 더 이상 참조되지 않는 객체는 가비지 컬렉터(Garbage Collector)에 의해 자동으로 메모리가 회수됩니다.
- 수명 주기: 객체가 더 이상 참조되지 않으면 가비지 컬렉터에 의해 수거될 때까지 존재합니다.
스택 영역(Stack Area)
- 정의: 각 쓰레드마다 하나씩 존재하는 메모리 영역으로, 메서드 호출 시마다 프레임이 생성되고, 해당 메서드의 로컬 변수, 매개변수, 그리고 중간 연산 결과가 저장됩니다.
- 특징:
- 쓰레드 전용 메모리: 각 쓰레드는 독립된 스택을 가지며, 다른 쓰레드와 공유되지 않습니다.
- 메서드 호출: 메서드가 호출될 때마다 스택 프레임이 생성되고, 메서드 종료 시 해당 프레임이 제거됩니다.
- 빠른 접근: LIFO(Last In, First Out) 구조로 매우 빠른 접근이 가능합니다.
- 수명 주기: 메서드 호출이 끝나면 해당 스택 프레임이 제거됩니다.
예시 코드로 설명
public class Example {
static int staticVar = 10; // 메서드 영역에 저장
int instanceVar = 20; // 인스턴스 영역에 저장
public static void main(String[] args) {
int localVar = 30; // 스택 영역에 저장
Example obj1 = new Example(); // obj1은 스택에 저장되고, 인스턴스는 힙에 저장
obj1.instanceMethod(localVar);
}
void instanceMethod(int param) { // param은 스택 영역에 저장
int localVar2 = 40; // 스택 영역에 저장
System.out.println(param + localVar2);
}
}
메모리 할당 설명:
- 메서드 영역: Example 클래스가 처음 로딩될 때 staticVar와 클래스 정보가 메서드 영역에 저장됩니다.
- 힙 영역: new Example()을 통해 생성된 Example 객체의 인스턴스 변수가 힙 영역에 저장됩니다.
- 스택 영역: main 메서드의 localVar와 obj1 참조 변수, 그리고 instanceMethod의 param과 localVar2는 각각 해당 메서드 호출 시의 스택 프레임에 저장됩니다.
이렇게 세 가지 영역은 각각의 역할에 맞게 데이터와 객체를 저장하며, 자바 프로그램이 효율적으로 실행될 수 있도록 돕습니다.
- 스태틱 메서드에서 스태틱 변수 접근: 스태틱 메서드는 스태틱 변수에 직접 접근할 수 있습니다. 이는 클래스 레벨에서 이루어지기 때문에 인스턴스화가 필요하지 않습니다.
- 스태틱 메서드에서 인스턴스 변수 접근: 스태틱 메서드는 인스턴스 변수에 직접 접근할 수 없습니다. 인스턴스 변수를 사용하려면 해당 클래스의 인스턴스를 생성한 후, 그 인스턴스를 통해 접근해야 합니다.