프로그래밍 언어를 처음 배우다 보면 C 언어와 Java의 main 함수 형태가 서로 다른 것을 알게 됩니다. 특히 C에서는 int main(void)로 시작하고, Java에서는 public static void main(String[] args)로 작성됩니다. 두 언어의 철학과 실행 환경의 차이로 인해 이러한 차이가 발생합니다. 이번 글에서는 C와 Java에서 main 함수가 각각 어떤 의미를 가지는지, 왜 형태가 다른지 자세히 살펴보겠습니다.

C 언어에서 main 함수가 int인 이유
1. 프로그램의 종료 상태를 운영체제에 반환
C 언어는 시스템 프로그래밍 언어로, 프로그램이 운영체제에서 직접 실행됩니다. int main()의 반환값은 운영체제에 프로그램의 종료 상태를 전달하는 역할을 합니다.
- return 0;: 프로그램이 정상적으로 종료되었음을 의미합니다.
- return 값이 0이 아닌 경우: 비정상적인 종료를 나타냅니다.
운영체제는 이 반환값을 활용해 프로그램이 성공적으로 실행되었는지, 아니면 오류가 발생했는지 확인할 수 있습니다.
2. POSIX 및 C 표준
C 표준에 따르면 main 함수는 반드시 아래 형식 중 하나를 가져야 합니다:
- int main(void)
- int main(int argc, char *argv[])
이 규칙은 OS와의 호환성을 유지하기 위함입니다. 특히 argc와 argv는 명령줄 인수를 처리하는 데 사용됩니다.
Java에서 main 함수가 String[] args인 이유
1. JVM(Java Virtual Machine)의 관점
Java는 운영체제에서 직접 실행되지 않고, JVM 위에서 실행됩니다. JVM은 프로그램 시작 시 main 함수에 명령줄 인수를 전달합니다. 이를 위해 String[] args라는 배열을 사용합니다.
2. 입력 인수 처리
String[] args는 명령줄 인수를 받을 수 있도록 설계되었습니다. 예를 들어, 명령줄에서 아래와 같이 실행한다고 가정합니다:
java MyProgram arg1 arg2
이 경우, args 배열에는 {"arg1", "arg2"}가 저장됩니다. 이를 통해 프로그램 실행 시 다양한 설정이나 데이터를 외부에서 전달할 수 있습니다.
3. 반환값이 없는 이유
Java에서는 프로그램의 종료 상태를 JVM이 관리합니다.
- 따라서 main 함수가 반환값을 가질 필요가 없습니다.
- 프로그램 종료 시 System.exit()를 사용하여 종료 상태를 명시적으로 설정할 수 있지만, 대부분의 경우 JVM이 이를 자동으로 처리합니다.
C와 Java의 철학적 차이
- C 언어는 운영체제와 밀접하게 작동하는 시스템 프로그래밍 언어로, 프로그램의 종료 상태를 운영체제에 반환해야 합니다.
- Java는 플랫폼 독립적인 언어로, JVM 위에서 실행되며, 프로그램의 시작과 종료를 JVM이 관리합니다. 따라서 반환값이 필요하지 않습니다.

함수 형태 | int main(void) | public static void main(String[] args) |
반환값 | 프로그램 종료 상태를 반환 (int) | 반환값 없음 (void) |
명령줄 인수 처리 | argc, argv | String[] args |
종료 상태 관리 | 개발자가 직접 반환 | JVM이 자동 관리 |
C와 Java는 설계 철학과 실행 환경이 다르기 때문에 main 함수의 형태도 달라집니다. 이를 이해하면 두 언어의 차이를 명확히 파악하고, 각각의 특징을 활용한 프로그래밍이 가능해집니다.