2024. 5. 22. 11:30ㆍ나도 할 수 있는 Java&Spring 웹 개발 종합반
1. static과 메모리의 관계
Q. 메인(시작) 클래스는 왜 객체생성(new) 없이 실행되는가?
A. 메인(시작) 클래스가 동작(실행)되는 방식을 이해해야 한다.
1. JVM이 실행할 클래스를 찾는다
2. static 키워드가 붙어있는 멤버들은 정해진 메모리(static-zone) 위치에 한번 자동으로 로딩한다
-> static 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩된다(★)
3. JVM이 static-zone에서 main() 메서드를 호출한다
4. 호출된 메서드를 Call Stack Frame Area (Stack Area)에 push(기계어 코드를 넣고) 한 뒤 동작을 시작한다\
Call Stack Frame Area (Stack Area) :
- 메서드가 호출되면 호출된 기계어코드가 push되고 실행되는 메모리공간
- 현재 프로그램이 실행되고 있는 상태를 파악할 수 있다
- LIFO(Last-In-First-Out) 구조이다
main() -> 지역변수(local area)
stack에 아무것도 없으면 프로그램이 종료됨
stack에서 push-pop 이 이루어짐
static 멤버는 클래스를 사용하는 시점에서 자동으로 static-zone에 로딩된다
따라서 new를 이용해서 객체를 생성할 필요가 없다
2. static 멤버들의 접근방법
Q. none-static 메서드는 어떻게 접근하는가?
A. 객체를 생성해서 메모리에 로딩 시켜야 한다.
* Method Area
- 메서드의 기계어 코드가 할당되는 메모리 공간
- static 멤버들의 할당되는 메모리 공간
* Heap Area
- 객체가 생성(new)되는 메모리 공간
static 멤버접근방법 : 클래스이름.호출메서드
public class NoneStaticTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
NoneStaticTest st = new NoneStaticTest();
int sum = st.hap(a, b);
System.out.println("sum = " + sum);
}
public int hap (int a, int b) {
int v = a + b;
return v;
}
}
sum = 30
3. private생성자와 static의 관계
자바 API에서는 :
1. private 생성자를 가지고 있는 클래스도 있다 (Ex: System, Math, 등)
2. 생성자는 반드시 public이진 않다
static은 객체생성과 관련이 없다
private 생성자 안은 다 static이어야 한다
public class AllStatic {
public int hap(int a, int b) {
int v = a + b;
return v;
}
public int max(int a, int b) {
return a > b ? a : b;
}
public int min(int a, int b) {
return a < b ? a : b;
}
}
import fc.java.model.AllStatic;
public class AllStaticTest {
public static void main(String[] args) {
AllStatic st = new AllStatic();
System.out.println(st.hap(10, 20));
System.out.println(st.max(10, 20));
System.out.println(st.min(10, 20));
}
}
30
20
10
보다 편리하게 하기 위해서
public class AllStatic {
public static int hap(int a, int b) {
int v = a + b;
return v;
}
public static int max(int a, int b) {
return a > b ? a : b;
}
public static int min(int a, int b) {
return a < b ? a : b;
}
}
import fc.java.model.AllStatic;
public class AllStaticTest {
public static void main(String[] args) {
System.out.println(AllStatic.hap(10,20));
System.out.println(AllStatic.max(10, 20));
System.out.println(AllStatic.min(10, 20));
}
}
30
20
10
이러한 방식이 바람직하다
public class AllStatic {
private AllStatic() {
}
public static int hap(int a, int b) {
int v = a + b;
return v;
}
public static int max(int a, int b) {
return a > b ? a : b;
}
public static int min(int a, int b) {
return a < b ? a : b;
}
}
import fc.java.model.AllStatic;
public class AllStaticTest {
public static void main(String[] args) {
System.out.println(AllStatic.hap(10,20));
System.out.println(AllStatic.max(10, 20));
System.out.println(AllStatic.min(10, 20));
}
}
30
20
10
private로 사용하여 객체 생성을 막을 수 있다
Max, Min 등 자바에서 제공하는 클래스도 있다
4. JVM이 사용하는 메모리 영역
Method Area :
- 메서드의 바이트코드(기계어 코드)가 할당되는 공간
- static-zone과 none-static-zone으로 나누어진다
- static 멤버들은 static-zone에 할당된다
Heap Area Generation :
- 객체가 생성되는 공간(new 연산자)
- GC(garbage collector)에 의해서 메모리가 수집된다
Thread (PC Register + Stack Area) :
- 메서드가 호출되면 메서드의 기계어코드를 할당받고(Native Method Area) 메서드가 실행되는 메모리공간(Call Stack Frame Area) (지역변수, 메개변수들이 만들어지는 공간)
- PC(Program counter)에 의해서 현재 실행중인 프로그램의 위치가 관리된다
- LIFO구조로 운영이 되는 메모리 공간 (메서드의 호출 순서를 알 수 있다)
RunTime Constant Pool (Literal Pool) :
- 상수 값 할당이 되는 메모리 공간
- 문자열 중 문자열 상수(리터럴)가 할당되는 메모리 공간
5. class, object, instance의 상호관계
Class : 객체를 모델링하는 도구 (설계도)
Object : 객체, 클래스를 통해서 선언되는 변수
instance(실체) : 객체생성에 의해 메모리에 만들어진 객체를 인스턴스라고 한다
이 셋은 서로 비슷한 개념으로 모두 객체를 나타내는 용어