본문 바로가기
개발/Java

Static

by BellOne4222 2024. 1. 28.

static

  • 메인(시작) 클래스는 왜 객체 생성(new) 없이 실행이 될까?
    • 메인 클래스가 동작 되는 방식을 이해해야한다.
      1. JVM이 실행할 클래스를 찾는다
      2. static 키워드가 붙어있는 멤버들을 정해진 메모리(static-zone) 위치에 한 번 자동으로 로딩 한다. (Method Area에 static-zone과 none-static-zone으로 구성되어있다.)
        1. static 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩된다는 점이 중요하다.
        2. 여기서는 main() 메서드가 static이기 때문에 메모리에 자동으로 로딩한다.
      3. JVM이 static-zone 에서 main() 메서드를 호출한다.
      4. 호출된 메서드를 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);
    }
}

'개발 > Java' 카테고리의 다른 글

객체 생성과 static 과의 관계  (0) 2024.01.28
JVM이 사용하는 메모리 영역  (0) 2024.01.28
배열과 클래스의 관계  (0) 2024.01.28
정보 은닉  (0) 2024.01.28
패키지(Pakage)  (0) 2024.01.28