Static 메소드
static 메소드에서 인스턴스 변수가 올 수 없는 이유 ?
class AAA {
int num = 0;
static void addNum(int n) {
num += n; // ✨ 컴파일 오류
}
}
Java
복사
static 메모리
System.out.println 과 out 과 pirntln의 정체는?
java.lang.System.out.println(...);
System은 java.lang 패키지에 묶여 있는 클래스의 이름
그러나 컴파일러가 다음 문장을 삽입해 주므로 java.lang을 생략할 수 있다.
import java.lang.*;
System.out.println(...);
out은 클래스 System의 이름을 통해 접근하므로, 이는 System 클래스의 클래스 변수 이름임을 유추할 수 있다.
System.out.println(...);
println은 out이 참조하는 인스턴스의 메서드이다.
main 메소드가 public이고 static인 이유는?
public static void main(String[] args)
static인 이유! 인스턴스 생성과 관계없이 제일 먼저 호출되는 메서드이다.
public static void main(String[] args)
public인 이유! main 메서드의 호출 명령은 외부로부터 시작되는 명령이다. 단순히 일종의 약속으로 이해해도 괜찮다.
참고) String[] args가 들어가는 이유는?
public static void main(String[] args)
main은 외부 값을 받아들여 동작시켜야 하는 경우가 있음. 따라서 기본적으로 외부 값을 String[] args를 받게끔 약속되어 있다.
JVM에서 메모리 공간
Method Area
•
JVM은 해당 클래스 파일(*.class)을 읽어 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다
•
스태틱 정보를 먼저 읽고 메모리에 올린다
•
Main 메서드가 종료될 때 Method 메모리 공간이 모두 사라진다
Call Stack Area
•
메서드 작업에 필요한 메모리 공간을 제공하는 역할
•
메서드가 호출될 때, 호출에 대한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수들의 연산과 결과 등을 저장한다
•
메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다
•
제일 먼저 main 메서드를 찾는다
•
Stack 이므로 메모리 할당과 제거 순서는 후입선출이다.
호출 스택의 변화
Heap Area
•
프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다
•
Main 메서드가 종료될 때 Heap 메모리 공간이 모두 사라진다
