JAVA 컴파일, 런타임 순서

12·2026년 2월 26일

자바

목록 보기
5/8
post-thumbnail


public class SwitchDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String res = howMany(1);
		System.out.println(res);
	}

	public static String howMany(int n) {
		if (n == 1)
			return "1개";
		else if (n == 2)
			return "2개";
		else
			return null;
	}
}

1. 컴파일 단계

_javac SwitchDemo2.java_

1.문법 검사
2.타입 검사
3.바이트 코드 생성
4.SwitchDemo2.class 파일 생성

2. 런타임

1.클래스 로딩
클래스 정보가 Method Area(메서드 영역)에 올라감.

2.main() 호출 → Stack
main 메서드가 Stack에 push 됨
Stack 안에는: 매개변수 args, 지역변수 res

```public static void main(String[] args) {```

3.howMany(1) 호출
String res = howMany(1);
stack안에 howmany 추가됨

4.howMany 내부 실행

    return "1개";

n은 howMany의 Stack Frame에 저장
"1개"는 문자열 리터럴

문자열 리터럴은 Heap의 String Constant Pool에 저장
Heap
└── String Pool
└── "1개"

  1. return
    "1개"의 참조값이 main으로 전달됨
    howMany Stack Frame 제거(pop)

6.res
String res
res는 Stack에 존재하는 참조변수
실제 문자열 객체는 Heap에 있음

7.System.out.println(res);

println 호출
내부적으로 또 다른 Stack Frame 생성
출력 후 제거

8.main 종료
main Stack Frame pop
Stack 비어짐
프로그램 종료

전체 메모리 구조

Method Area
 └── SwitchDemo2 클래스 정보
     └── main()
     └── howMany()

Heap
 └── String Pool
     └── "1개"

Stack
 └── main frame
     └── res (참조값)

메서드는 Stack

객체는 Heap

클래스 정보는 Method Area

참조변수는 Stack

0개의 댓글