클래스와 결합도는 소프트웨어 디자인 및 개발에서 중요한 개념입니다. 클래스는 객체 지향 프로그래밍에서 핵심적인 요소로, 데이터와 해당 데이터를 조작하는 메서드를 포함합니다. 결합도는 코드 요소들 간에 어떤 정도의 의존성이 있는지를 나타내는 개념으로, 낮은 결합도를 가진 코드는 유연하고 재사용성이 높은 코드라고 할 수 있습니다.
낮은 결합도를 가진 클래스
낮은 결합도는 클래스 간의 의존성이 낮은 경우를 의미합니다. 이는 하나의 클래스의 변경이 다른 클래스에 큰 영향을 주지 않는다는 것을 의미합니다. 이러한 낮은 결합도를 가진 클래스는 다음과 같은 특징을 가질 수 있습니다:
- 단일 책임 원칙(Single Responsibility Principle)을 따름: 클래스는 오직 하나의 책임을 가져야 하며, 이는 클래스의 기능을 수정할 때 다른 클래스에 영향을 최소화합니다.
- 의존성 주입(Dependency Injection)을 사용: 의존성 주입은 클래스가 외부 의존성을 직접 생성하지 않고, 외부에서 주입받는 방식입니다. 이를 통해 클래스 간의 결합도를 낮출 수 있습니다.
다음은 낮은 결합도를 가진 클래스의 예제입니다.
class User:
def __init__(self, name):
self.name = name
def greet(self):
return f"Hello, {self.name}!"
class UserManager:
def __init__(self):
self.users = []
def add_user(self, user):
self.users.append(user)
def get_users(self):
return self.users
user1 = User("John")
user2 = User("Emma")
user_manager = UserManager()
user_manager.add_user(user1)
user_manager.add_user(user2)
users = user_manager.get_users()
for user in users:
print(user.greet())
위의 예제에서 User
클래스는 사용자 객체를 나타내며, UserManager
클래스는 사용자 객체를 관리하는 역할을 합니다. 이 두 클래스는 서로 독립적으로 존재하며, User
클래스가 변경되어도 UserManager
클래스에는 거의 영향을 주지 않습니다. 결합도가 낮아 코드의 유지 보수 및 확장이 용이하다는 장점을 가지게 됩니다.
높은 결합도를 가진 클래스
반면에 높은 결합도는 클래스 간의 의존성이 높은 경우를 의미합니다. 이는 하나의 클래스의 변경이 다른 클래스에 큰 영향을 주는 것을 의미하며, 이는 코드의 유지 보수 및 재사용성을 저하시킬 수 있습니다.
다음은 높은 결합도를 가진 클래스의 예제입니다.
class Order:
def __init__(self, id, amount):
self.id = id
self.amount = amount
def calculate_tax(self):
return self.amount * 0.1
class OrderManager:
def __init__(self):
self.orders = []
def add_order(self, order):
self.orders.append(order)
def get_total_tax(self):
total_tax = 0
for order in self.orders:
total_tax += order.calculate_tax()
return total_tax
order1 = Order(1, 100)
order2 = Order(2, 200)
order_manager = OrderManager()
order_manager.add_order(order1)
order_manager.add_order(order2)
total_tax = order_manager.get_total_tax()
print(f"Total tax: ${total_tax}")
위의 예제에서 Order
클래스는 주문을 나타내며, OrderManager
클래스는 주문 객체를 관리하고 주문의 총 세금을 계산합니다. 이 두 클래스는 밀접하게 결합되어 있으며, Order
클래스의 변경은 OrderManager
클래스에 영향을 주게 됩니다. 이러한 높은 결합도는 코드의 유연성과 재사용성을 저하시킬 수 있습니다.
결론
결합도는 클래스 간의 상호 작용과 의존성의 정도를 나타내는 중요한 개념입니다. 낮은 결합도를 가진 코드는 유지 보수와 재사용성이 좋으며, 단일 책임 원칙과 의존성 주입 등의 원칙을 따르는 것이 좋습니다. 반면에 높은 결합도는 코드의 유연성과 재사용성을 저하시킬 수 있으므로 최대한 낮은 결합도를 유지하도록 노력해야 합니다.