[Java] - 강한 결합과 약한 결합

링딩·2023년 4월 15일
0

Computer Science

목록 보기
32/49




강한 결합과 약한 결합


🔎 강한 결합이란?

◽ 정의

객체의 의존 관계에서 강한 결합이란, 어떠한 객체가 다른 객체에 강한 의존성을 가지고 있음을 뜻한다

ex) A클래스가 B클래스의 참조가 필요
-> A가 B에 의존한다. B는 A의 종속항목이다.

public class Person {
    private Chicken chicken;
    
    public Person() {
        this.chicken = new Chicken();
    }

    public void startEat() {
        chicken.eat();
    }
}

public class Chicken {
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

Person 클래스의 멤버변수 타입으로 Chicken 클래스가 존재한다.

여기서는 두 가지의 단점이 있다
1. Chicken 클래스가 없다면, Person 클래스를 정의할 수 없다.
2. Chicken 클래스를 다른 종류의 음식 클래스로 바꾼다면, Person 클래스의 대부분의 코드가 변경해야 한다...

  • 즉, Person 클래스가 Chicken 클래스에 의존하고 있다는 말 입니다.
  • Person 클래스가 Chicken 클래스에 의존성이 존재한다고 하는 것이다.

보다시피 멤버 변수 타입(클래스) 하나만 바꿨는데 불구하고, Person 클래스의 대다수의 코드가 변경된다.
=> 강한 결합(강한 의존성)을 띄는 코드로 유지보수 측면에서 굉장히 좋지 ❌


🔎 약한 결합이란?

그렇다면 결합이 너무 강하게 얽혀있으니 약한 결합을 만들어주면 안될까?

A. 인터페이스

<Food 인터페이스>

public interface Food {
    void eat();
}

<Chicken.class>

public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

<Pizza.class>

public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

<Person.class>

public class Person {
    private Food food;

    public Person(Food food) {
        this.food = food;
    }

    public void startEat() {
        food.eat();
    }
}
  • Food 인터페이스에 '추상 메소드' eat()을 선언하여 이를 Chicken과 Pizza 클래스에 구현한다.
    -> Person 클래스에서 이는 멤버변수 타입을 Food로 지정해 Chicken이나 Pizza 모두 대입이 가능하다.

◽ 정리

Person 클래스 내부적으로 코드의 변경이 일어날 필요 없이, '생성자'를 통해 객체를 받아 멤버변수에 대입하기만 하면 오브젝트를 변경 가능하게 해준다.
이로써 강한 결합이 아닌 약한 결합이 된다.

  1. 객체 간 강한 결합은 멤버 변수에 대한 오브젝트 변경시에 코드의 변경이 많이 이뤄진다.
    -> 유지보수에 좋지 ❌
  2. 인터페이스를 통해 약한 결합을 이루게 하여 유지보수를 향상

=> SRP, DIP를 위반한다고 볼 수 있다!!



출처

damiano1027님의 글을 참조하여 작성하였습니다.

profile
초짜 백엔드 개린이

0개의 댓글