
자바 프로젝트를 생성하면서 가장 많이 만나게 되는 메서드가 있다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
습관적으로 쓰고있는 public static void main()의 의미가 궁금해졌다.
JVM이 실행될 때 main메서드를 찾아 실행을 한다는 사실은 알고있었지만
왜 앞에 저런 키워드가 붙어야만 하는지 정확히 알진 못하였다.
public
main 메서드는 프로그램 어디에서나 접근이 가능해야 하기 때문에 public 키워드를 사용한다.
JVM이 프로그램을 실행하려면 시작점인 main 메서드를 호출해야하는데 public 이 아니라면 해당 메서드에 접근할 수 없다.
static
static 키워드는 main 메서드에 대한 클래스의 인스턴스를 생성하지 않고도 호출할 수 있게 만든다.
JVM이 main메서드를 찾아 실행할 때, 아직 해당 클래스의 인스턴스가 생성되지 않은 상태이고,
만약 main 메서드가 static이 아니라면, JVM은 해당 메서드를 호출하기 위해 클래스의 인스턴스를 생성해야 하는데, 이는 불가능하다.
void
main 메서드는 프로그램의 시작점이자 종료점이기 때문에, JVM에게 특별한 값을 돌려줄 필요가 없다.
따라서 void 키워드를 사용한다.
요약
- public: JVM이 프로그램 외부에서 main 메서드에 접근할 수 있도록 한다.
- static: JVM이 클래스 인스턴스를 생성하지 않고도 main 메서드를 호출할 수 있도록 한다.
- void: main 메서드가 JVM에게 어떤 값도 돌려줄 필요가 없다.
어찌 생각해보면 당연한 내용들인데 습관적으로 사용하다보니 의미를 모르고 기계적으로 작성만 했던 것 같다.
그렇다면 C에서는?
절차지향 언어이기 떄문. 프로그램이 실행될 때, 운영체제는 프로그램을 위한 별도의 메모리 공간을 할당하고 main 함수도 이 공간 안에 존재하기 때문에 static 키워드가 필요하지 않다.
int main() 또는 int main(void) void main() 의 차이
운영체제는 프로그램이 종료할때 main()함수의 리턴값을 받아보고 프로그램이 왜 종료되었는가를 판단하는데,
- return 0: 프로그램이 정상 종료되었음을 나타냄
- return 1: (혹은 0이외의 다른 값): 오류 발생을 의미하며, 값은 오류종류에 따라 다름
운영체제 프로그램의 종료사유를 아는것이 사용자 입장에서는 아무 의미가 없는 동작이다.
따라서 상관이 없지만 C 표준은 int main(void) 또는 int main(int arge, char *argv[]) 를 명시하고 일부 컴파일러나 특정 환경에서는 오류가 발생할 수 있으므로
void main()은 사용하지 말고 파라미터도 void로 채워주자!
참조
https://www.javatpoint.com/why-main-method-is-always-static-in-java