본문 바로가기

JAVA

[Java] Main 문

공부를 하다 문득 main문에 대해 궁금해졌다. 사실 이제서야 이런 의문을 가지고 찾아본게 부끄럽다. 반성하겠다.

지금까지 코딩을 하면서도 그냥 생각없이 코드를 작성하기에 급급했는데, 이제는 조금 더 여유를 가지고 궁금증이 생기는 것들에 대해 탐구하고 정리해보려 한다.

 

갖게된 의문점은 아래와 같다.

  1. 왜 main문 안에다가 실행 코드들을 작성해야 하지?
  2. main의 매개변수 (String[] args) 는 뭘 의미하는거지
  3. 1번의 이유가 2번이랑 연관이 있나?

 

1. 왜 main 메소드를 사용하는 것인가?

 자바에서 main 메소드는 프로그램 실행의 시작점(entry point) 역할을 한다. 즉, 프로그램이 실행되면 JVM(Java Virtual Machine)이 가장 먼저 호출하는 메소드가 main.

 

예를 들어,

public class Example {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

여기서 프로그램을 실행하면 JVM은

  • 먼저 Example 클래스를 찾고
  • 이 클래스 내부에 있는 main 메소드를 호출해서 실행을 시작.

즉, 프로그램의 첫 번째 코드가 실행되는 지점이 main 메소드

 

2. main 의 매개변수 (String[] args) 의 의미?

 프로그램 실행 시 전달되는 명령줄 인수(Command Line Arguments) 를 저장하는 배열

이는 사실 Intellij 나, 다른 IDE에서 프로그램을 실행시킬 때는 해당되지 않는다. (설정을 하면 변경 가능하긴 함)

 

예를 들어,

public class Example {
    public static void main(String[] args) {
        System.out.println("Number of arguments: " + args.length);
        for(int i=0; i<args.length; i++) {
            System.out.println("Argument " + i + ": " + args[i]);
        }
    }
}

 

위 코드에서 명령줄 인수를 확인하려면, 아래와 같이 터미널에서 java 프로그램을 실행시켜야 한다.

java Example Hello World 123

 

- 결과

Number of arguments: 3
Argument 0: Hello
Argument 1: World
Argument 2: 123

 

명령줄에서 Hello, World, 123을 입력했기 때문에 args 배열에는 {"Hello", "World", "123"} 이 저장

 

따라서, IntelliJ에서 실행시킬 때는 String[] args 배열에 아무것도 없는 상태로 실행된다.

 

그럼 왜 사용하는 걸까?

-> 프로그램이 실행될 때 외부에서 초기값, 파일명, 설정값 같은 정보를 전달해줄 수 있다.

java Example input.txt output.txt
public class Example {
    public static void main(String[] args) {
        String inputFile = args[0];  // input.txt
        String outputFile = args[1]; // output.txt

        System.out.println("입력 파일: " + inputFile);
        System.out.println("출력 파일: " + outputFile);
    }
}

위와 같이 입력값을 바꿀 수 있다.

 

결론

자바 프로그램의 모든 코드가 main 메소드 중심으로 실행되는 이유는
자바의 설계상 프로그램 시작점이 main 메소드로 정해져 있기 때문,
String[] args는 프로그램이 시작될 때 외부 데이터를 받기 위함.

'JAVA' 카테고리의 다른 글

[Java] JUnit 테스트 코드 메서드 정리  (0) 2025.03.20
[Java] ConcurrentHashMap 정리  (0) 2025.03.19
[Java] Stream API  (0) 2025.01.08
[Java] 컬렉션 프레임워크  (1) 2025.01.08
[JAVA] 스트림(stream) 정리  (0) 2024.09.19