강한 결합과 약한 결합은 소프트 웨어 디자인에서 객체간의 의존성을 나타내는 개념이다. 객체 지향 프로그래밍에서 중요한 요소 중 하나이며, 코드의 유지 보수 및 확장성, 재사용성에 영향을 미친다. 아래를 통해 예제와 함께 이 내용에 대해서 알아보자
1. 강한 결합(Strong Coupling)
강한 결합은 하나의 클래스가 다른 클래스의 영향을 강하게 받는 상태를 말한다. 한마디로 유지보수가 어렵고 코드의 재사용성과 확장성이 안 좋은 코드라고 할 수 있다.
아래의 예시를 통해 살펴보자.
만약 내가 햄버거, 피자, 콜라를 파는 음식점에 있다고 생각해보자. 내가 사용하는 키오스크의 주문버튼이 햄버거와 강한 결합으로 이루어져있다면 나는 주문 버튼을 통해 햄버거 밖에 주문을 할 수 없는 상황이다.
package java_blog_project;
class Hamberger {
public void OrderProcessed() {
System.out.println("햄버거 주문이 처리되었습니다.");
}
}
class Order {
private Hamberger hamberger; // 강한 결합
public Order() {
this.hamberger = new Hamberger(); // Customer 객체를 직접 생성
}
// 주문 처리 로직
public void processOrder() {
// 주문 처리 코드
hamberger.OrderProcessed(); // Customer 객체의 메서드를 직접 호출
}
}
public class Strong_coupling {
public static void main(String[] args) {
var order = new Order();
order.processOrder();
}
}
그렇다면 이문제를 해결하기 위한 방법은 어떤 것이 있을까?
바로 코드를 더 많이 사용하면된다. 그 방법은 아래와 같다.
package java_blog_project;
public class Strong_coupling {
public static void main(String[] args) {
var order = new Order();
order.processOrder();
}
}
class Hamberger {
...... 생략
}
class HambergerOrder {
...... 생략
}
class Pizza {
...... 생략
}
class PizzaOrder {
...... 생략
}
class Coke {
...... 생략
}
class CokeOrder {
...... 생략
}
물론 이런식으로 코드를 구성해도 아무런 문제 없이 작동한다. 하지만 음식의 종류만 다를뿐 Order 클래스의 내용은 모두 동일한다. 이러한 경우 코드의 재사용성을 높이는 방법이 바로 약한 결합(Weak Coupling)이다.
2. 약한 결합(Weak Coupling)
약한 결합은 하나의 클래스와 다른 클래스의 관계를 느슨하게 유지하는 것이다. 다시말해 클래스간의 의존성을 줄여 코드의 유지보수성과 재사용성을 올리는 방법이다.
방법은 아래와 같이 인터페이스를 추가하여 음식별 주문 클래스를 생성하지 않음으로서 코드의 재사용성을 올릴 수 있다.
interface Food {
void OrderProcessed();
}
class Hamberger implements Food {
public void OrderProcessed() {
System.out.println("햄버거 주문이 처리되었습니다.");
}
}
class Pizza implements Food {
public void OrderProcessed() {
System.out.println("피자 주문이 처리되었습니다.");
}
}
class Coke implements Food {
public void OrderProcessed() {
System.out.println("콜라 주문이 처리되었습니다.");
}
class Order {
private Food food; // 약한 결합
public Order(Food food) {
this.food = food; // Customer 객체를 직접 생성
}
// 주문 처리 로직
public void processOrder() {
// 주문 처리 코드
food.OrderProcessed(); // Customer 객체의 메서드를 직접 호출
}
}
public class Weak_coupling {
public static void main(String[] args) {
Food food = new Coke();
Order order = new Order(food);
order.processOrder();
}
}
지금은 줄어든 코드가 적어보일 수도 있으나 메뉴가 계속추가되는 식당의 경우를 예로들어 식당에 100개의 메뉴가 있다고 가정해보면 약한 결합의 Order 클래스는 모든 Food 인터페이스를 implements한 클래스를 입력이 가능해진다.
강한결합 코드 : 메뉴 클래스 100개 + 100개 주문 클래스
약한결합 코드 : 메뉴 클래스 100개 + 1개 주문클래스 + 1개 인터페이스
로 코드의 재사용성이 올라가고 코딩이 간편해진다.
'Back-end > JAVA' 카테고리의 다른 글
| [JAVA] 부동소수점에 대해 - 0.1 + 0.2 = 0.300...4? (0) | 2024.07.12 |
|---|---|
| [JAVA] 싱글톤 패턴(Singleton pattern) 사용법과 장단점 (0) | 2024.07.09 |
| [JAVA] 자바의 인터페이스(interface)란? 게임으로 알아보는 사용이유 (0) | 2024.07.04 |
| [JAVA] 접근 제어자(public, protected, default, private) (0) | 2024.07.03 |
| [JAVA] 오버로딩(Overloading), 오버라이딩(Overriding)이란? 차이점은? (0) | 2024.06.26 |
