프로그래밍C++ 개발자

C++에서 구성(composition)을 통한 책임 위임(delegation)이란 무엇입니까? 구성은 상속과 어떻게 다르며 각각의 접근 방식을 언제 사용해야 합니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

구성을 통한 책임 위임은 객체 지향 프로그래밍에서 클래스의 객체가 다른 클래스(또는 클래스)의 객체를 포함하고 이를 사용하여 자신의 논리의 일부를 구현하는 프로그래밍 관행입니다. 이는 그들의 인터페이스를 상속하는 대신에 사용됩니다.

질문의 역사

초기 객체 지향 프로그래밍은 상속을 강조했지만, 시간이 지나면서 구성은 더 큰 유연성, 확장성, 그리고 구성 요소 간의 결합도를 감소시킨다는 것이 증명되었습니다.

문제

상속은 객체를 강하게 결합합니다: 기본 클래스의 변경은 모든 자식 클래스에 영향을 미치고, 계층구조가 복잡해지며, 아키텍처가 취약해집니다. 구성은 이러한 문제를 해결하고 더 신뢰할 수 있고 유지 보수가 용이한 시스템을 구축할 수 있게 합니다.

해결책

C++에서 위임은 한 클래스의 객체를 다른 클래스의 멤버로 포함함으로써 구현됩니다. 래퍼 클래스에서는 포함된 객체의 메소드를 호출합니다.

코드 예:

class Logger { public: void log(const std::string& msg) { std::cout << msg << std::endl; } }; class FileProcessor { Logger logger; // 구성 public: void process(const std::string& filename) { logger.log("Processing file: " + filename); // ... } };

주요 특징:

  • 더 약한 결합도, 유연성
  • 위임 객체를 런타임에 변경할 수 있는 가능성
  • 테스트 및 유지 보수가 더 쉬움

함정 질문.

구성이 상속을 완전히 대체할 수 있습니까?

아니요, 상속은 "is-a" 관계가 필요한 곳에서 필요하고, 구성은 "has-a" 관계에서 필요합니다. 예를 들어, Button은 Widget을 상속하고, Car는 Engine을 "가지고 있습니다" (구성).

구성에서 위임 메소드의 동작을 변경할 수 있습니까?

네, 위임 메소드는 원래 클래스를 건드리지 않고 조정할 수 있습니다. 또한 동적으로 위임 객체를 변경할 수도 있습니다 (예: 포인터나 유일 포인터를 통해).

구성이 상속보다 느립니까?

아니요, 대부분의 경우 성능 차이가 없습니다. 때때로 상속은 가상 호출(vtable)로 인해 비용이 추가되지만, 구성은 단지 객체의 크기만 증가시킵니다.

일반적인 실수와 안티 패턴

  • 충분히 구성으로 대체할 수 있는 곳에서 상속 사용
  • 불필요하게 중첩 객체로 구성 복잡성 증가
  • 많은 단편화된 의존성으로 클래스 "비대화"

실생활 예

부정 사례

프로젝트의 모든 대화 상자가 공통 DialogWindow를 상속했습니다. 새로운 비즈니스 로직을 추가하면 모든 자식의 코드가 작동하지 않게 되었습니다.

장점:

  • 초기 빠른 생성
  • 코드 재사용

단점:

  • 강한 구조
  • 어떤 변경도 전체 트리에 영향을 미침

긍정 사례

공통 기능이 별도의 클래스(로깅, 검증)로 분리되어 있으며, 이는 각 대화 상자에 구성으로 삽입됩니다.

장점:

  • 유연성
  • 동작 교체 용이

단점:

  • 추가 설계 필요
  • 과도한 세부 사항으로 이어질 수 있음