우리는 습관적으로 main() 메서드를 static으로 선언하고 이를 프로그램의 시작점(Entry Point)로 삼고 있다. 왜 우리는 main() 메서드를 static으로 선언해야 할까? static 으로 선언한 함수나 변수는 자바 가상 머신에서 객체의 생성 없이 메모리에 할당시켜 호출 가능한 형태로 만든다. 그래서 static으로 선언된 변수나 함수는 클래스이름.static변수/함수로 어디서든지 호출이 가능하다. 하지만 static이 아닌 일반 변수나 함수의 경우 객체가 생성되는 런타임(Runtime)시에 메모리에 할당되어 참조값(Reference)를 통하여 접근할 수 있다. 즉, 일반 메서드는 객체가 new 키워드를 이용해 생성이 되야 객체가 메모리에 할당되어 접근/호출이 가능하다. 그렇다면 우리가 프로그램을 실행할 경우를 보자. 일반적으로 cmd 창에서 자바 프로그램을 실행할 경우 java "메인 클래스"로 실행을 한다. 여기서 main() 함수에 static이 붙지 않다는 하나의 가정을 한다. 그러면 cmd창에 java "메인 클래스" 를 입력해 프로그램을 실행할 경우 내부적으로 아래와 같은 코드가 실행 되어야만 한다. 하지만 이러한 코딩은 어디에도 존재하지 않는다. 밑의 코드와 같이 객체를 생성하지 않는 데 어떻게 main() 메서드가 자동으로 할당되는 것일까?

메인클래스 변수 = new 메인클래스();

변수.main();

왜냐하면 main()함수가 static으로 선언되어 있기 때문이다. 위에서 말했듯이 static으로 선언한 메서드는 자바 가상머신(JVM)에서 객체 생성 없이 메모리에 할당시켜 호출 가능한 형태로 만든다. 실제로 cmd창에 java "메인 클래스"를 입력하면 JVM은 메인 클래스의 객체를 생성하는 것이 아니라, 클래스의 static으로 선언된 메서드를 객체 생성 없이 메모리에 할당시키고 할당된 메서드 중 "main"으로 네이밍된 메서드가 있는지 찾아 호출하게 된다. 즉 "(메인 클래스).main()"이 JVM 상에서 실행되는 것이다. 따라서 Entry Point 즉, main() 메서드는 static 이어야 한다.

 

 

* static 멤버 호출 순서 : 정적 변수 -> 정적 초기화문 -> 정적 메서드

+ Recent posts