피드로 돌아가기
Dev.toBackend
원문 읽기
Composition 기반 OOP 설계를 통한 유연한 시스템 확장 및 캡슐화 구현
Week 5: Why Composition Beats Inheritance.
AI 요약
Context
단순 함수 중심의 절차적 설계에서 벗어나 상태와 행위를 통합 관리하는 OOP 아키텍처 도입 필요성 인식. 상속 기반의 계층 구조가 초래하는 유연성 저하와 강한 결합도 문제를 해결하기 위한 구조적 탐색 수행.
Technical Solution
- BankAccount 클래스를 통해 상태(balance, history)와 행위(deposit, withdraw)를 단일 객체로 캡슐화하여 데이터 무결성 확보
- @property setter 도입을 통한 데이터 입력 단계의 Validation 레이어 구축 및 객체 스스로의 상태 보호 로직 구현
- isinstance를 활용한 타입 체크 로직을 메서드 내부에 배치하여 호출자가 아닌 객체가 직접 비즈니스 규칙을 강제하는 설계 적용
- Inheritance의 'is-a' 관계와 Composition의 'has-a' 관계를 구분하여 시스템 확장 시 발생하는 클래스 폭발 문제 방지
- super().init() 호출을 통한 부모 클래스 상태 초기화 강제로 상속 계층 간 데이터 일관성 유지
- Dunder Method 구현을 통해 객체의 문자열 표현을 정의함으로써 디버깅 효율성 및 native 객체 사용성 향상
실천 포인트
- 클래스 설계 시 'is-a' 관계인지 'has-a' 관계인지 명확히 구분하여 상속보다 Composition 우선 검토 - 데이터 변경 지점에 @property setter를 배치하여 유효성 검사 로직을 중앙 집중화 - 객체 간 상호작용 시 isinstance를 통한 타입 검증을 수행하여 런타임 에러 방지 및 도메인 규칙 강제 - 객체의 생명주기 관리와 상태 추적을 위해 내부 로그(history) 리스트를 운용하는 패턴 고려