개발/Java
Static
by BellOne4222
2024. 1. 28.
static
- 메인(시작) 클래스는 왜 객체 생성(new) 없이 실행이 될까?
- 메인 클래스가 동작 되는 방식을 이해해야한다.
- JVM이 실행할 클래스를 찾는다
- static 키워드가 붙어있는 멤버들을 정해진 메모리(static-zone) 위치에 한 번 자동으로 로딩 한다. (Method Area에 static-zone과 none-static-zone으로 구성되어있다.)
- static 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩된다는 점이 중요하다.
- 여기서는 main() 메서드가 static이기 때문에 메모리에 자동으로 로딩한다.
- JVM이 static-zone 에서 main() 메서드를 호출한다.
- 호출된 메서드를 Call Stack Frame Area(Stack Area)에 push(기계어 코드를 넣고) 한 뒤 동작을 시작한다.
- Call Stack Frame Area(Stack Area)
- 메서드가 호출되면 기계어 코드가 push되고 실행되는 메모리 공간
- 현재 프로그램이 실행되고 있는 상태를 파악할 수 있다.
- LIFO 구조이다.
- PC(Program Counter) : 현재 수행중인 프로그램 위치
- 메서드를 호출하면 pc를 한칸 위로 올리고 기억 공간을 만든 후 메서드 stack에 push
public class StaticTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
// a+b =?
int sum = StaticTest.hap(a, b);
System.out.println(sum);
}
// Q. 매개변수로 2개의 정수를 입력받아서 / 총합을 구하여 / 리턴하는 / [메서드를 정의]하시요.
public static int hap(int a, int b){ // 같은 static zone에 있어야 호출이 가능하므로 메서드를 static으로 선언
int v = a + b;
return v;
}
}
- static과 static이 아닌 멤버들의 접근 방법
- None Static Zone에 접근하는 방법
- 객체를 생성해서 메모리에 로딩시켜야한다.
- Heap Area : 객체가 생성(new) 되는 메모리 공간
- Heap Area에 생성된 hap 객체가 none static zone의 hap()을 가리킴
- Method Area
- 메서드의 기계어 코드가 할당되는 메모리 공간
- static 멤버들의 할당되는 메모리 공간
public class NoneStaticTest {
public static void main(String[] args) {
int a=10;
int b=20;
NoneStaticTest st = new NoneStaticTest();
// 새로운 객체를 생성해서 Heap Area에 생성, st라는 번지를 Stack Area에 생성
int sum = st.hap(a, b);
System.out.println(sum);
}
public int hap(int a, int b){
int v=a+b;
return v;
}
}
- 두 개의 클래스로 static 메서드에 접근하는 방법
- static 멤버는 클래스를 사용하는 시점에서 자동으로 static zone에 로딩된다.
- 따라서, new를 이용해서 객체를 생성할 필요가 없다.
- static 멤버 접근 방법 : 클래스이름.호출 메서드
- static이 붙어있는 메서드는 클래식 메서드, 그냥 클래스는 인스턴스라고 한다.
public class StaticAccess {
public static void main(String[] args) {
int a = 10;
int b = 10;
//MyUtil
int sum = MyUtil.hap(a, b); // 클래스이름.호출메서드
System.out.println(sum);
}
}
- 두 개의 클래스로 none-static 메서드에 접근하는 방법
public class NoneStaticAccess {
public static void main(String[] args) {
int a = 10;
int b = 10;
// MyUtil1, 객체 생성해서 접근
MyUtil1 my1 = new MyUtil1();
int sum = my1.hap(a, b);
System.out.println(sum);
}
}