본문 바로가기
프로그래밍/java

4. java 메소드가 실행될 때 어떤일이 벌어지는가?

by 수삼이는코딩중 2023. 3. 16.
728x90

JVM FIND CLASSPATH

static한 메소드는 인스턴스를 생성하지 않아도 호출할 수 있다.

VendingMachine.printVersion();

이 코드가 오류를 뱉지 않는다면, printVersion()메소드는 static한 메소드.

VendingMachine은 class이름이다.

class명.메소드명();
public class VendingMachine{
	public static void printVersion(){
    	System.out.println("v1.0");
    }
}

static한 메소드는 reference변수명.static메소드() 처럼 호출할 수는 있지만, 바람직한 방법은 아니다.

static한 메소드를 호출하고 싶으면

class이름.메소드명();

위와 같이 적어주는게 좋다. 

 

 

public class VendingMachineMain{
	public static void main(string[] args){
            VendingMachine.printVersion();
            VendingMachine vm1 = new VendingMachine();
            VendingMachine vm2 = new VendingMachine();
            
            String product = vm1.pushProductButton(100);
            System.out.println(product);
            Stirng product2 = vm2.pushProductButton(200);
            System.out.println(product2);
    	}
    }

JVM(Java Virtual Machine)은 VendingMachinemain을 CLASSPATH경로에서 찾아서 실행한다. (현재경로x)

(CLASSPATH= . : CLASSPATH에 .이 있는 경우 현재 경로에서 클래스를 찾아서 실행을 해준다.)

INTELIJ는 OUT 밑에 있는 CLASS들이 저장되어있는 폴더를 CLASSPATH 로 인식한다. 

 

  1. JVM이 읽어들인 VendingMachinemain 클래스를 perm이라는 메모리 영역에 올린다. (인스턴스가 아니라 클래스 정보가 올라간 것!)  클래스 정보가 올라가면, 이 클래스가 어떤 static메소드나 인스턴스 메소드를 가지고 있는지 안다.
  2. JVM은 프로그램 시작점인 main 메소드를 찾고, 실행한다.
  3. 메소드가 실행되면 Java Stack이라고 불리는 메모리 영역에 실행된 메소드 정보가 올라가게 된다 .
  4. Java Stack에 저장된 메소드 정보하나를 스택 엔트리 라고 한다.
  5. main메소드 안에 선언된 변수들은 스택 엔트리에 저장된다. main메소드의 아규먼트인 args라는 변수도 스택엔트리에  생성된다. String 배열타입) -> 메소드가 실행이 되면 heap에는 string[]에 대한 인스턴스가 만들어진다. 그리고 args라는 변수가 참조한다. (stack에 쌓여있음)
  6. 프로그램 카운트는 하나 늘어난다. 
  7. 그다음 메소드가 실행된다. 그 다음 메소드가 printVersion인데 변수가 없어서 스택엔트리에 생성되는 변수도 없다.
  8. 메소드가 실행되면, 변수도 없고, 이제 실행이 끝나서 stack에서 꺼내서 버린다. 
  9. 그리고 그 다음 코드가 실행된다. 
  10. heap 메모리에 VendingMachine 인스턴스가 만들어진다.
  11. vm1이라는 변수main 스택엔트리에 생성되고, VendingMachine 인스턴스를 참조한다. 
  12. 다음 코드
  13. heap 메모리에 VendingMachine 인스턴스가 만들어진다.
  14. vm2이라는 변수 main 스택엔트리에 생성되고, VendingMachine 인스턴스를 참조한다. 
  15. 다음코드
  16. (vm1) pushProductButton()메소드가 호출되면서 java Stack에 스택 엔트리가 생성
  17. PushProductButton()메소드에 선언된 변수 menuId(메소드 내부에 있는 지역변수)가 저장된다. 
  18. return 후 메소드가 종료되면, java Stack에서 제거된다.
  19. 그리고 pushProductButton()메소드가 return한 값을 product에 저장하고 출력한다. 
  20. (vm2) pushProductButton()메소드가 호출되면서 java Stack에 스택 엔트리가 생성
  21. PushProductButton()메소드에 선언된 변수 menuId(메소드 내부에 있는 지역변수)가 저장된다. 
  22. return 후 메소드가 종료되면, java Stack에서 제거된다.
  23. 그리고 pushProductButton()메소드가 return한 값을 product2에 저장하고 출력한다.
  24. main()메소드가 종료
  25. java Stack에서 main()메소드가 사라지고
  26. 프로그램이 종료된다. 

메소드 안에서 선언된 변수를 지역변수 라 하고,

지역변수는 메소드가 호출될 때 생겼다가, 종료되면 사라진다.

메소드 별로 지역변수는 메소드가 실행될 때 생성되고 종료될 때 사라진다. 

같은 메소드를 10번 호출하면 같은 이름일 뿐이지 사실은 별개의 지역변수 10개가 생기는 것.

 

스레드

하나의 서버는 여러개의 요청을 동시에 받아들여 실행할 수 있어야 한다. 

메소드가 여러개 동시에 호출된다는 뜻. 같은 메소드도 변수들은 각각 다른 영역에 저장된다는 것 기억!!

 

 

 

'프로그래밍 > java' 카테고리의 다른 글

6. java 클래스 잘 만들기  (0) 2023.04.10
5. java 필드, static field  (0) 2023.04.05
3. java 메소드 선언방법, UML표기법 익히기  (0) 2023.03.16
2. java 객체지향 프로그래밍 (1)  (0) 2023.03.10
1. Hello. java  (0) 2023.03.10

댓글