728x90
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 로 인식한다.
- JVM이 읽어들인 VendingMachinemain 클래스를 perm이라는 메모리 영역에 올린다. (인스턴스가 아니라 클래스 정보가 올라간 것!) 클래스 정보가 올라가면, 이 클래스가 어떤 static메소드나 인스턴스 메소드를 가지고 있는지 안다.
- JVM은 프로그램 시작점인 main 메소드를 찾고, 실행한다.
- 메소드가 실행되면 Java Stack이라고 불리는 메모리 영역에 실행된 메소드 정보가 올라가게 된다 .
- Java Stack에 저장된 메소드 정보하나를 스택 엔트리 라고 한다.
- main메소드 안에 선언된 변수들은 스택 엔트리에 저장된다. main메소드의 아규먼트인 args라는 변수도 스택엔트리에 생성된다. String 배열타입) -> 메소드가 실행이 되면 heap에는 string[]에 대한 인스턴스가 만들어진다. 그리고 args라는 변수가 참조한다. (stack에 쌓여있음)
- 프로그램 카운트는 하나 늘어난다.
- 그다음 메소드가 실행된다. 그 다음 메소드가 printVersion인데 변수가 없어서 스택엔트리에 생성되는 변수도 없다.
- 메소드가 실행되면, 변수도 없고, 이제 실행이 끝나서 stack에서 꺼내서 버린다.
- 그리고 그 다음 코드가 실행된다.
- heap 메모리에 VendingMachine 인스턴스가 만들어진다.
- vm1이라는 변수가 main 스택엔트리에 생성되고, VendingMachine 인스턴스를 참조한다.
- 다음 코드
- heap 메모리에 VendingMachine 인스턴스가 만들어진다.
- vm2이라는 변수가 main 스택엔트리에 생성되고, VendingMachine 인스턴스를 참조한다.
- 다음코드
- (vm1) pushProductButton()메소드가 호출되면서 java Stack에 스택 엔트리가 생성
- PushProductButton()메소드에 선언된 변수 menuId(메소드 내부에 있는 지역변수)가 저장된다.
- return 후 메소드가 종료되면, java Stack에서 제거된다.
- 그리고 pushProductButton()메소드가 return한 값을 product에 저장하고 출력한다.
- (vm2) pushProductButton()메소드가 호출되면서 java Stack에 스택 엔트리가 생성
- PushProductButton()메소드에 선언된 변수 menuId(메소드 내부에 있는 지역변수)가 저장된다.
- return 후 메소드가 종료되면, java Stack에서 제거된다.
- 그리고 pushProductButton()메소드가 return한 값을 product2에 저장하고 출력한다.
- main()메소드가 종료
- java Stack에서 main()메소드가 사라지고
- 프로그램이 종료된다.
메소드 안에서 선언된 변수를 지역변수 라 하고,
지역변수는 메소드가 호출될 때 생겼다가, 종료되면 사라진다.
메소드 별로 지역변수는 메소드가 실행될 때 생성되고 종료될 때 사라진다.
같은 메소드를 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 |
댓글