JAVA/Bootcamp 자바

Static, None Static, JVM, Stack Area

whyHbr 2024. 2. 26. 12:12
728x90
반응형

Static과 메모리의 관계?

 

Q. 메인 클래스는 왜 객체 생성(new) 없이 실행될까

public class StaticTest {
    public static void main(String[] args) {

main 이 있어야 시작 클래스이다. 클래스를 시작해주려면 객체 생성을 new를 해줘야하는데..

메인은 왜 new 없이 실행이 가능할까?

 

->Static 

JVM은 실행할 파일을 찾는다 (실행하려면 메모리 위에 올라와있어야 한다.)

Staitc이 붙은 멤버들은 정해진 static zone 위치에 한 번 자동으로 로딩된다.

스테틱은 프로그램 실행 시 메모리에 자동으로 할당/ 로딩돼 객체 생성 new없이 실행 가능 한 것이다.

 

static 키워드가 붙었다면 Method zone 중 static zone으로 간다.

none static zone은 static이 아닌 메서드들이 가는 공간이다.

 

main무조건 static 이므로 메모리에 자동으로 로딩된다.

JVM이 static zone에 main을 호출한다.

호출된 메서드들을 call stack area frame area( stack area) 에 push(삽입) 한 뒤 동작한다.

 

main이 호출되면 스택에 push한다.

기계어 코드를 스택에 넣고 스택에서 메인이 시작된다.

스택을 보면 프로그램이 어디를 실행하고 있는지 알 수 있다.

메인이 끝나면 스택에 있는 메인 프로그램이 사라진다.

스택에 아무 것도 없으면 프로그램이 종료된 것이다.

 

메서드가 호출이되면 호출된 정보가 스택으로 들어가기 때문에, 스택에 들어가는 정보 = 콜스택

 

main, hap이 메모리에 올라가면 JVM이 메인을 찾는다. main이 stack에 들어간다 이 지역을 call stack frame area 라고 한다.(그냥 stack 이라고 해도 됨)

a,b라는 기억 공간이 스택에 만들어진다. 할당 받은 지역 안에서( main 안에서, 이것을 지역변수라고 한다.)

 

int sum = StaticTest.hap(a,b) // 그냥 hap(a,b)만 써도 staticTest에서 hap을 찾는다. 왜?같은 스태틱 끼리는 스태틱 존에서 찾게 되어있다.

 

hap()이 호출되면 (call 이라고도 함) 기게어 코드가 스택에 들어가 기억 공간 할당을 한다.

 

스택 맨 위에 있는 것이 실행중, 제어권을 가진 것이다.

 

main에서 만들어진 a,b와 hap에서 만들어진 a,b 는 다르다. 각각의 지역이 다르다. 변수 이름만 같다.

 

hap은 return을 만나면 종료된다. 모든 변수가 사라지고 제어권은 main에게로 간다.

 

 static이 호출되면 ( main -> method area - static zone에서 main 자동 생성 -> stack에 호출된 main 정보가 들어가고(push) , 다른 메서드(hap) 호출시  main위에 메서드가 올라간다.

 

 

 Static 이 없는 경우엔 어떻게 접근할까?

 

일반적으로 스태틱을 부를 땐 클래스 이름을 사용한다

ex)staticTest.hap(a,b) 하지만 생략 가능하다

 

static은 자동으로 메모리에 올라간다

none static은 어떻게 메모리에 로딩할까

-> 객체생성 new를 통해

 

 

none static의 메모리 접근 방법은 new 객체생성이다.

ex) NoneStaticTest st = new NoneStaticTest() ; -> 이렇게 화면 heap area에 생성된다.

 

nonestatictest 는 메이닝라 이미 메소드에 올라와있는데 생성자에 의해 다시 올라가나?

-> NO. new 한다고 해서 메모리에 다시 잡히지 않음

 

method area - none static zone에 hap이 올라간다. (static이 없으니까)

heap 에는 hap의 메모리 번지를 가리키는 포인터

 

객체 생성을 해 heap에 hap이 올라온다.

non static zone에 있는 hap()을 가리키는 포인터가 heap에 저장된다.

 

생성된 객체 st 는 stack에 생성된다.

번지가 들어간다 ->  stack에 있는 st가 heap에 있는 hap을 가리킨다.

 

hap을 호출하려면 st.hap()

 

 

none static 접근 방법 : 객체 생성 후 접근

NoneStaticTest st = new NoneStaticTest();
int
sum = st.add(a,b);

 

static인 경우 접근 방법

static인 경우 static zone에 올라와 있기 때문에 new 없이도 .메소드 (ex .hap) 이렇게 도트 연산자를 사용해 사용할 수 있다. 클래스 이름으로 바로 접근 가능하다. [클래스 이름.메서드이름() /  statictest.hap(1,3)] -> 간편하기 때문에 자주 사용하는 메서드는 static으로 접근한다. 

static은 클래스 이름으로 접근하기 때문에 이를 클래스 멤버라고도 한다. 클래스가 붙어있으면 클래스 메서드라고도 부른다.

 

정리 : 클래스 이름 호출

public class MyUtil {
  
public static int hap(int a, int b){
      
int v = a+b;
       return
v;
  
}
}

 

public static void main(String[] args) {
   
int a=10;
    int
b=20;
   
//MyUtil 사용해 만들기
   
int sum = MyUtil.hap(a,b);
   
System.out.println(sum);

   
//nonestatic일시 int sum = my1.hap(a,b);
}

 

none static 접근 방법 : 객체 생성 new

      int v = a + b;
      return
v;
 
}
}

 

public class NoneStaticAccess {
   
public static void main(String[] args) {
       
int a = 11;
         int
b=20;
        
MyUtil1 my = new MyUtil1();
         int
sum = my.hap(a,b);
        
//Myutill1
        //
객체 생성

   
}
}

 

MyUtil1 my = new MyUtil1();

Int sum = my.hap(a,b);

 

728x90