Main함수를 public static void main(String args[])로 쓰는 이유?

kimseungki·2022년 7월 8일
3
post-thumbnail

계기

자바의 신 책을 요세 보고 있다. 보는 와중에 책에서는 main함수가 없으면 컴파일을 해도 오류가 발생한다. 오류의 내용은 다음과 같다.

자바 파일 생성

자바파일 컴파일

보는 것과 같이 메소드를 찾을 수 없다는 오류를 보인다.(NoSuchMethodError)

이것의 해결 방법은 모든 사람들이 아는 것과 같이 public static void main(String args[])를 쓰면 된다. 하지만 꼭 이렇게 써야되는건가? 라는 점이 궁금했다.

테스트

궁금해서 static를 빼고 실행을 해보았다.


기본 메소드인 static를 표기하라고 한다. 그러면 이걸 왜 표기해야 될까?

이유

표기해야 되는 이유는 JVM에 로드를 하기 위해 필요하다.
그러면 JVM에 로드가 되는 클래스는 어떤 조건을 가지고 있는가?

JVM에 로드가 되는 클래스는 3가지 중 하나의 조건을 가지면 된다.
1. 클래스의 객체가 생성 될 때
2. 클래스의 정적 변수가 사용될 때
3. 클래스의 정적 메소드를 요청할 때이다.
main함수의 경우 JVM에서 클래스의 메소드를 호출 할 방법이 없다. 그리고 메인함수를 가지고 있는 메인 클래스의 경우 마찬가지로 어디서 main함수로 객체를 선언을 해주지 않는 이상(1번) 직접 호출은 어렵다. 메인함수는 함수 즉 행동을 나타내는 것이기 때문에 상태를 나타내는 변수와는 다르다(2번) 따라서 모든 곳에서도 실행을 할 수 있는 public로 선언을 하고 3번에 해당하는 조건을 충족시키기 위해 static를 사용하는 것이다.

마지막으로 String args[]의 경우 결국 메인함수가 파라미터로 받는 것은 모두 외부에서 받는 것이다. 즉 input을 통해 받는 것인데 우리가 Scanner이나 BufferedReader를 쓸 때와 같이 모두 String으로 받고 Integer나 기타 Wrapper 클래스로 바꿔준다. 따라서 외부에 있는 값은 String으로 받을 수 밖에 없기 때문에 이렇게 쓰는 것이다.

JVM에 로딩되는 클래스의 정보를 확인하려면 -verbose:class를 쓰면된다. static로 한 후 확인을 해보면

main source가 로딩이 되었음을 알 수 있다.

profile
seung 기술블로그

0개의 댓글