객체 지향 프로그래밍(OOP) 언어의 기본 특징으로는 상속(Inheritance), 캡슐화(Encapsulation), 다형성(Polymorphism)이 있습니다. 이 세 가지 특징을 완전하게 지원하는 언어를 객체 지향 프로그래밍 언어라고 부릅니다. C++는 이 세 가지 기능을 대부분 지원하지만 완벽하지 않기 때문에 '부분적인 객체 지향 언어'로 분류됩니다. 그렇다면 C++가 완전한 객체 지향 언어로 인정받지 못하는 이유는 무엇일까요?
C++가 완전한 객체 지향 언어가 아닌 이유
1. main() 함수가 클래스 외부에 존재
C++에서는 프로그램 실행을 위해 main() 함수가 필요하지만, 이 main 함수는 클래스 내부에 있지 않습니다. 따라서 C++에서는 클래스를 사용하지 않고도 코드를 작성할 수 있습니다. 반면 Java와 같은 일부 OOP 언어는 파일 이름과 동일한 클래스가 반드시 필요하며, main 함수도 해당 클래스 내부에 위치해야 합니다.
2. 전역 변수 사용 가능
C++에서는 전역 변수를 사용할 수 있으며, 전역 변수는 프로그램 어디에서든 접근이 가능합니다. 이는 데이터에 대한 완전한 은닉을 보장하지 못합니다. 접근과 수정을 제한할 수 없기 때문에 캡슐화가 부분적으로만 구현됩니다. 반면 Java에서는 변수를 클래스 내부에 선언하고 접근 제한자(access specifier)를 적용하여 데이터를 보호할 수 있습니다.
3. friend 함수의 존재
C++에는 friend(프렌드) 함수라는 개념이 있습니다. friend 함수를 사용하면 한 클래스의 private 및 protected 멤버에 외부에서 접근할 수 있습니다. 이는 정보 은닉이라는 객체 지향 언어(OOL)의 핵심 원칙을 위반하는 요소입니다. 참고로 Java는 friend 함수를 지원하지 않습니다.
결론
이처럼 C++는 객체 지향 개념을 상당 부분 지원하지만, main 함수의 클래스 외부 배치, 전역 변수 허용, friend 함수와 같은 요소들 때문에 순수한 객체 지향 언어라고 보기는 어렵습니다. 이러한 유연성은 오히려 C++가 절차적 프로그래밍과 객체 지향 프로그래밍을 모두 지원하는 하이브리드 언어임을 보여주는 특징이기도 합니다.