웹개발/JAVA

결합도(Coupling)와 응집도(Cohesion)

bergerac 2025. 3. 5. 09:11

결합도(Coupling)

  • 모듈(클래스 또는 함수) 간의 연결 정도를 나타내는 지표
  • 낮을수록(Loose Coupling) 좋음 → 유지보수성과 확장성이 높아짐
  • 높은 결합도(Tight Coupling)는 하나의 변경이 다른 모듈에도 영향을 미쳐 유지보수가 어려움

응집도(Cohesion)

  • 모듈 내부 구성 요소(메서드, 변수 등) 간의 연관성을 나타내는 지표
  • 높을수록(High Cohesion) 좋음 → 모듈이 하나의 명확한 역할을 수행
  • 낮은 응집도(Low Cohesion)는 모듈이 여러 역할을 수행하여 복잡도가 증가

즉, 결합도가 낮을수록, 응집도가 높을수록 좋은 설계이다. 

각 클래스나 모듈이 독립적으로 동작하고 본인의 역할에 충실할 때 클래스 간의 의존성을 줄이고 변경에 강한 구조를 작성한다.

 

<결합도 낮추는 Approach>

1. 인터페이스를 활용한 결합도 낮추기

  --클래스가 직접 객체를 생성하지 않고 외부에서 객체를 주입받도록 설계한다.

   객체 간의 강한 결합은 줄이고 변경에 유연하게 대처한다. 

2. 하나의 클래스에서는 하나의 기능만 담당하게 하여 응집도 높이기

   Attendance의 경우에는 공연장에 갔는지 여부만 확인

     act의 경우엔 어떤 넘버가 공연되고 있는지만 확인

 

interface Musical{
    void act(String sceneMusicTitle);
    String getMusicalName();
}


class Cyrano implements Musical{

    @Override
    public void act(String sceneMusicTitle) {
        System.out.println("시라노의 " + sceneMusicTitle+"넘버가 공연중 입니다.");
    }

    @Override
    public String getMusicalName() {
        return "시라노";
    }
}

class JekyllAndHyde implements Musical{

    @Override
    public void act(String sceneMusicTitle) {
        System.out.println("지킬앤 하이드의 "+sceneMusicTitle+"넘버가 공연중 입니다.");
    }

    @Override
    public String getMusicalName() {
        return "지킬앤 하이드";
    }
}

class ArtCenter{
    private Musical musical;
    public ArtCenter(Musical musical){
        this.musical = musical;
    }
    public void listenMusic(String sceneMusicTitle){
        musical.act(sceneMusicTitle);
    }
}

class Audience{
    private String name;

    public Audience(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Attendance{
    public void checkAttendance(Musical musical, Audience audience){
        if(audience == null) {
            System.out.println("공연을 보러 온 관객이 없습니다.");
        }else{
        System.out.println(audience.getName()+"이"+ musical.getMusicalName()+"공연을 보러 왔습니다.");}
    }
}

public class D_Coupling_Cohension {
    public static void main(String[] args) {
        Audience audience1 = new Audience("Bergerac");
        Audience audience2 = new Audience("Christian");

        Musical cyrano = new Cyrano();
        Musical jekyllAndHyde = new JekyllAndHyde();

        Attendance attendance = new Attendance();
        attendance.checkAttendance(cyrano,audience1);
        attendance.checkAttendance(cyrano,audience2);

        cyrano.act("Bring me Giant");

    }
}

'웹개발 > JAVA' 카테고리의 다른 글

람다식(Lambda)– 기본 문법  (1) 2025.03.07
내부 클래스(Inner Class, Nested Class)  (1) 2025.03.06
SOLID 원칙  (0) 2025.03.04
API - Java Util Package  (1) 2025.03.03
API -JavaTime Package  (1) 2025.03.02