객체 지향을 배우다 보면 상속은 굉장히 “객체 지향다운” 도구처럼 느껴집니다. 하지만 실무로 갈수록 상속보다 조합을 선호하라는 말을 더 자주 듣게 됩니다. 왜 이런 차이가 생길까요?
이 글에서는 아래 내용을 정리합니다.
- 상속과 조합이 어떻게 다른지
- 왜 조합을 더 선호하는 경우가 많은지
- 각각이 잘 맞는 상황은 무엇인지
핵심은 상속은 강한 결합을 만들기 쉽고, 조합은 역할을 더 유연하게 바꿀 수 있어 변화에 더 잘 대응하는 경우가 많다는 점입니다.
상속이란 무엇인가
상속은 기존 타입을 확장해서 새로운 타입을 만드는 방식입니다.
예를 들어:
AnimalDog extends Animal
처럼 상위 타입의 속성과 행동을 하위 타입이 이어받는 구조입니다.
조합이란 무엇인가
조합은 필요한 기능을 다른 객체와의 협력으로 구성하는 방식입니다.
예를 들어 어떤 객체가 직접 모든 기능을 상속받는 대신:
- 결제 전략 객체
- 알림 객체
- 저장 객체
를 내부에서 조합해서 쓰는 식입니다.
즉, “무엇의 일종인가”보다 “어떤 것들과 협력하는가”에 더 초점이 있습니다.
왜 조합을 더 선호하는 경우가 많을까
상속은 편해 보이지만 구조가 깊어질수록:
- 변경 영향이 위아래로 번지고
- 하위 타입 제약이 커지며
- 재사용보다 결합이 더 커질 수 있습니다
반면 조합은 필요한 역할을 객체 단위로 교체하거나 분리하기가 더 쉽습니다.
즉, 변화가 잦은 코드에서는 조합이 더 유연한 경우가 많습니다.
상속이 잘 맞는 경우는 없을까
물론 있습니다. 정말로:
- is-a 관계가 자연스럽고
- 상위 타입 규약을 하위 타입이 안정적으로 지키며
- 구조가 과도하게 복잡해지지 않는다면
상속이 깔끔한 선택일 수 있습니다.
문제는 상속이 너무 쉽게 “코드 재사용용 도구”로 오용된다는 점입니다.
조합은 어떤 장점이 있을까
- 구현 교체가 쉬움
- 테스트가 쉬움
- 결합이 상대적으로 낮음
- 역할을 더 잘 분리할 수 있음
그래서 전략 패턴, 의존성 주입 같은 설계와도 잘 맞습니다.
자주 하는 오해
1. 상속은 객체 지향의 핵심이니 많이 써야 한다
객체 지향의 핵심은 협력 구조이지, 상속 자체가 아닙니다.
2. 조합은 클래스가 많아져서 무조건 복잡하다
겉으로는 객체 수가 늘어도, 변경 가능한 구조로 보면 더 단순할 수 있습니다.
3. 상속과 조합은 하나만 써야 한다
둘 다 도구이고, 상황에 따라 적절히 선택하는 것이 좋습니다.
FAQ
Q. 입문자는 무엇을 더 먼저 익히면 좋을까
상속 문법보다 조합이 왜 유연한지 먼저 이해하는 것이 실무 감각에 더 도움이 됩니다.
Q. 상속을 완전히 피해야 하나
그럴 필요는 없습니다. 다만 “정말 상속이 맞는 관계인가”를 더 엄격히 보는 것이 좋습니다.
Q. 조합은 어떤 설계와 잘 맞나
전략 패턴, 의존성 주입, 역할 분리와 잘 맞습니다.
Read Next
- 큰 그림은 객체 지향 프로그래밍 가이드와 이어집니다.
- 의존성 연결 방식은 의존성 주입 가이드를 같이 보면 더 잘 보입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.