main() 하나로 볼 수 있는 언어의 철학
프로그래밍 언어의 성격은 의외로 사소한 문법 차이에서 드러납니다. 자바(Java)와 C++을 가르는 대표적인 예가 바로 프로그램의 시작점인 main() 메서드의 위치입니다.
자바에서는 main() 메서드 역시 반드시 클래스 내부에 작성해야 합니다. 반면 C++에서는 main()이 클래스 바깥에 독립된 함수로 존재하며, 애초에 클래스를 정의하지 않고도 프로그램을 작성할 수 있습니다.
자바: 클래스 없이는 아무것도 할 수 없다
자바에서는 모든 코드가 클래스 안에 속해야 한다는 것이 기본 규칙입니다. 실행의 출발점인 main() 메서드조차 예외가 아닙니다.
그렇다면 객체를 한 번도 만들지 않았는데 어떻게 main()이 실행될 수 있을까요? 여기서 핵심 역할을 하는 것이 바로 static 키워드입니다.
static 키워드가 하는 일
static으로 선언된 멤버는 객체(인스턴스)가 아니라 클래스 자체에 소속됩니다. 덕분에 JVM(자바 가상 머신)은 프로그램 시작 시 객체 생성 과정 없이 곧바로 해당 클래스의 main() 메서드를 호출해 실행을 시작할 수 있습니다.
즉, "객체 없이 실행된다"는 사실과 "클래스 없이는 존재할 수 없다"는 사실이 공존하는 것이 자바의 구조입니다.
C++: 객체 지향은 선택 사항
C++는 절차 지향 프로그래밍과 객체 지향 프로그래밍을 모두 지원하는 다중 패러다임 언어입니다. main() 함수가 클래스 외부에 자유롭게 존재할 수 있고, 클래스를 전혀 사용하지 않은 C 스타일의 코드도 문제없이 컴파일되고 실행됩니다.
이런 유연함은 C++의 강점이지만, 동시에 "언어 차원에서 객체 지향을 강제하지 않는다"는 의미이기도 합니다. 그래서 C++는 흔히 순수(pure) 객체 지향 언어로 분류되지 않습니다.
그렇다면 자바는 '완전한' 객체 지향 언어일까?
"모든 코드가 클래스 안에 있어야 한다"는 점만 놓고 보면, 자바가 C++보다 훨씬 철저하게 객체 지향 구조를 따른다는 것은 분명합니다. 실제로 자바를 완전한(complete) 객체 지향 언어라고 소개하는 경우도 많습니다.
다만 엄밀히 따지면 이 부분에는 논쟁의 여지가 있습니다. 자바에는 int, char, double 같은 원시 타입(primitive type)이 존재하고, static 멤버 역시 객체가 아닌 클래스 수준에서 동작하기 때문입니다. 이런 요소들은 객체가 아닌 존재이므로, "자바조차 100% 순수한 객체 지향 언어는 아니다"라는 지적이 적지 않습니다. 참고로 순수 객체 지향 언어의 대표적인 예로는 Smalltalk가 꼽힙니다.
정리
두 언어의 차이를 한눈에 정리하면 다음과 같습니다.
· 자바: main()조차 클래스 안에 있어야 하며, static 덕분에 객체 생성 없이 실행할 수 있다.
· C++: main()은 클래스 밖의 함수이며, 클래스 사용 여부조차 개발자의 선택이다.
· 결론: C++는 객체 지향을 '선택'할 수 있는 언어이고, 자바는 구조 자체가 클래스 기반을 '강제'한다. 다만 원시 타입 등의 이유로 자바를 100% 순수 객체 지향 언어라고 보기는 어렵다는 시각도 존재한다.