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

응집도(Cohesion)와 결합도(Coupling)들어가며응집도(Cohesion)개념예시결합도(Coupling)개념예시정리참고 사이트