새소식

Reflections/Daily

1일차 - Main Method? JVM?

  • -

 

🚀 학습 목표 & 예상 결과

 

  • 자바의 신 1~15장 핵심 키워드 중심으로 문제 리스트 만들고 풀어보기 (5장 분량의 문제 풀이 완료)
  • 멘토링에서 나온 문제 풀기 (2개 풀이 완료)

 

 

📌TIL 

❓ Main Method?

 

메인 메소드란 무엇이고 왜 필요한 것일까?

 

 

1. main 메소드란 무엇인가?

 

자바에서 main 메소드는 프로그램 실행 시 JVM이 가장 먼저 실행하는 메소드다.

JVM이 클래스 파일을 실행할 때, 클래스 내에 'main'메소드를 찾아 실행한다.

 

만약 main메소드가 없다면 JVM은 프로그램의 시작점을 찾지 못하여 클래스 파일이 실행될 수 없다.

또한 main 메소드가 종료될 때 프로그램도 종료된다.

 

즉, main은 자바 프로그램의 시작점(entry point)라고 할 수 있다.

 

 

1-1 근데 왜 하필 메소드 이름이 main인가? 다른 이름은 안 되나?

mian은 Java 언어 표준 스펙에서 규정한 이름이다.

Java 언어 표준 스펙에서는 main 메소드가 프로그램 진입점이어야 하고, 메소드 이름은 반드시 main이어야 한다고 규정하고 있다.

따라서 main 메소드의 이름 변경은 불가능하다.

표준 스펙에서 main 메소드 이름을 변경한다고 한다면 변경될 수도 있지 않을까 싶다만... 그럴 일은 없을 듯하다.

 

 

2. main 메소드는 왜 public static void main(String[] args)일까?

  • public

JVM은 외부에 존재하고, 외부에서 main 메소드에 접근하기 위해선 public이어야 한다.

 

  • static

JVM은 main을 static으로 설정하지 않는다면 클래스 인스턴스가 생성된 이후에나 사용 가능하다.
하지만 main 메소드는 프로그램의 시작점으로서 인스턴스가 생성되기 전에 호출돼야 하기에, static이 빠진다면 시작점을 찾을 수 없어 실행이 불가능해진다.
(참고로 JVM은 클래스를 로드할 때, static 멤버를 먼저 로드하고 static 초기화 블록에서 정의된 내용을 실행한다.)

 

  • void

main이 종료될 때 프로그램이 종료되기 때문에 리턴값이 필요 없다.

 

  • String[] args

해당 변수는 프로그램에서 외부의 값을 받아 오기 위해 쓰인다.

 

Java에서 프로그램을 실행할 때, 운영체제가 프로그램 프로세스를 시작하고 JVM을 실행시킨다.

이후 명령행에 입력한 인자값들을 운영체제가 JVM에게 전달, JVM이 main 메소드에 전달한다.

해당 내용은 사용자로부터 파일 경로, 옵션 등등의 입력값을 받는다.

 

만약 외부 입력값을 필요로 하지 않는다면 args배열은 사용되지 않는다.

 

 


 

그래, main 메소드가 뭔지 알겠다. 근데 여기서 자꾸 언급되는 JVM이란 무엇일까?

 

 JVM이란?

 

간단하게 말하자면 자바를 실행하고 관리하기 위해 필요한 녀석이다.

컴파일, 컴파일된 class를 실행, 메모리관리, 스레드 관리, 클래스 로딩 등등의 작업을 해주는 친구다.

 

JVM 덕분에 자바는 OS 종속적이지 않고 플랫폼 어디든 이식가능하며, 자동으로 메모리 관리가 가능하게 되는데

해당 내용은 따로 포스팅으로 정리하고 있으니 그쪽 내용을 참고하자.(JVM 설명 포스팅으로 이동) 

 

 

🔗 Feedback

◾ 예상 결과 <> 실제 결과

 

솔직히 5장 분량의 내용정도는 가볍게 풀 수 있으리라 생각했는데 아니었다.

문제 수준을 너무 얕본 데다가 이상한 데에 꽂혀서 너무 많은 시간을 소모하고 자신을 과대평가한 것도 한몫을 한 듯하다.

공부 시간에 비해 결과가 너무 처참하다..

  • 예상결과 >>>>> 실제결과

 

 

◾ 성공 비결 & 실패 이유

 

  • 실패 이유

내 지식수준에 비해 문제를 너무 얕봤다.

JVM과 Java의 실행 순서를 모르는 상태에서 main에 대해 공부하다 보니 여기저기 턱턱 막혔다.

왜 main이 가장 먼저 실행되냐부터 시작해서, main을 어떻게 찾아서 실행하는 건지, main을 먼저 실행하는 이유는 뭔지, 이름이 왜 꼭 main인가, JVM은 뭔데 외부에 있어서 public으로 설정해야 되는가 등등 너무 많은 질문이 쏟아졌다.

 

게다가 중간엔 String[] args가 뭔가 큰 의미가 있지 않을까 해서, 사실 이해가 가질 않아서 3시간은 붙잡고 있었다. (JVM 측에서 뭔가 값을 넘겨주는 게 아닐까 계속 고민했다.)

처음엔 main을 이해하기 위해서 JVM을 공부하고, JVM을 이해하기 위해서 시간을 소모하다가 다시 main으로 넘어오고...

 

순서도 뒤죽박죽에 배경지식이 부족해 생긴 의문들을 하나하나 대답하다 보니 시간이 부족했다.

 

 

  • 성공비결

아이러니하게도 끝까지 찾아가 본덕에 여기까지 이해할 수 있었다.

시간은 오래 걸려 목표량에는 한참 못 미쳤지만 (나름) 많은 걸 공부할 수 있는 시간이었다.

 

 

◾ 좋았던 것, 부족했던 것, 개선할 것, 칭찬할 점

 

  • 좋았던 것 : 답답하고 잘 이해가 안감에도 끝까지 해나간 것,  자바 1~15장 핵심 키워드와 문제를 일부 정리한 것. (노션에 해놨다.)
  • 부족했던 것 : 시간배분. (하나만 끝까지 파고들지 말고 적당히 이해한 상태로 다른 것을 이어서 공부했다면 배경지식이 더 늘어났을 것 같다.)
  • 개선할 것 : 현재처럼 끝까지 나아가되(Keep), 시간을 잘 생각해서 파고들 것.
    또한 범위로 정하는 것이 아닌, 한 문제를 타인에게 이해시킬 만큼 이해하는데 얼마만큼의 시간이 필요할 것 같은지 측정하고 실제 결과와 비교해 볼 것.
    문제를 풀기 위해 이해해야 할 순서를 정해볼 것.
  • 칭찬할 점 : 끝까지 나아가려고 열심히 노력한 것, 블로그 글을 쓴 것, 피드백을 진행한 것, 집에서 공부하는 것이 아니라 라운지에 나온 것.

 

 

◾ 결론

 

  • 끝까지 열심히 찾으려고 한 것, 라운지에 나온 것, 1~15장 정리한 것, 블로그 글 쓴 것 등등 잘했다.
  • 다음부턴 한 문제를 해결하는데 걸릴 시간 예측해 볼 것.
  • 한 문제만 끝까지 파고들지 말고 관련된 정보들을 함께 파고들 것. (실제 결과와도 비교할 것)
    • 해당 문제를 풀기 위해 필요한 정보들을 정리할 것.
    • 정보들의 순서를 정하고 순차적으로 진행할 것.
  • 자신을 너무 과대평가 / 문제를 과소평가하지 말 것...

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.