상속(Inheritance)이란?
C#에서 상속은 새로운 클래스가 기존 클래스의 멤버(필드, 메서드, 프로퍼티 등)를 물려받도록 지정하는 객체지향 프로그래밍의 핵심 개념입니다. 이때 멤버를 제공하는 기존 클래스를 기반 클래스(Base Class), 멤버를 물려받는 새 클래스를 파생 클래스(Derived Class)라고 부릅니다.
상속은 IS-A(~이다) 관계를 표현합니다. 예를 들어 '포유류는 동물이다', '개는 포유류이다'라는 관계가 성립하므로, 자연스럽게 '개는 동물이다'라는 관계도 도출할 수 있습니다.
실제 코드에서는 도형(Shape)이라는 기반 클래스 아래에 원(Circle), 사각형(Square), 직사각형(Rectangle) 같은 파생 클래스를 두는 방식으로 활용됩니다.
구성(Composition)이란?
구성은 한 객체가 다른 객체를 자신의 내부에 포함하는 설계 방식입니다. 구성 관계에서는 부모 객체가 삭제되면 그 안에 포함된 자식 객체도 함께 소멸합니다. 즉, 두 객체의 생명주기가 서로 긴밀하게 종속되어 있는 것이 특징입니다.
구성은 집합(Aggregation)의 특수한 형태로, PART-OF(~의 일부이다) 관계를 나타냅니다.
대표적인 예로 '자동차(Car)는 엔진(Engine)을 가진다'를 들 수 있습니다. 자동차가 폐차되어 파괴되면 그 엔진 역시 독립적으로 존재할 의미가 없어지므로 함께 파괴된다고 볼 수 있습니다.
코드 예제
public class Engine {
. . .
}
public class Car {
Engine eng = new Engine();
.......
}상속 vs 구성, 언제 무엇을 사용해야 할까?
두 클래스 간에 명확한 IS-A 관계가 성립한다면 상속이 적합합니다. 반면, 단순히 다른 객체의 기능을 재사용하고 싶은 경우에는 구성이 더 유연한 선택입니다. 실무에서는 "상속보다 구성을 선호하라(Favor Composition over Inheritance)"는 설계 원칙처럼, 클래스 간 결합도를 낮추고 유지보수성을 높이기 위해 구성을 우선적으로 고려하는 경우가 많습니다. 상황에 맞게 두 기법을 적절히 조합하면 더 견고하고 확장 가능한 C# 코드를 작성할 수 있습니다.