본문 바로가기
Java

[Java] 자바 메인 함수(Main Function)

by clolee 2025. 3. 24.

자바에서 메인 함수(Main Function)는 자바 프로그램의 시작 지점을 의미합니다. 자바 프로그램을 실행하면 가장 먼저 호출되는 함수가 바로 main() 함수입니다.
아래는 자바의 기본적인 메인 함수 선언입니다:


  
public static void main(String[] args) {
// 프로그램의 시작 지점
}

코드를 구성하는 각 키워드와 의미 설명

🔍 1. public

  • 접근 제어자입니다.
  • public으로 지정하면 어디서든 접근 가능하다는 의미입니다.
  • 자바 프로그램을 실행하는 자바 런타임(JVM)은 외부에서 이 main() 함수를 호출하기 때문에 반드시 public이어야 합니다.
    → private이나 protected, 아무것도 안 쓰면 실행되지 않음.

🔍 2. static

  • static은 클래스 로딩 시 함께 메모리에 올라가는 키워드입니다.
  • 객체를 생성하지 않고도 사용할 수 있게 합니다.
  • 자바 프로그램이 시작할 때 아직 main() 함수가 포함된 클래스의 객체가 만들어지지 않았기 때문에, 객체 없이 바로 실행 가능하게 하기 위해 static이 필요합니다.

🔍 3. void

  • 반환값이 없음을 나타냅니다.
  • main() 함수는 프로그램을 시작할 뿐, JVM에게 어떤 값을 반환하지 않기 때문에 void를 사용합니다.

🔍 4. main

  • 자바에서 정해진 프로그램의 시작 이름입니다.
  • 이름이 반드시 main이어야 합니다.
    다른 이름으로 바꾸면 자바 프로그램의 진입점이 없어 오류 발생합니다.

🔍 5. String[] args

  • 커맨드라인(명령줄)에서 전달되는 **인자(argument)**를 배열로 받습니다.
  • 예: java MyClass Hello World라고 실행하면
    → args[0] = "Hello"
    → args[1] = "World"

이걸 통해 외부에서 입력값을 받을 수 있습니다.


✅ 예제: 메인 함수와 명령줄 인자 사용


  
public class HelloWorld {
public static void main(String[] args) {
System.out.println("프로그램 시작!");
if (args.length > 0) {
System.out.println("명령줄 인자:");
for (int i = 0; i < args.length; i++) {
System.out.println("args[" + i + "] = " + args[i]);
}
} else {
System.out.println("명령줄 인자가 없습니다.");
}
}
}

실행:


  
java HelloWorld Java OOP

출력:


  
프로그램 시작!
명령줄 인자:
args[0] = Java
args[1] = OOP

💡 정리: 메인 함수 구조 기억법

구성 요소  설명
public 외부(JVM)에서 접근 가능하게 함
static 객체 없이도 실행 가능하게 함
void 반환값이 없음
main 프로그램의 시작 지점
String[] args 외부에서 입력되는 문자열 인자들

main()함수 프로젝트와 패키지 구조 속 진입점 관리

자바에서는 클래스마다 main() 함수를 여러 개 만들 수 있고,
패키지마다, 혹은 한 프로젝트 내 여러 클래스에 각각 main() 함수가 있어도 무방합니다.

하지만… 중요한 건 "어떤 main()을 실행할 것인지"는 JVM 실행 시 지정한 클래스 기준이라는 점.

✅ 예시: 여러 개의 main() 함수


  
// src/main/java/com/example/MainA.java
package com.example;
public class MainA {
public static void main(String[] args) {
System.out.println("MainA 실행");
}
}

  
// src/main/java/com/example/sub/MainB.java
package com.example.sub;
public class MainB {
public static void main(String[] args) {
System.out.println("MainB 실행");
}
}

실행:

  • MainA 실행:
  • java com.example.MainA
  • MainB 실행:
  • java com.example.sub.MainB

📌 단, 두 클래스를 동시에 JVM 하나에서 동시에 실행할 수는 없고,
어떤 클래스를 실행할지는 직접 지정해야 합니다.

✅ IDE에서는?

Eclipse, IntelliJ 같은 IDE에서는
각 main 함수가 있는 클래스에 대해 ‘Run’ 버튼이 따로 생깁니다.
→ 여러 개의 main()이 있어도 문제 없이 관리 가능!

✅ 그럼 왜 하나만 쓰는 경우가 많을까?

  • 실제 프로덕션(서비스용 애플리케이션)에서는 하나의 진입점이 필요하기 때문입니다.
  • 예를 들어:이럴 땐 META-INF/MANIFEST.MF에 명시된 Main-Class의 main() 함수가 실행됩니다.
  • java -jar MyApp.jar

그래서 실무에서는 보통 하나의 main() 진입점을 중심으로 애플리케이션이 실행되지만,
테스트나 예제용으로는 여러 개의 main 함수가 공존 가능합니다.

✅ 정리

항목  설명
main() 함수 개수 클래스마다 각각 존재 가능 (무제한)
실행 방식 java 클래스명으로 지정
IDE 지원 각 main 함수별로 실행 가능
jar 파일 실행 Main-Class에 지정된 하나만 실행됨
실무에서는 일반적으로 하나만 사용 (Entry Point)

 

댓글