서론
패턴과 설계를 공부하는 과정에서 "결합도"와 "응집도"라는 단어가 반복적으로 나오는 것을 발견했습니다.
좋은 설계란 "낮은 결합도"와 "높은 응집도"를 가지는 유지보수가 쉬운 설계를 말한다고 하는데요.
여기서 말하는 결합도와 응집도가 무엇인지 알아보겠습니다.
모듈
결합도와 응집도에 대해 알아보기 전, 모듈이 뭔지 알아야 합니다.
모듈은 개념의 범위가 넓기 때문에 명확하게 말하긴 어렵지만,
위키백과에서는 "기본적으로 본체에 대한 독립된 하위 단위" 라고 정의하고 있습니다.
프로그램이 본체라면, 이를 구성하는 클래스 등을 독립된 하위 단위로 말할 수 있습니다.
클린 코드, 클린 아키텍처의 저자인 로버트 마틴은
모든 모듈은 제대로 실행되어야 하고, 변경이 쉬워야 하고, 이해하기 쉬워야 한다고 말했습니다.
이를 달성하면 본체인 프로그램도 자연스럽게 유지보수가 쉬워질 수 있습니다.
결합도(Coupling)
결합도는 다른 모듈과의 의존성 정도를 말합니다.
모듈 수정을 위해서 다른 모듈의 변경을 요구하는 정도로 표현할 수도 있습니다.
낮은 결합도를 가질수록 다른 모듈에 주는 영향이 적기 때문에 유지보수에 유리합니다.
낮은 결합도를 가진 A 모듈은 수정을 해도 다른 모듈에 영향을 주지 않기 때문에 유지보수에 유리합니다.
반대로 높은 결합도를 가진 B는 수정을 하면 D, E, F .... 에 영향을 주기 때문에 유지보수에 불리합니다.
모듈 B의 수정은 흔히 말하는 사이드 이펙트가 큰 수정이 될 것입니다.
응집도 (Cohesion)
응집도는 모듈 내부의 기능적인 집중도를 의미합니다.
응집도는 높을수록 유지보수에 유리합니다.
아래는 높은 응집도를 표현한 그림입니다.
A 모듈에는 a 기능에 필요한 부분이 모두 들어있습니다.
그래서 a 기능을 수정할 때 A 모듈만 보면 되기 때문에 살펴봐야 할 범위가 줄어들고 사이드 이펙트도 없습니다.
반대로 낮은 응집도를 가지면 유지 보수에 불리합니다.
이번에는 a 기능이 A, B, C, D 모듈에 흩어져 있습니다.
a 기능을 수정하기 위해서 4개의 모듈을 살펴봐야 하죠.
이런 구조에서는 최악의 경우, 기능 하나를 수정하기 위해 모든 파일을 살펴봐야 될 수도 있습니다 ㄷㄷ
Swift의 프로토콜
Swift에서는 프로토콜을 이용해 낮은 결합도, 높은 응집도를 가질 수 있습니다.
Swift는 상속 뿐만 아니라 프로토콜을 이용해서도 다형성을 구현할 수 있는데요.
상속은 자식 클래스가 부모 클래스의 프로퍼티와 메서드를 모두 가져야 합니다.
그래서 불필요한 속성이라도 가지고 있어야 한다는 단점이 있습니다.
프로토콜을 이용하면 이 단점을 줄일 수 있습니다.
꼭 필요한 프로퍼티와 메서드만 정의해두고 그것만 채택해서 구현하면 되기 때문입니다.
즉, 프로토콜을 잘 분리해서 정의하면 객체는 높은 응집도를 쉽게 구현할 수 있게 됩니다.
또한, 부모 클래스와 자식 클래스 사이의 결합도도 사라지기 때문에 결합도도 낮출 수 있습니다.
실제 예시를 여기서 다루면 포스팅의 응집도가 낮아질 거 같아서 ( ㅋㅋ )
프로토콜이 낮은 결합도와 높은 응집도에 도움을 준다! 까지로 마무리하겠습니다.
마무리
패턴과 설계에 대해 공부할수록 Swift의 프로토콜이 참 좋구나 느낍니다.
Swift 개발자는 프로토콜을 잘 쓰냐 못 쓰냐로 나뉠 거 같은데 저도 얼른 응용하면서 잘 쓰고 싶네요 ㅠㅠ
노력해야겠습니다.
감사합니다!
참고