소스 -> 컴파일러 -> 바이트 코드 -> 디스크 -> 바이트 코드 -> jvm -> 기계어 -> 운영체제
내가 작성한 코드가 컴퓨터가 이해할 수 있게 변경 == 컴파일
작성한코드.java ------컴파일 javac. -------> 작성한코드.class (바이너리 파일)
main 메소드의 메소드 이름 앞에는 어떤 예약어들이 들어가나요?
public static void main
접근제어자, 정적선언, 리턴타입, 메서드이름
static으로 선언되지 않으면, 클래스의 인스턴스를 생성해야만 메소드를 호출할 수 있습니다.
그러나 프로그램이 시작될 때는 아직 어떤 인스턴스도 존재하지 않기 때문에
인스턴스를 생성하지 않고도 호출할 수 있어야 합니다.
요약
- 독립적 호출: static으로 선언된 메소드는 객체 생성 없이 클래스 이름으로 직접 호출할 수 있습니다.
- 프로그램 시작 시점: JVM은 프로그램 시작 시 main 메소드를 호출해야 하므로, 인스턴스 없이 호출 가능한 static 메소드로 선언되어야 합니다.
- 클래스 로드 시점: 클래스 로더가 클래스를 로드할 때 static 메소드를 메모리에 할당하기 때문에, JVM은 클래스 로딩 후 바로 main 메소드를 실행할 수 있습니다.
따라서 main 메소드에 static 키워드를 붙이는 것은 필수적이며, 이는 Java 프로그램이 올바르게 시작되고 실행되기 위해 필요한 조건입니다.
JVM이 클래스 로딩 시 바로 호출 가능
static 메소드와 변수는 클래스 로더가 클래스를 로드할 때 메모리에 할당됩니다. 따라서 static 메소드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다. 이 때문에 main 메소드를 static으로 선언하여 JVM이 클래스 로드 후 바로 호출할 수 있게 하는 것입니다.
main 메소드의 매개변수?
String[] args
내가 만든 클래스에서 main()메소드가 없으면 java 명령어로 그 클래스를 수행할 수 있나요?
아니요.
모든 자바 클래스는 main() 메소드가 반드시 있어야 합니다.
안그러면 Exception in thread main java.lang.NoSuchMethodError: main 이 발생합니다.
main() 메소드가 없는 Java 클래스를 실행하려고 하면?
Java 런타임은 다음과 같은 에러를 발생시킵니다
devwonny@devwonnyui-MacBookAir practice % java Test
Error: Main method not found in class Test, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
이 에러 메시지는 JVM(Java Virtual Machine)이 프로그램의 진입점(entry point)을 찾지 못했기 때문에 발생합니다.
JVM은 애플리케이션을 시작할 때 public static void main(String[] args) 시그니처를 가진 메소드를 찾아서 실행하려고 시도합니다.
이 메소드가 없으면 프로그램을 시작할 수 없기 때문에 위와 같은 에러가 발생합니다.