- main() 메서드
: 흔히 프로그래밍할 때 main() 메서드를 많이 사용했을 것이다.
특히 자바에서는 public static void main(String[] args) 를 이용했을 것이다.
자바 API 문서를 보면 https://docs.oracle.com/en/java/javase/17/docs/api/jdk.compiler/com/sun/tools/javac/Main.html
Method Details
- main
public static void main(String[] args)
throws Exception
: Main entry point for the launcher. Note: This method calls System.exit.
Parameters:
args - command line arguments
Throws:
Exception - only if an uncaught internal exception occurs; just retained for historical compatibility
: main 메서드의 설명이 위와 같이 적혀 있다.
main 메서드는 entry point 를 가지고 있고 System.exit 를 호출한다고 적혀 있다.
- System.exit
public static void exit(int status)
: 이 또한 자바 API 문서에 정의되어 있다. 설명으로는 현재 실행중인 JVM을 종료한다는 뜻이다.
status 값에 일반적으로 정상 종류인 경우 0으로 지정하고 비정상 종류일 때 0 이외의 다른 값을 준다
System.exit(0); // 정상적으로 종료
System.exit(1); // 비정상적으로 종료
예외처리로는 SecurityException 를 이용할 수 있다.
- entry point
: 프로그램이 실행이 시작되는 시작점을 의미한다.
: 자바의 경우 엔트리 포인트는 한 개로 정의되어 있다.
: 그렇다면 main 메서드 인자를 보자.
String[] args 처럼 되어 있는데 이는 String 객체로 정의된 args 라는 배열로 인자를 받겠다는 의미다.
자바에서 배열 선언 방법은 3가지이다.
String args[]
String [] args
String ...args
위 3가지 전부 잘 실행된다. 또한, args의 이름을 변경해도 문제가 없다.
- main() 메서드가 실행 전 JVM 에서 수행하는 전처리 작업
일반적인 프로그램 메모리는 코드 실행 영역 / 데이터 저장 영역으로 나뉜다.
static 영역 | |
stack 영역 | heap 영역 |
객체지향 프로그램의 메모리 사용 방식은 위와 같이 stack 영역(지역변수, 메서드) heap 영역(동적 메모리), static 영역으로 나뉜다.
1. java.lang 패키지 배치 : static 영역에 오게 된다.
2. 클래스와 import 패키지 배치 : static 영역에 오게 된다.
3. main() 메서드 스택 프레임 할당 : stack 영역에 main() 스택 프레임을 할당해준다.
4. 메서드 인자 변수 공간 할당 : args 인자 변수 공간을 할당해 준다.
5. main() 메서드 내부 코드 실행 후 종료 후 : stack 영역이 비워진다.
참고
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/SecurityException.html
https://stackoverflow.com/questions/261428/entry-point-for-java-applications-main-init-or-run