4.3 의존성 해결 - 추상화
Depend upon abstractions, not concretions
- 상세한 구현에 의존하지 말고, 공통된 개념(추상화)에 의존해라.)
1. 학습 목표
: 학습 목표는, 의존성 문제 해결을 위한 "추상화 기술" 이해입니다. 이를 위한 단계별 학습 순서를 확인합니다.
A. 학습 목표
- Step 1. 추상 개념 이해
- Step 2. 추상화 구현 이해
- Step 3. 추상화된 추상 클래스와 인터페이스 적용하여 구현
B. 의존성 문제 해결 방법
Q. 클래스1 ↔ 클래스2
클래스와 클래스 간의 의존 관계를 어떻게 제거할 수 있을까요?
A. 클래스1 ↔ 인터페이스
인터페이스 ↔ 클래스2 구조로 의존하게 합니다.
인터페이스는 클래스1이 추상화된 형태입니다.
인터페이스를 '의존성'이라 하고,
인터페이스에 의존하는 로직을 클래스2에 구현하는 것을 '의존성 주입(전달)' 이라고 합니다.
C. 의존성 문제 해결 - 최종 목표
의존성 주입(Dependency Injection)을 통한, 의존성의 제어 역전(Inversion of Control) 상태 구현입니다.
이를 위해 아래 개념들을 하나씩 이해해야 합니다.
- 추상화
- 추상 클래스, 인터페이스
- 의존성
- 의존성 주입(Dependency Injection)
- 제어 역전(Inversion of Control)
이를 위한 첫번째 단계인, 인터페이스를 구현하기 위한 추상화의 개념을 조금 더 확장해 봅시다.
2. 프로그래밍에서 "추상화(Abstraction)"
A. 추상화
4.1 추상화
1. "추상": 단어의 의미더보기A. 목표프로그래밍에서의 "추상화" 개념을 배우기 전에, 일상생활에서 사용되는 "추상"이라는 단어의 의미를 먼저 이해합니다. 일상 속 예시와 미술에서의 추상을 살
basiclike.tistory.com
객체지향을 처음 학습할 때는 클래스를 구현하기 위해
현실의 대상을 추상화하여 데이터와 로직으로 구현 관점에서 잠시 다뤘습니다.
이제는 이보다 더 확장된 개념인 "객체의 추상화”에 대해 이해할 필요가 있습니다.
B. "추상" 사전적 정의 재확인
추상(抽 뽑을 추 象 코끼리 상)
>> 여러 가지 사물(事物)이나 개념(槪念)에서
공통(共通)되는 특성(特性)이나 속성(屬性) 따를 추출(抽出)하여 파악(把握)하는 작용(作用).
C. 의존성 생성 (Dependency Creation)

*객체의 추상화 (= 의존성) 구현
D. 의존성 주입(Dependency Injection)

3. 의존 역전 관계


# 추상화된 인터페이스를 생성한다.
class Animal:
def speak(self):
pass
class Cat:
def speak(self):
print("Meow")
class Dog:
def speak(self):
print("bark")
# 추가된다고 가정합니다.
class Sheep:
def speak(self):
print("Baaa")
# Zoo 객체는 수정되지 않는다.
class Zoo:
def __init__(self):
self.animals = []
def addAnimals(self, animal):
self.animals.append(animal)
def run(self):
for animal in self.animals:
animal.speak()
zoo = Zoo()
zoo.addAnimals(Cat())
zoo.addAnimals(Dog())
zoo.addAnimals(Sheep())
zoo.run()