[Java] main method 분석

2025. 8. 8. 02:36·개발/java
반응형

Java의 메인 메서드를 보면

public static void main(String[] args) { }

 

이런 식으로 되어 있는데, 왜 이렇게 작성되는지 궁금해서 한번 알아보았다. 하나씩 살펴보도록 하자.

 

1. Public

public은 접근 제어자이다. 단어 뜻에서 유추할 수 있듯, 자바 프로젝트 내 어디서든 main에 접근이 가능하다는 의미이다.

JVM이 어떤 패키지(외부)에서든 main 메서드에 접근할 수 있어야 하기 때문에 public으로 설정하는 것이라 볼 수 있다.

*JVM(Java Virtual Machine)
Java 프로그램을 실행하는 가상 컴퓨터다. "Write Once, Run Anywhere"라는 Java의 핵심 철학을 실현하는 핵심 기술이다. 
각 운영체제마다 다른 기계어를 사용하기 때문에, JVM이 중간 언어로서 개발자가 따로 신경 쓰지 않고 프로그램을 개발할 수 있도록 대신 처리해준다.

 

2. Static

static은 메모리 영역을 나타낸다. 

해당 영역의 data는 프로그램 시작부터 종료까지 유지된다.

 

일반적으로 한 클래스에 선언한 속성이나 메소드를 사용하기 위해서는

해당 클래스의 인스턴스를 우선적으로 생성한 후 접근해야 한다. 

 

하지만 static으로 속성이나 메서드를 선언한다면?

해당 클래스의 인스턴스를 생성하지 않더라도 호출이 가능하다. 

즉, 항상 일정한 값을 갖기 때문에 인스턴스 생성이 없더라도 사용할 수 있게끔 만들어진 것!

heap으로 선언하면 연산이 실행되는 순간 메모리가 할당된다.
또한 heap영역은 Garbage Collector에 의해 정리가 된다.
따라서 main 메소드는 기본 프로그램이므로 gc에 의해 정리되지 않도록 static으로 선언되어야 한다.

 

만약 main에 static이 없다면?

JVM은 어떤 생성자를 사용할지 모르기 때문에 딜레마에 빠지게 된다. 아래의 예시를 참고하자.

public class MyApp {
    private String appName;
    private int version;
    
    // 생성자 1: 기본 생성자
    public MyApp() {
        this.appName = "Default App";
        this.version = 1;
    }
    
    // 생성자 2: 매개변수가 있는 생성자
    public MyApp(String appName) {
        this.appName = appName;
        this.version = 1;
    }
    
    // 생성자 3: 두 개 매개변수 생성자
    public MyApp(String appName, int version) {
        this.appName = appName;
        this.version = version;
    }
    
    // static이 없는 main (가정)
    public void main(String[] args) {
        System.out.println("Hello from " + appName);
    }
}

 

위와 같은 MyApp 내에 성질이 다른 생성자 3개와 static이 없는 main이 있다고 가정해보자.

여기서 JVM이 해야 할 일 은 다음과 같다.

1. MyApp 클래스를 찾았다

2. main 메서드를 찾았다 (하지만 static이 아니다)

3. main을 호출하려면 객체가 필요하다

4. 객체를 만들려면 생성자를 호출해야 한다

5. 어떤 생성자를 호출해야 되는 걸까..?

// 선택지 1: 기본 생성자?
MyApp app1 = new MyApp();

// 선택지 2: 문자열 받는 생성자? 그럼 뭘 전달해야 하나?
MyApp app2 = new MyApp("뭘 넣지???");

// 선택지 3: 두 매개변수 생성자? 역시 뭘 전달해야 하나?
MyApp app3 = new MyApp("???", 999);

 

 

따라서 에러 발생 등 여러 혼란을 야기할 수 있기 때문에, static을 사용하여 간단하게 이 문제를 해결할 수 있다.

public class SimpleApp {
    private String appName;
    private DatabaseConnection db;
    
    // 생성자는 여러 개여도 상관없음
    public SimpleApp() { /* 복잡한 초기화 */ }
    public SimpleApp(String name) { /* 또 다른 복잡한 초기화 */ }
    public SimpleApp(String name, String dbUrl) { /* 더 복잡한... */ }
    
    // static main: JVM이 고민할 필요 없음!
    public static void main(String[] args) {
        // 개발자가 직접 어떤 생성자를 사용할지 결정
        SimpleApp app;
        
        if (args.length == 0) {
            app = new SimpleApp(); // 기본 생성자 선택
        } else if (args.length == 1) {
            app = new SimpleApp(args[0]); // 이름만 전달
        } else {
            app = new SimpleApp(args[0], args[1]); // 이름과 DB URL 전달
        }
        
        app.run(); // 실제 애플리케이션 로직 실행
    }
    
    public void run() {
        System.out.println("애플리케이션 실행 중...");
    }
}

위 클래스에서 JVM의 작업 순서는 다음과 같다.

1. SimpleApp 클래스를 로딩한다

2. "main"이라는 이름의 static 메서드를 찾는다

3. 시그니처 확인: public static void main(String[])

4. 객체 생성 없이 바로 메서드를 호출: SimpleApp.main( ~~ )

5. 끝

 

3. Void

void는 return 값이 없다는 의미이다. 

main에서 void를 사용하는 이유는 main이 마지막으로 실행되는 메서드이기 때문이다.

즉, main 메서드가 종료되면 프로그램도 그대로 종료된다.

 

더 실행할 메서드가 없기 때문에 main은 반환값이 필요하지 않다.

따라서 어떠한 반환값도 return하지 않도록 하기 위해 void로 선언하는 것이다. 

 

4. String[] args

JVM의 문서를 보면 다음과 같이 설명한다.

"JVM은 특정 클래스의 메인 메서드를 호출함으로써 프로그램 실행을 시작하는데, 이때 String 배열 타입의 인자 하나를 전달한다." 

 

main 메서드도 다른 매개변수를 가진 함수와 마찬가지로 String 배열 타입의 args라는 매개변수를 가진다는 의미이다.

 

하지만 요즘엔 main 메서드에 문자열을 전달할 일이 사실상 없기 때문에... 구 시대의 흔적이라고 이해하면 될 것 같다.

반응형

'개발 > java' 카테고리의 다른 글

[Java] JPA란?  (1) 2026.03.20
[Java] 게시판 만들기 - 3  (0) 2025.09.14
[Java] 게시판 만들기 - 2  (0) 2025.09.08
[Java] 게시판 만들기 - 1  (0) 2025.09.07
[Java] 게시판 만들기 - 0  (0) 2025.09.07
'개발/java' 카테고리의 다른 글
  • [Java] 게시판 만들기 - 3
  • [Java] 게시판 만들기 - 2
  • [Java] 게시판 만들기 - 1
  • [Java] 게시판 만들기 - 0
danieLee
danieLee
개발일지
  • danieLee
    Code log
    danieLee
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • 개발 (76)
        • C++ (3)
        • java (6)
        • JavaScript (9)
        • python (0)
        • AWS (2)
        • Docker (6)
        • git (0)
        • 백엔드 (4)
        • Spring (7)
        • Django (2)
        • AI (3)
        • 코테 준비 (13)
        • 알고리즘 (6)
        • SKALA 4기 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    4기
    백엔드
    개념
    JavaScript
    서버
    파이썬
    개발자
    java
    Ai
    프로그래머스
    API
    코테
    프론트
    대학생
    spring
    js
    vue.js
    skala
    개발
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.1
danieLee
[Java] main method 분석
상단으로

티스토리툴바