[Spring] Tight Coupling & Loose Coupling

Kang·2024년 7월 21일
post-thumbnail

결합(Coupling)이란?

무언가를 변경하는데 얼마나 많은 작업이 관련되어 있는지에 대한 측정

세상의 모든 물체는 다양한 요소들로 구성된다
= 하나의 클래스는 다양한 다른 클래스들로 구성된다.

다음과 같이 제품을 만드는 기계 클래스를 만든다고 했을때,

public class Machine {
    private Coupe coupe;
    
    Machine(Coupe coupe) {
        this.coupe = coupe;
    }
}

쿠페를 만드는 기계라고 한다면 Coupe클래스가 Machine 클래스의 구성요소로 들어가는 것을 알 수 있다.

그러나, 만약에 내가 쿠페를 만드는 기계에서 스포츠카를 만드는 기계로 바꾼다고 한다면 코드를 얼마나 많이 바꿔야할까?
정답은, 클래스간의 관계를 어떻게 결합하냐에 따라 달라진다.

기존 코드

쿠페를 만드는 기계 Class와 쿠페 Class는 다음과 같다.

class Coupe {
    public void ride(){
        System.out.println("Coupe is Shipped Out");
    }
}

public class Machine {
    
    private Coupe coupe;
    
    Machine(Coupe coupe) {
        this.coupe = coupe;
    }
    
    public void make() {
        coupe.ride();
    }
}

강한 결합 (Tight Coupling)

Sports 클래스로 변경 시

class Sports {
    public void ride(){
        System.out.println("Sports car is Shipped Out");
    }
}

public class Machine {
    
    private Sports sports;
    
    Machine(Sports sports) {
        this.sports = sports;
    }
    
    public void make() {
        sports.ride();
    }
}

단순히 만드는 차종을 바꿨을 뿐인데, 대부분의 Machine 클래스의 코드를 변경한 것을 알 수 있다. 지금은 기능이 많이 없고 연결된 클래스가 별로 없지만
실제 개발을 진행한다면?
코드를 바꾸는데 시간을 다 잡아먹을 수도 있다.

약한 결합 (Loose Coupling)

약한 결합에서의 핵심은 바로 Interface(인터페이스) 이다
생산하고자 하는 제품의 공통적인 내용을 인터페이스를 통해 구현하고, Machine클래스는 인터페이스를 사용하도록 하는 것!

Sports 클래스로 변경 시
< Car Interface >

public interface Car {
    void ride ();
}

< Machine class >

class Coupe implements Car {
    public void ride(){
        System.out.println("Coupe is Shipped Out");
    }
}

class Sports implements Car{
    public void ride(){
        System.out.println("Sports car is Shipped Out");
    }
}

public class Machine {
    
    private Car car;
    
    Machine(Car car) {
        this.car = car;
    }
    
    public void make() {
        car.ride();
    }
}

무엇이 좋을까?

좋다는 것은 기능을 변경하고자 할때, 코드의 수정을 많이 할 필요가 없는 것이 중요하다.
Loose Coupling을 사용할 경우,
< Main Class >

public class Main {

    public static void main(String[] args) {
		// 스포츠카를 만드는 기계
		Sports sports = new Sports();
        Machine Sports_machine = new Machine(sports);

		// 쿠페를 만드는 기계
        Coupe coupe = new Coupe();
        Machine Coupe_machine = new Machine(coupe);
    }
}

다음 코드처럼 Machine Class를 변경하지 않고 매개변수로 들어가는 클래스를 Sports에서 Coupe 클래스로만 변경하면 끝난다.

당연하게도, Machine 클래스를 바꿔야하는 Tight Coupling보다 훨씬 간단함을 알 수 있다.

결론

Tight Coupling 말고 Loose Coupling을 쓰자

코드의 유지보수의 편리성을 도모하자!

profile
개발자는 힘들어..

0개의 댓글