28.1.3 rclcpp 및 rclpy 노드 클래스의 다형성 확립을 위한 상속 모델
ROS2 프레임워크는 로봇 애플리케이션의 모듈화 및 재사용성을 보장하기 위해 객체 지향 프로그래밍(OOP, Object-Oriented Programming) 패러다임을 선도적으로 채택하였다. 특히, C++ 기반의 rclcpp API와 Python 기반의 rclpy API는 로봇 제어 소프트웨어의 핵심 논리를 캡슐화하기 위해 노드(Node) 클래스의 상속 모델을 강제한다. 이 상속 모델은 콜백 계층, 생명주기(Lifecycle) 관리 체계, 비동기 이벤트 핸들링 메커니즘의 다형성(Polymorphism)을 확립하는 기술적 기반이 된다.
1. rclcpp 아키텍처 기반의 상속 체계와 다형성
C++ 언어 규격에 기반한 rclcpp는 rclcpp::Node 클래스를 최상위 계층으로 하는 상속 트리를 구성한다. 응용 프로그래머는 이 기본 클래스를 퍼블릭(Public) 상속하여 사용자 정의 로직이 포함된 파생 클래스(Derived Class)를 구현한다.
이 상속 아키텍처는 노드의 생성자(Constructor) 내에서 초기화 리스트(Initialization List)를 통해 부모 클래스의 생성자를 호출하며, 노드의 고유 명칭과 네임스페이스를 할당한다. rclcpp::Node가 제공하는 멤버 함수들은 퍼블리셔(Publisher), 서브스크라이버(Subscriber), 타이머(Timer) 등의 자원을 할당하기 위한 팩토리 메서드 모음으로 기능한다. 다형성의 관점에서, 개발자는 사용자 정의 클래스의 멤버 변수로 분산 자원에 대한 스마트 포인터(std::shared_ptr)를 선언하고, 콜백 함수를 멤버 메서드로 오버라이딩(Overriding) 또는 바인딩(Binding, std::bind 등)하여 런타임 다형성을 구현한다. 이는 메모리 누수 방지와 스레드 안전성(Thread-safety)을 보장하는 현대 C++ 설계 원칙을 준수한다.
2. rclpy 아키텍처 기반의 상속 체계와 동적 바인딩
Python을 기반으로 하는 rclpy 프레임워크는 rclpy.node.Node 클래스의 상속을 통해 노드의 상태와 행위를 정의한다. Python의 동적 타이핑(Dynamic Typing) 특성에 의해 C++의 엄격한 가상 함수 테이블(vtable) 제약에서는 자유로우나, 객체 지향적 상속 모델을 통한 다형성 구현의 원칙은 동일하게 적용된다.
사용자 정의 파생 클래스는 super().__init__('노드명')을 통해 기반 클래스를 초기화하며, 인스턴스 변수(Instance Variable)를 확장하여 토픽 통신에 필요한 콜백 주소 및 연산을 은닉한다. 이 방식은 분산 시스템 내에서 개별 컴포넌트들이 자체적인 데이터 상태(Data State)를 유지하면서도 비동기 콜백을 안전하게 구동할 수 있도록 지역 스코프(Local Scope)를 형성한다. 또한 실행 시점(Runtime)에 생성된 컴포넌트는 단일 실행자(Executor) 혹은 다중 스레드 실행자(Multi-threaded Executor)에 의해 투명하게 스케줄링되므로 아키텍처의 유연성이 보장된다.
3. 의존성 주입과 단일 책임 원칙(SRP) 관점에서의 학술적 의의
이러한 상속 및 다형성 모델의 도입은 컴포넌트 기반 소프트웨어 공학의 단일 책임 원칙(SRP, Single Responsibility Principle)을 확립하는 중요한 기제이다. 전역 변수(Global Variable) 또는 절차적 프로그래밍(Procedural Programming) 패러다임이 내포하는 결합도(Coupling) 상승 문제를 근본적으로 차단하며, 응급 논리와 하드웨어 제어 논리를 클래스별로 명확하게 분리할 수 있다.
더 나아가, 노드 클래스 상속은 의존성 주입(Dependency Injection)과 컴포지션(Composition) 패턴을 손쉽게 결합할 수 있는 아키텍처를 제공한다. ROS2 컴포넌트 컨테이너(Component Container)는 공유 라이브러리로 컴파일된 이러한 파생 클래스들을 동적으로 적재(Dynamic Loading)하여 동일 프로세스 내에서 제로 카피(Zero-copy) 전송을 극대화한다. 즉, rclcpp와 rclpy의 상속 트리는 단순히 코드의 길이를 줄이는 템플릿의 역할을 넘어, 대규모 분산 자율 비행 시스템의 신뢰성과 실시간성을 뒷받침하는 핵심 구조적 해법이다.