728x90
728x90

응집도(Cohesion)와 결합도(Coupling)

들어가며

  • CS 관련 공부를 하다보면 자주 접하는 용어인 응집도(Cohesion)결합도(Coupling)에 대하여 간단하게 정리해본다.

 

응집도(Cohesion)

개념

  • 모듈 내부의 구성 요소들이 서로 얼마나 밀접하게 관련되어 있는지를 나타내는 척도
  • 높은 응집도를 가진 모듈은 하나의 명확한 기능이나 책임을 수행하며, 내부 요소들이 긴밀하게 협력한다.
    • 유지보수와 재사용성을 높여준다.

 

예시

  • 한 클래스가 특정한 데이터와 그 데이터를 처리하는 함수들로만 구성되어 있다면, 해당 클래스는 높은 응집도를 가진다고 볼 수 있습니다.

 

예제 코드
  • 아래의 클래스는 계좌와 관련된 데이터와 기능(예: 입금, 출금, 잔액 조회)을 한 곳에 모아두어 하나의 명확한 역할만 수행하도록 설계되었다.
class BankAccount:
    # 계좌 소유자와 초기 잔액을 설정
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    # 기능 : 입금
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            print(f"{amount}원이 입금되었습니다. 현재 잔액: {self.balance}원")
        else:
            print("입금액은 0보다 커야 합니다.")
    
    # 기능 : 출금
    def withdraw(self, amount):
        if amount > 0:
            if self.balance >= amount:
                self.balance -= amount
                print(f"{amount}원이 출금되었습니다. 현재 잔액: {self.balance}원")
            else:
                print("잔액이 부족합니다.")
        else:
            print("출금액은 0보다 커야 합니다.")

    # 기능 : 현재 잔액 반환
    def get_balance(self):
        return self.balance

# 사용 예시
if __name__ == "__main__":
    account = BankAccount("홍길동", 1000)
    account.deposit(500)
    account.withdraw(300)
    print(f"최종 잔액: {account.get_balance()}원")

 

결합도(Coupling)

개념

  • 서로 다른 모듈이나 클래스 간의 의존성을 나타내는 척도
  • 낮은 결합도를 가진 시스템은 각 모듈이 독립적으로 동작할 수 있어, 한 모듈의 변경이 다른 모듈에 미치는 영향을 최소화한다.

 

예시

  • 만약 두 모듈이 서로 독립적으로 동작하고, 한 모듈의 내부 구현 변경이 다른 모듈에 영향을 주지 않는다면, 이 시스템은 낮은 결합도를 갖고 있다고 할 수 있다.

 

예제 코드
  • 결제 처리를 위한 @PaymentProcessor@ 클래스가 특정 결제 게이트웨이에 의존하지 않고, 외부에서 주입된 추상화된 결제 게이트웨이(@PaymentGateway@)를 사용하도록 설계되어 있다.
  • 이렇게 하면 결제 방식(예: @Stripe@, @PayPal@ 등)이 바뀌더라도 @PaymentProcessor@ 클래스는 수정할 필요가 없어 시스템 간 결합도를 낮출 수 있다.
class PaymentGateway:
    # 추상 결제 게이트웨이 인터페이스
    def process_payment(self, amount):
        raise NotImplementedError("서브클래스에서 구현해야 합니다.")


class StripeGateway(PaymentGateway):
    def process_payment(self, amount):
        print(f"Stripe를 통해 {amount}원 결제 처리 중...")


class PaypalGateway(PaymentGateway):
    def process_payment(self, amount):
        print(f"PayPal을 통해 {amount}원 결제 처리 중...")


# 결제 처리 클래스는 특정 결제 게이트웨이에 의존하지 않고, 외부에서 주입받은 결제 게이트웨이를 사용한다.
class PaymentProcessor:
    def __init__(self, gateway: PaymentGateway):
        self.gateway = gateway

    def make_payment(self, amount):
        self.gateway.process_payment(amount)


# 사용 예시
if __name__ == "__main__":
    # Stripe 게이트웨이를 사용하는 경우
    stripe_gateway = StripeGateway()
    processor = PaymentProcessor(stripe_gateway)
    processor.make_payment(100)

    # PayPal 게이트웨이를 사용하는 경우 : PaymentProcessor 코드를 변경할 필요가 없다.
    paypal_gateway = PaypalGateway()
    processor = PaymentProcessor(paypal_gateway)
    processor.make_payment(200)

 

정리

  • 높은 응집도는 모듈 내부의 요소들이 서로 밀접하게 관련되어 한 가지 일을 잘 수행함을 의미한다.
  • 낮은 결합도는 모듈들 사이의 의존성이 적어, 시스템 변경 시 영향을 최소화할 수 있음을 의미한다.

 

시스템 설계에서 높은 응집도와 낮은 결합도를 유지하는 것이 이상적이다. 즉, 응집도가 높아 각 모듈이 단일 책임을 잘 수행하고, 결합도가 낮아 모듈 간 의존성이 줄어들어 변경 시 영향 범위가 작아지는 상태가 더 좋은 설계라고 할 수 있다.

 

참고 사이트

 

Coupling and Cohesion - Software Engineering - GeeksforGeeks

The Design phase in the Software Development Life Cycle aims to create a solution based on the Software Requirement Specification, focusing on achieving low coupling and high cohesion to enhance software maintainability and reliability.

www.geeksforgeeks.org

 

728x90
728x90