튜터님께서 강조해주신 의존관계 역전 원칙(DIP)! 자세히 알아보자.
먼저 단어를 뜯어서 의존성(Dependency) 주입(Inversion)으로 나눠 알아보자.
의존성 이란?
-> 서로 다른 객체 사이에 의존 관계가 있다는 것
자 먼저, Swift에서는 보통 다른언어의 객체를 객체라고 표현 안 하고 인스턴스라는 용어를 더 자주 사용한다고 한다.
그렇기 때문에 필자는 설명할 때 인스턴스라고 칭하겠다.
코드로 이해해보자.
class B {
var name: String = "대성"
}
class A {
var kk: B = B()
func Output() {
print(kk.name)
}
}
위 그림을 보면 클래스 'A'의 인스턴스는 클래스 'B'의 인스턴스를 의존할 수 있다고 할 수 있다.
왜?
위 처럼 B클래스의 변수 이름을 바꿧을 때 다음과 같은 오류가 발생하는 것을 볼 수 있음.
즉, 의존하는 인스턴스가 수정되면, 다른 인스턴스도 영향을 받는다는 것
정리하면, 위 코드에서 클래스 'A'의 인스턴스는 클래스 'B'의 인스턴스를 의존한다. 라는 것 이다.
의존 관계의 문제점은 다음과 같다.
- 유연성 감소
- 테스트 어려움
- 재사용성 저하
- 복잡성 증가
찾아보니 의존 관계와 결합도는 매우 밀접하게 관련 된 개념인 것 같다.
예전 전공 수업 중 소프트웨어 공학 기초 이론에서 결합도를 낮추고 응집도를 높혀라! 라는 문구가 기억이 난다.
자, 다음으로 주입(Injection)이란?
외부에서 값을 넣어주면서 인스턴스를 생성할 때, 값을 주입한다고 한다.
이는 생성자(init)와 같은 개념이다.
class HiHi {
var say: String
init(name: String){
self.say = say
}
}
let hihi = HiHi(say: "녕안~")
자, 그럼 오늘의 메인디쉬! 의존 관계 역전 원칙(DIP)으로 들어가볼까?
먼저 그림으로 간단히 이해해보자.
대충 이런 느낌이다!
그림으로 완벽하게 이해가 잘 안 갈 것 같아서 코드로 한번 다시 보도록 하자!
다음은 계산기를 구현하며 DIP를 적용한 사례 중 일부를 가져온 코드이다.
우선, 추상화 클래스를 활용해서 추상적인 인스턴스를 생성해야 한다.
Service 클래스에 있는 excute메서드를 상속받아 1차 연결.
DI를 적용하기 위해 Service클래스의 의존성을 외부에서 주입받도록 구현했다.
이렇게 구현하면 Clinet 인스턴스와 realService 인스턴스는 각각 독립적인 인스턴스가 된다.
다시 말해, realService 클래스의 변수가 이름을 바꾸거나 없어도 Clinet의 수정은 따로 필요 없어진다.
'Swift' 카테고리의 다른 글
Xcode 간단 용어정리 (0) | 2024.06.17 |
---|---|
기본 문법 <제네릭> (0) | 2024.06.15 |
기초 문법 클로저: 상 (0) | 2024.06.13 |
기초 문법 타입 캐스팅 (1) | 2024.06.12 |
내가 볼려고 만든 SOLID정리 (0) | 2024.06.07 |