상속보다 구성을 우선하기
상황에 맞다면 포함 관계 설계를 선택합니다
상속보다 구성을 우선하기은(는) CoddyKit의 무료 Dart Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Dart Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Dart Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
재사용하는 두 가지 방법
동작을 상속받거나 다른 객체를 보유하는 방식으로 재사용할 수 있습니다. 두 번째 접근 방식을 컴포지션이라고 합니다.
is-a와 has-a
상속은 is-a 관계를 모델링합니다. Circle은 Shape입니다. 컴포지션은 has-a 관계를 모델링합니다. Car는 Engine을 가집니다.
컴포지션을 사용하는 클래스
컴포지션에서는 다른 클래스를 확장하는 대신 도우미 객체를 필드로 저장하고 그 객체에 작업을 위임합니다.
class Car {
final Engine engine = Engine();
}동작 위임하기
바깥쪽 클래스가 내부 객체에 호출을 전달합니다. 이 위임 방식은 상속 없이 논리를 재사용하게 해 줍니다.
class Car {
final engine = Engine();
void start() => engine.ignite();
}취약한 기본 클래스 문제
깊은 상속 구조는 쉽게 깨집니다. 부모의 변경이 멀리 떨어진 하위 클래스들을 조용히 망가뜨릴 수 있는데, 이를 취약한 기본 클래스라는 함정이라고 합니다.
실행 중의 유연성
컴포지션을 사용하면 원할 때마다 내부 객체를 교체할 수 있습니다. 상속은 한 번 정해지면 고정되지만 필드는 변경할 수 있습니다.
class Car {
Engine engine;
Car(this.engine);
}인터페이스와 결합하기
컴포지션을 인터페이스와 함께 사용하세요. 추상 Engine 타입에 의존하면 조건에 맞는 어떤 엔진이든 깔끔하게 연결할 수 있습니다.
abstract class Engine {
void ignite();
}테스트하기 쉬움
각 부분이 서로 분리된 객체이므로 테스트에서 가짜 객체를 전달할 수 있습니다. 컴포지션은 모의 객체 사용을 간단하고 자연스럽게 만들어 줍니다.
var car = Car(FakeEngine());잘못된 것을 상속하지 않기
하위 클래스는 노출해서는 안 되는 멤버까지 모든 멤버를 상속합니다. 컴포지션은 위임하도록 선택한 것만 공유합니다.
상속이 여전히 더 나은 경우
공유된 정체성을 가진 명확한 is-a 관계라면 상속을 사용해도 좋습니다. 관계가 실제로 has-a라면 컴포지션을 선택하세요.
실용적인 규칙
기본적으로 컴포지션을 우선하고 상속은 신중하게 사용하세요. 그러면 설계 요소 간 결합도가 낮아지고 나중에 쉽게 변경할 수 있습니다. 🧩
빠른 확인
컴포지션에 관한 간단한 질문입니다.
복습
컴포지션은 다른 객체를 보유하고 그 객체에 위임하여 has-a 관계를 모델링합니다. 유연하고 테스트하기 쉬우며, 상속은 명확한 is-a 관계에 적합합니다. 👍
자주 묻는 질문
“상속보다 구성을 우선하기” 강의는 무료인가요?
네 — “상속보다 구성을 우선하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Dart Academy 강의 전체를 잠금 해제할 수 있습니다. Dart Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“상속보다 구성을 우선하기”에서 뭘 배우나요?
상황에 맞다면 포함 관계 설계를 선택합니다 브라우저에서 직접 실행하는 실습 코드로 Dart Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Dart Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Dart Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“상속보다 구성을 우선하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Dart Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Dart Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 추상 클래스와 추상 메서드
- 암시적 인터페이스와 implements
- 공유 자료형을 통한 다형성
- 상속보다 구성을 우선하기