[파이썬] 클래스 다이어그램의 응집도와 결합도

클래스 다이어그램은 객체지향 프로그래밍에서 시스템의 구조를 시각적으로 표현하는 도구입니다. 클래스 다이어그램은 클래스, 인터페이스, 관계 등을 나타내어 시스템의 설계와 구현을 도와줍니다. 응집도와 결합도는 클래스 다이어그램에서 중요한 개념으로, 코드의 품질을 평가하는 데 도움을 줍니다.

응집도 (Cohesion)

응집도는 클래스나 모듈이 어떤 기능을 수행하는 데 얼마나 관련된 요소들로 구성되어 있는지를 나타냅니다. 높은 응집도를 가진 클래스는 한 가지 명확한 역할을 수행하며, 관련된 기능을 모아놓아 코드의 가독성과 유지보수성을 높일 수 있습니다.

응집도를 높이기 위해선 단일 책임 원칙(Single Responsibility Principle)을 따라야 합니다. 클래스는 한 가지 기능에만 집중하고 다른 부가적인 기능이나 책임을 가지지 않아야 합니다.

아래는 응집도가 높은 예시입니다.

class Calculator:
    def add(self, a, b):
        return a + b
    
    def subtract(self, a, b):
        return a - b

위 예시에서 Calculator 클래스는 계산 기능에 집중하고 있으며, add와 subtract 메서드로 이루어져 있습니다. 이렇게 한 가지 역할을 수행하는 클래스는 응집도가 높다고 할 수 있습니다.

결합도 (Coupling)

결합도는 클래스나 모듈간의 상호 의존 정도를 나타냅니다. 결합도가 낮을수록 코드의 유연성과 재사용성이 높아집니다. 결합도는 독립적인 클래스나 모듈을 설계하고, 클래스간의 의존성을 최소화하는 것을 목표로 합니다.

결합도를 낮추기 위해선 의존성 역전 원칙(Dependency Inversion Principle)을 따라야 합니다. 의존성을 주입받는 방식으로 클래스를 설계하고, 추상화를 통해 클래스 간의 의존성을 최소화해야 합니다.

아래는 결합도가 낮은 예시입니다.

class EmailSender:
    def send_email(self, recipient, message):
        # 이메일 전송 로직 구현

class NotificationService:
    def __init__(self, email_sender):
        self.email_sender = email_sender

    def notify_user(self, user):
        message = "안녕하세요, " + user.username + "님!"
        self.email_sender.send_email(user.email, message)

위 예시에서 NotificationService 클래스는 EmailSender 클래스에 의존하고 있지만, 구체적인 구현 대신 인터페이스만을 의존하고 있습니다. 따라서 EmailSender 클래스의 구체적인 내부 구현이 변경되더라도 NotificationService 클래스는 영향을 받지 않으며, 결합도가 낮다고 할 수 있습니다.

마무리

응집도와 결합도는 클래스 다이어그램을 설계하는 과정에서 중요한 요소입니다. 응집도가 높은 클래스는 한 가지 명확한 역할을 수행하며, 결합도가 낮은 클래스는 서로 독립적으로 동작하고 재사용성을 높일 수 있습니다. 이는 코드의 품질을 높이고 유지보수성을 향상시키는데 기여합니다.