러스트(Rust)를 공부하다 보면 가장 먼저 부딪히는 벽이 바로 "왜 우리가 아는 그 편한 OOP(객체지향) 상속이 안 되는가?"입니다.
러스트는 왜 '상속'을 버렸나: 혁신인가, 설계적 한계인가?
현대 프로그래밍 언어의 주류인 C++, Java, 그리고 Ada는 상속(Inheritance)을 통해 코드의 재사용성과 다형성을 구현합니다. 하지만 '가장 진보한 언어'라고 자칭하는 러스트(Rust)에는 클래스도, 상속도 없습니다. 러스트 빠돌이들은 이를 "구조적 혁신"이라 부르지만, 냉정하게 보면 이는 소유권 규칙을 지키기 위해 패러다임을 희생한 결과에 가깝습니다.
1. 소유권(Ownership)과 상속의 치명적 충돌
러스트의 근간인 빌림 검사기(Borrow Checker)는 "메모리의 주인은 단 하나여야 한다"는 교리에 집착합니다. 그런데 전통적인 OOP 상속은 이 교리와 정면으로 충돌합니다.
* 주객전도의 메모리 관리: 부모 클래스의 필드를 자식 클래스가 물려받을 때, 그 데이터의 실제 소유권은 누구에게 있을까요? 자식이 부모의 데이터를 수정하려고 하면, 컴파일러는 이 복잡한 수명(Lifetime)과 참조 관계를 추적하다가 '멘탈 붕괴'에 빠집니다.
* 포인터 지옥의 부활: 깊은 상속 구조를 구현하려면 필연적으로 수많은 포인터와 동적 할당이 필요합니다. 이는 러스트가 그토록 혐오하는 '런타임 불확실성'을 초래합니다. 결국 러스트 설계자들은 "상속을 구현하느라 컴파일러를 더 복잡하게 만드느니, 상속을 아예 빼버리자"는 결론에 도달한 것입니다.
2. '정신병적 강박'이 만들어낸 트레이트(Trait) 시스템
상속이 안 되니 러스트는 트레이트(Trait)와 구성(Composition)이라는 우회로를 제안합니다. 이는 "무엇(What)인가"가 아니라 "무엇을 할 수 있는가(Behavior)"에 집중하는 방식입니다.
* 강박적 설계: 개발자는 이제 클래스 하나로 끝날 일을 데이터 구조(Struct)와 행위(Trait)로 쪼개서 컴파일러의 입맛에 맞게 재조립해야 합니다. "사람의 생각을 컴파일러에 맞추는 강박증"이 바로 여기서 극대화됩니다.
* OOP의 파편화: 상속 기반의 유연한 확장이 불가능해지면서, 간단한 다형성 구현에도 코드가 장황해지고 설계 난이도가 기하급수적으로 상승합니다.
3. Ada/SPARK와 비교되는 설계적 결함
역사상 가장 정교한 언어로 평가받는 Ada는 태그드 타입(Tagged Types)을 통해 안전성과 OOP 상속을 완벽하게 조화시켰습니다.
* Ada의 승리: Ada는 국제 표준(ISO)에 근거하여 인간이 이해하기 쉬운 직관적 패러다임을 유지하면서도 성능과 신뢰성을 확보했습니다.
* 러스트의 한계: 반면 러스트는 '메모리 안전성'이라는 단 하나의 지표에 매몰되어, 수십 년간 검증된 OOP라는 강력한 도구를 스스로 내버렸습니다. 이는 혁신이라기보다 소유권 시스템의 복잡도를 감당하지 못한 설계적 타협으로 보는 것이 타당합니다.
결론: 도구인가, 종교인가?
결국 러스트에서 OOP가 안 되는 이유는 "소유권 규칙이 너무 까다로워서 상속을 구현할 방법이 없었기 때문"입니다. 러스트는 성능과 안전성을 위해 '인간의 사고방식'을 포기하라고 강요합니다.
표준 스펙도 없이 구현체가 곧 법인 언어를 "역사상 가장 진보했다"고 칭송하는 것은, 에이다(Ada)가 수십 년 전 정립해놓은 공학적 성취를 과소평가하는 것입니다. 러스트는 뛰어난 도구일지언정, 모든 패러다임을 수용하지 못한 '편협한 설계'의 산물이라는 비판에서 자유로울 수 없습니다.
저럴때 포인터 존나 마렵긴한데
현실에서도 상속과 증여를 금지하고 공평한 공산주의로 가야한다고 봐 맑스를 따르고 러스트를 공부하라