-
20250327_(5) Coupling & CohensionStudy/C# 2025. 3. 28. 13:10
좋은 객체지향 설계의 핵심 원칙의 중심에는 객체의 결합도(Coupling)와 응집도(Cohension)라는 개념이 존재한다.
객체지향 설계에서 좋은 구조란, 클래스 간 결합도가 낮고, 각 클래스의 응집도가 높은 구조를 말한다.
즉, 결합도는 낮추고, 응집도는 높이는 방향으로 구조를 개선하면 유지보수, 확장, 테스트, 재사용이 쉬운 소프트웨어 개발이 가능하다.
1. 결합도 (Coupling)
결합도는 모듈 (또는 클래스) 간의 상호 의존성 정도를 말한다.
즉, 한 클래스가 다른 클래스에 얼마나 강하게 언결되어 있는가를 나타내는 지표이다.
(1) 높은 결합도 (Tight Coupling)
- 한 클래스가 다른 클래스 내부 구현에 대해 많이 알고 있음
- 하나의 변경이 연쇄적으로 다른 클래스에 영향을 미침
- 테스트, 확장, 유지보수 어려움
public class ReportPrinter { private FileSaver saver = new FileSaver(); // 직접 생성 → 강한 결합 public void Print(string report) { saver.Save(report); } }
- ReportPrinter는 FileSaver에 강하게 결합됨
- FileSaver를 바꾸거나 모킹(mocking)하기 어려움
(2) 낮은 결합도 (Loose Coupling)
- 클래스가 다른 클래스의 구체적인 구현이 아닌 인터페이스나 추상화에 의존
- 변경에 강함
- 테스트와 재사용이 쉬움
public interface ISaver { void Save(string data); } public class ReportPrinter { private ISaver saver; public ReportPrinter(ISaver saver) { this.saver = saver; // 느슨한 결합 } public void Print(string report) { saver.Save(report); } }
-> 소프트웨어의 유지보수를 용이하게 하기 위해선 낮은 결합도를 유지하여 클래스간 간섭을 최소화 해야 한다.
높은 결합도의 코드는 아주 사소한 문제라도 큰 문제로 번질 가능성이 높기 때문임.클래스간 결합도를 낮추는 방법은 다음과 같다.
- 인터페이스 활용
- 의존성 주입 (DI)
- 객체의 추상화에 집중하기
- 이벤트 / 콜백 기반 설계
2. 응집도 (Cohension)
응집도는 하나의 클래스나 모듈이 하나의 책임에 얼마나 집중하고 있는가를 나타낸다.
즉, 클래스 내부의 메소드, 필드들이 얼마나 밀접하게 연관되어 있는지를 보는 것.
(1) 낮은 응집도 (Low Cohension)
- 하나의 클래스가 여러 역할을 동시에 수행
- 클래스 내부 요소들이 목적 없이 섞여 있음
- 단일 책임 원칙 (SRP) 위반
public class Utility { public void SaveToFile(string data) { } public void ConnectToDatabase() { } public void SendEmail(string message) { } }
-> 여러 기능이 섞여있어 유지보수가 어려움
(2) 높은 응집도 (High Cohension)
- 클래스 하나가 명확한 목적성을 띠고, 역할 하나에 집중함
- 메서드 간 밀접한 관련성으로 묶여있음
- 재사용성과 가독성이 높음
public class ReportSaver { public void SaveToFile(string report) { } }
- 이 클래스는 "보고서 저장"에만 집중
-> 낮은 응집도는 클래스의 목적성을 해치고, 클래스간 역할수행이 명확해지지 않게 하는 주범이 됨. 따라서 한 클래스를 생성할 때 단 하나의 기능과 목적에만 집중하여 응집도 높은 클래스를 생성하는 것이 중요함.
응집도 높은 클래스를 만들기 위한 방법은 다음과 같다.
- 하나의 클래스에는 하나의 책임만 부여할 것. (SRP)
- 역할이 다른 기능은 다른 클래스로 분리
- 관련 없는 기능은 위임
주말에 결합도를 측정하는 기준에 대해서 알아보고 정리해볼 것.
'Study > C#' 카테고리의 다른 글
20250327_(6) Boxing / Unboxing (0) 2025.03.28 20250327_(3) The SOLID Principles (0) 2025.03.28 20250327_(4) Dependency Injection, DI (0) 2025.03.27 20250327_(2) Encapsulation (0) 2025.03.27 202550327_(1) UML Class Diagram (0) 2025.03.27