의존성이 뭔데요?
한 객체에서 특정 요소가 변경되면 참조를 하고 있는 객체의 다른 요소에도 영향을 주는 관계를 말해요.
- 자동차로 예를 들어보자면 기름이 다 떨어지거나 엔진이 고장난다면 자동차가 동작하지 않겠죠? 이런 상황을 프로그래밍적인 용어로'자동차는 휘발유에 의존하고 있다'라고 표현할 수 있어요! 이처럼 어떤 요소가 다른 요소에 의존하는 것을 의존성이라고 합니다.
의존성 역전의 법칙은 또 뭐죠?
의존성 역전의 법칙(Dependency Inversion Principle, DIP)은 소프트웨어 설계 원칙 중 하나로, 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 되며, 둘 모두 추상화된 인터페이스에 의존해야 한다는 원칙입니다.
말이 좀 어렵죠.. ㅎㅎ 제가 좋아하는 스펀지밥을 데려와보겠습니다.
의존성 역전은 집게사장이 집게리아를 운영할 때, 요리, 주문, 계산과 같은 여러 작업들을 직접 처리하는 대신, 이 작업들을 스펀지밥에게 맡기는 것과 비슷해요. 만약 집게사장이 직접 이 작업들을 처리한다면, 집게사장이 스펀지밥에게 의존해야 하는 상황이 발생하게 되는데, 이런 상황을 프로그래밍에서는 의존성이 역전되었다고 말합니다.
집게사장이 직접 하지 않고 다른 누군가에게 맡김으로써 집게사장이 직접 처리하지 않아도 되는거죠.
1. 의존성 주입
의존성 주입(Dependency Injection, DI)은 객체지향 프로그램이에서 한 객체가 필요로 하는 다른 객체나 리소스를 외부에서 주입(제공받는 것)받는 것을 말해요.
왜 사용해야하나요?
코드의 재사용성과 테스트 용이성
의존성을 외부에서 주입받기 때문에, 의존하는 객체를 직접 생성하거나 수정할 필요가 없어 코드의 재사용성과 테스트 용이성을 향상시킵니다.
모듈의 독립성과 유연성
DI를 통해 의존성을 외부에서 주입받으면, 의존하는 모듈과 주입하는 모듈 간의 결합도가 낮아지고, 모듈의 독립성과 유연성이 증가합니다.
꼭 사용해야하나요?
- 의존하는 객체를 직접 생성하거나 수정한 경우, 해당 객체의 변경이 필요한 경우 모든 의존 관계를 수정해야 합니다.
- 의존성이 직접 표현되지 않고 내부에서 생성되는 경우, 코드의 가독성이 감소하고 유지보수가 어려워질 수 있어요.
2. 의존성 주입 구현과 코드 예시
- 의존성 주입을 구현하는 방법은 다양하지만, 주로 생성자 주입(Constructor Injection), 메서드 주입(Method Injection), 속성 주입(Property Injection) 등의 방식을 사용합니다.
이번 포스팅에서는 생성자 주입을 예시로 들어 설명할게요!
아래 코드 예시에서 `Krabs` 클래스는 `SpongeBob` 클래스에 의존하고 있는 형태이고, 생성자 주입을 통해 `SpongeBob` 객체를 주입받아 사용하고 있어요. 이렇게 하면 `Krabs` 클래스는 `SpongeBob` 객체의 구체적인 구현에 의존하지 않고, 추상화된 인터페이스에만 의존하여 코드를 작성할 수 있어요.
이렇게 의존성 주입(Dependency Injection)을 사용하면, 스펀지밥 대신 깐깐징어가 와도 같은 역할을 수행할 수 있습니다 :)
안쓰면 어떻게 되나요?
직접 Worker를 생성하고 사용한다면, 집게사장이 모든 작업을 직접 처리하면서 프로그램이 성장하거나 변경될 때 유연성이 떨어지게 됩니다. 코드의 재사용성이 낮아지고 새로운 기능을 추가하거나 기존의 기능을 변경할 때 모든 부분을 손봐야 하는 번거로움이 발생해요.
의존성주입이 되지 않으면 간단한 프로젝트에서는 괜찮지만 프로젝트 규모가 큰 경우 코드의 가독성이 떨어져서 다른 개발자들이나 여러 모듈 간 협업할 때 코드를 이해하기 어려워질 수 있어요. 객체를 직접 생성하고 사용하면서 코드가 복잡해지면, 실수를 하기가 쉬워져 디버깅과 유지보수가 어려워질 수 있겠죠.
또한, 성능적인 측면에서도 의존성 주입을 사용하면 객체를 필요할 때마다 생성하고 주입받기 때문에 메모리 관리가 효율적으로 이루어지고, 필요한 의존성만 주입받기 때문에 불필요한 리소스 소모를 줄일 수 있어요.
이렇게 의존성 주입을 사용하면 코드의 유지보수성뿐만 아니라 재사용성과 성능적인 이점을 챙길 수 있습니다 :)
'스폰지밥으로 공부하는 swift > 객체지향과 디자인패턴' 카테고리의 다른 글
빌 프린터로 알아보는 Observer 패턴 (0) | 2024.04.06 |
---|---|
1급 객체 넌 도데체 뭐하는 놈이냐 (2) | 2024.03.16 |
싱글턴 패턴이란? (0) | 2024.01.24 |
캡슐화 왜 해야함?? (1) | 2024.01.05 |