강한 결합 vs. 느슨한 결합

Ga0·2023년 4월 8일
0

java

목록 보기
2/6

강한 결합 vs. 느슨한 결합

  • 결합도를 설명하기 앞서, 결합도를 알기 위해서는 모듈화라는 것을 알아야하는데, 모둘화란 무엇일까?
  • 모듈화란?
    • 소프트웨어를 기능별로 나누는 것
    • 목적에 맞는 기능만으로 모듈을 나눠 서로 다른 모듈들과 적게 연관된다면 그것은 좋은 모듈화를 의미한다. (연관성이 낮아지면, 독립성은 강해진다)
  • 이러한 모듈 독립성은 결합도응집도로 측정한다.
    • 결합도 : 서로 다른 모듈간의 상호 의존 정도
    • 응집도 : 모듈 내부 요소들의 서로 관련되어 있는 정도
    • 설명에서 느껴지는 것처럼, 높은 모듈의 독립성은 낮은 결합도와 높은 응집도으로부터 만들어진다.
    • 쉽게말해서, 내부(모듈 안)는 똘똘뭉치는 게 좋고, 외부(모듈 간)는 서로 좀 떨어지는게 좋다.

아무리 이론으로 설명을 해도 사실 나는 잘 이해 못해서, 코드로 추가 설명을 하고자 한다.
코드에 대한 설명은 아래와 같다

강한 결합

import java.io.*;

class CPU{
    private DEEPCOOL_LS720_ARGB deepcooler;

    public CPU(){
        this.deepcooler = new DEEPCOOL_LS720_ARGB();
    }

    public void turnOn(){
        deepcooler.spinning();
    }
}

class DEEPCOOL_LS720_ARGB{
    public void spinning(){
        System.out.println("[DLA]쿨러 동작중");
    }
}

class Thermalright_Peerless_Assassin_120_SE{
    public void spinning(){
        System.out.println("[TPA]쿨러 동작중");
    }
}
  • 예시를 CPU쿨러로 들어보자.
  • CPU가 있고, CPU의 잦은 연산으로 인해 생기는 발열을 냉각해주는 쿨러가 장착되어있다 하자.
  • class명은 그냥 그러한 쿨러 이름이 있는거니, 그냥 넘어가고... 다시 설명을 이어나가면
  • 현재 CPU 클래스는 DEEPCOOL_LS720_ARGB 이라는 쿨러 클래스를 멤버변수로 가지고 있으면 turnOn()이라는 메서드를 통해 멤버변수의 Spining()메서드를 호출할 수 있다.

위의 문제점은?
1. DEEPCOOL_LS720_ARGB클래스가 없으면 Person 클래스를 생성할 수 없다(= 정의할 수없다는 뜻)
2. 만약, DEEPCOOL_LS720_ARGB이 아닌 Thermalright_Peerless_Assassin_120_SE모델의 쿨러로 바꾸고 싶다면 많은 코드 수정이 필요하다.

import java.io.*;

class CPU{
    private Thermalright_Peerless_Assassin_120_SE pearlessAssassinCooler; //(고친 부분)

    public CPU(){
        this.pearlessAssassinCooler 
        	= new Thermalright_Peerless_Assassin_120_SE(); //(고친 부분)
    }

    public void turnOn(){
        pearlessAssassinCooler.spinning(); //(고친 부분)
    }
}

class DEEPCOOL_LS720_ARGB{
    public void spinning(){
        System.out.println("[DLA]쿨러 동작중");
    }
}

class Thermalright_Peerless_Assassin_120_SE{
    public void spinning(){
        System.out.println("[TPA]쿨러 동작중");
    }
}

=> 이러한 것이 바로 강한 결합(=유지보수 측면에서 매우 안좋음)이라고 한다.

느슨한 결합

  • 강한 결합의 문제점을 해결할 수 있는 것이 바로 인터페이스이다.
interface Cooler{
    void spinning();
}

class CPU{
    private Cooler cooler;

    public CPU(Cooler cooler){
        this.cooler = cooler;
    }

    public void turnOn(){
        cooler.spinning();
    }
}

class DEEPCOOL_LS720_ARGB implements Cooler{
    public void spinning(){
        System.out.println("[DLA]쿨러 동작중");
    }
}

class Thermalright_Peerless_Assassin_120_SE implements Cooler {
    public void spinning() {
        System.out.println("[TPA]쿨러 동작중");
    }
}
  • Cooler라는 인터페이스를 만들어서 spinning이라는 추상메서드를 선언했다.
    각각의 DEEPCOOL_LS720_ARGB, Thermalright_Peerless_Assassin_120_SE클래스는 이를 구현하며, 각각의 클래스는 Cooler타입에 대입이 될 수 있으므로 CPU 클래스 내부 코드 변경없이 해당 클래스 멤버변수만 객체로 받아 대입하면 되므로 편리해졌다!

=> 다시말해, CPU는 해당 cooler가 어느 모델인지 알필요가 없다는 뜻,,,(그냥 자신을 시원하게 해주는 대상이라면 OK...)

  • 맞게 이해한지는 모르겠지만 강한결합 vs. 느슨한 결합의 POST는 여기서 마친다!
    (혹시, 이건 아닌데? 하는 부분이 있다면 댓글로 알려주세요😊😊)

0개의 댓글