[JAVA Questions] 메모리 구조와 static 복습
자바 메모리 구조와 static 복습
[JAVA Questions] 메모리 구조와 static 복습
메서드 영역에 저장되는 것은?
메서드 영역에는 클래스 정보, static 변수, static 메서드, 상수 풀 등이 저장된다. 이 영역은 프로그램이 실행되는 동안 모든 스레드가 공유한다.
힙 영역과 스택 영역의 차이
힙 영역은 new
키워드로 생성된 객체(인스턴스)가 저장되는 공간이다.
스택 영역은 메서드 호출 시 생성되는 스택 프레임과,
힙에 생성된 객체를 가리키는 참조값이 저장되는 공간이다.
메서드가 호출될 때마다 스택 프레임이 쌓이고, 메서드가 끝나면 프레임이 제거된다.
new Data(10)
으로 생성된 객체는 어디에 저장되고, 참조값은 어디에 저장되나요?
new Data(10)
으로 생성된 객체는 힙 영역에 저장된다. 그리고 그 객체를 가리키는 참조값은 스택 영역에 저장된다.
static
키워드가 붙은 변수는 메모리 어디에 저장되며, 언제 생성되나요?
static
키워드가 붙은 변수는 메서드 영역에 저장된다. 클래스가 로딩될 때 한 번만 생성되고, 프로그램이 종료될 때까지 유지된다.
static
메서드가 인스턴스 변수나 인스턴스 메서드를 직접 호출할 수 없는 이유
static
메서드는 객체(this)가 없기 때문에, 인스턴스 변수나 인스턴스 메서드에 직접 접근할 수 없다.
다음 코드 실행 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public static int count = 0;
public Test() {
count++;
}
}
public class Main {
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
System.out.println(Test.count);
}
}
실행 결과: 2
출력
객체가 생성될 때마다 count
가 1씩 증가하여, 두 번 생성 후 2
가 출력된다.
자바 프로그램이 시작될 때, 아직 어떤 객체도 생성되지 않은 상태에서 main()
메서드가 호출될 수 있는 이유
main()
메서드는 static 메서드이기 때문에, 객체 생성 없이 클래스 로딩 직후 바로 호출할 수 있다.
인스턴스 메서드와 static 메서드 차이
- 인스턴스 메서드는 객체를 생성해야 호출할 수 있다.
- static 메서드는 클래스명으로 직접 호출할 수 있다.
static import
를 사용하면 얻을 수 있는 이점
static import
를 사용하면, 클래스명을 생략하고 static 멤버를 바로 사용할 수 있다.
1
2
import static java.lang.Math.*;
double result = sqrt(4); // Math.sqrt(4) 대신
“메서드 영역에 메서드 코드는 한 번만 로딩된다”는 의미
메서드 코드는 프로그램 실행 중에 메서드 영역에 단 한 번만 로딩된다. 그 이후로 생성되는 모든 객체들은 공통으로 메서드 영역의 메서드 코드를 공유해서 사용한다.
(즉, 객체마다 메서드 코드를 복사해서 갖는 게 아니다.)
This post is licensed under
CC BY 4.0
by the author.