코테를 볼 때 클래스를 생성을 하고 나면 main 문을 자동완성 시켜서 코드를 짜기 시작한다.
하지만 main문이 왜 저렇게 구성되어 있는지는 깊게 생각해본 적이 없었다.
오늘의 포스팅은 왜 "public static void main(String[] args)" 로 구성되어 있는지 알아보려고 한다.
먼저, JVM은 다들 아시겠지만 Java Virtual Machine 으로 운영체제 독립적으로 자바를 실행할 수 있게 도와주는 녀석이다. JVM 은 먼저 main 이라는 이름이 붙은 메서드를 찾아 프로그램을 시작하도록 설계되어 있다고 한다.
그렇게 때문에 우선적으로 JVM 이 접근할 수 있도록 public 이라는 접근 제한자가 붙여져 있어야한다.
public
public은 "접근 제한이 없고, 자바 프로젝트 내에서 자유롭게 접근할 수 있는 접근제어자"이다.
- default(기본값, 접근 제어자를 명시하지 않음) : 같은 패키지 내에서만 접근 가능.
- private : 같은 클래스 내에서만 접근 가능.
- protected : 같은 패키지 + 다른 패키지의 자식 클래스에서 접근 가능.
- public : 접근 제한 없음.
JVM이 Java 프로그램을 시작하고 main 메서드를 실행하려 하는 시점은 어떤 클래스도 로드 되어 있지 않은 상태이다.
이때 main 메서드의 접근 제한자가 default, private, protected 으로 되어있다면 클래스 내부에서만 접근을 허용한다던지, 패키지 내부에서만 접근을 허용한다는 뜻이 된다. 즉, 접근 제약이 생긴다.
그렇기 때문에 JVM이 초기에 접근 제약을 통과하기 위해서는 public 을 사용해야한다.
static
static은 프로그램이 시작하게 되면 따로 인스턴스화 하지 않아도 프로그램의 시작과 동시에 메모리에 호출이 되어진다.
static의 특징은 프로그램이 종료되는 시점까지 유지가 되며 new 키워드로 생성한 객체들은 Garbage Collector 의 메모리 청소의 대상이 되지만 static 은 그렇지 않다.
즉, main 메소드는 프로그램의 종료되기까지 살아남아 있어야한다는 뜻이다.
void
void 는 리턴 값이 없다는 뜻이다. 즉, 반환할 것이 없다는 뜻!
main에서 void 를 사용하는 것은 프로그램 자체가 종료가 되는 시점에서는 어떠한 반환값도 없어야 하기 때문이다.
즉, main 메서드가 종료되면 그대로 프로그램도 종료되기 때문에 더 이상 실행할 메서드가 없는데 main에서 어떤 결과물이 있더라도 사용해 볼 기회도 없다.
종료할 때 반환값이 필요하지 않기 때문에 void를 사용한다.
참고 블로그 : https://atomicliquors.tistory.com/7
'개발 일지 > Java' 카테고리의 다른 글
[Java] 해시 충돌 (0) | 2022.12.19 |
---|---|
[Java] equals 와 hashCode (0) | 2022.12.18 |
[Java] Java 8 / Java 11 버전 별 특징 (0) | 2022.12.17 |
[Java] ArrayList 동작원리 (0) | 2022.12.17 |
[JAVA] JVM 구조와 JAVA의 동작 원리 (0) | 2022.01.16 |
댓글