[Java] Java 프로그램 기본 구조 이해하기: main 메서드, 클래스 선언

Java를 배우는 사람이라면, 다음과 같은 코드를 처음 마주하게 됩니다.

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

이 글에서는 위 Java 코드의 각 구성요소가 어떤 역할을 하는지를 포스팅하겠습니다.


1. 자바는 "클래스 기반" 언어입니다

Java의 모든 코드는 반드시 클래스 안에 들어가야 합니다. 이것은 Java가 객체 지향 언어(Object-Oriented Programming, OOP)라는 점에서 비롯된 핵심 원칙입니다.

public class HelloWorld { ... }

여기서 HelloWorld는 클래스 이름입니다.

이 클래스 안에 실제로 실행할 코드(메서드, 변수 등)를 작성하게 됩니다.

💡 클래스 이름은 자바 파일 이름과 반드시 같아야 하고, 대소문자를 구분합니다.
예: HelloWorld.java 파일 안에는 public class HellWorld가 있어야 합니다.

 

2. main() 메서드는 자바 프로그램의 시작점입니다

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

Java는 단독 실행 파일이 아니라 JVM이 작동하면서 코드를 해석해 실행합니다.

이때 JVM은 반드시 main() 메서드를 찾아 실행하기 때문에, 자바 프로그램을 만들라면 꼭 이 main() 메서드가 있어야 해요.

각 키워드 설명:

  • public
    다른 클래스나 JVM이 이 메서드에 접근할 수 있도록 공개함
  • static
    객체를 생성하지 않아도 실행할 수 있도록 설정
  • void
    이 메서드는 값을 반환하지 않음
  • main
    자바 프로그램의 시작점. 반드시 이 이름이어야 함
  • String[] args
    프로그램 실행 시 외부에서 문자열 형태의 값을 전달받기 위한 매개변수 배열
💡 main() 메서드에 static 키워드가 필요한 이유는 JVM이 프로그램의 진입점을 객체 생성 없이 호출해야 하기 때문이에요.
JVM은 프로그램 시작 시 클래스 로더를 통해 지정된 클래스를 로딩하고, 해당 클래스 내에서 미리 정의된 진입점 메서드인 public static void main(String[] args)를 호출해요. 이 메서드는 인스턴스 레벨이 아닌 클래스 레벨에서 호출되어야 하므로, static으로 선언되어야 해요. 만약 main() 메서드가 static이 아니라면, JVM은 해당 메서드를 호출하기 위해 먼저 클래스의 인스턴스를 생성해야 해요. 그러나 이 시점에서는 프로그램 실행이 시작되지 않았기 때문에, 객체를 생성할 경로(예: 생성자 호출)를 알 수 없고, 실행 환경도 아직 초기화되지 않은 상태라 main()을 호출할 수 없어요.

 

3. System.out.println()은 콘솔에 출력하는 명령입니다

System.out.println("Hello World!");

메서드 내부에 작성된 System.out.println()은 콘솔에 내용을 출력하는 명령어에요.

  • System: 자바에서 제공하는 기본 클래스 중 하나
  • out: System 클래스의 표준 출력 스트림 객체
  • println(): 문자열을 출력한 후 줄바꿈을 해주는 메서드

 

4. String[] args는 외부 입력을 받기 위한 매개변수 입니다

main() 메서드의 괄호 안에 있는 String[] args는 자바 프로그램 실행 시 외부에서 값을 전달받기 위한 통로입니다.

여기서 String[]은 문자열 배열을 의미하고, args는 그 배열의 이름이에요. 즉, 프로그램을 실행할 때 함께 넘긴 인자(argument)들이 이 배열에 담기게 됩니다.

public static void main(String[] args)

이 부분이 없으면 JVM이 프로그램을 정상적으로 시작할 수 없으며, 반드시 이 구조를 따라야 합니다.

 

✔ 예를 들어보겠습니다

public class HelloUser {
    public static void main(String[] args) {
        System.out.println("첫 번째 인자: " + args[0]);
    }
}

이 코드를 컴파일하고 실행할 때, 다음처럼 명령줄에서 인자를 넘길 수 있어요:

java HelloUser 주인

그러면 출력 결과는 다음과 같습니다:

첫 번째 인자: 주인

여기서 "주인"은 JVM이 args에 담아서 main()에 전달한 것이죠.


자바의 기본 구조는 다른 언어를 다뤄본 사람에겐 다소 낯설고 복잡하게 느껴질 수 있습니다. 하지만 이는 자바가 명확한 실행 흐름과 구조적 안정성을 갖추기 위해 설계된 결과입니다. 다음 글에서는 자바에서 데이터를 다루는 가장 기본 단위인 변수와 자료형에 대해 알아보겠습니다.