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

김주원·2020년 7월 11일
13

Java

목록 보기
1/2
post-thumbnail

들어가기에 앞서

이번 게시물에서는 객체 간의 강한 결합약한 결합에 대해 알아보고, 이것이 유지보수성으로 어떻게 직결되는가를 알아보기로 하자.

강한 결합

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

음..? 이게 무슨소리지?

백문이 불여일견! 예시를 통해 알아보도록 하자.

사람이 치킨을 먹는 모습을 클래스로 나타내면 다음과 같다.
(갑자기 치킨먹고싶네)
<Person.java>

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 클래스를 정의할 수 없게 되며
    1. Chicken 클래스를 다른 종류의 음식 클래스로 바꾸게 되면 Person 클래스의 코드 대부분이 변경되기 때문이다.

즉, Person 클래스가 Chicken 클래스에 의존하게 된다.
따라서 Person 클래스가 Chicken 클래스에 의존성이 존재한다고 하는 것이다.

그렇다면 단점 2의 예시를 살펴보자.
Person 클래스 안의 Chicken 클래스를 Pizza 클래스로 변경한다고 하면 코드의 변경은 다음과 같을 것이다.

위 변화를 보면, 멤버 변수 타입(클래스) 하나만 바꿨을 뿐인데 Person 클래스에 있는 대다수의 코드가 변경된다.

그렇기 때문에 강한 결합(강한 의존성) 이라고 하는 것이며,
이는 유지보수 측면에서 굉장히 좋지 않은 케이스라고 할 수 있다.

약한 결합

그렇다면 객체 간의 강한 결합을 약화시켜 약한 결합을 이룰 수 있게 하는 방법은 없을까?

해결책은 인터페이스(Interface)에 있다.
다음을 보자.

<Food.java>

public interface Food {
    void eat();
}

<Chicken.java>

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

<Pizza.java>

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

<Person.java>

public class Person {
    private Food food;

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

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

위와 같이 Food 인터페이스를 만들어 eat() 추상 메소드를 선언하여 Chicken 클래스와 Pizza 클래스에서 eat()를 구현하게 하면,
Chicken 오브젝트와 Pizza 오브젝트는 모두 Food 타입에 대입될 수 있으므로 Person 클래스에서 멤버변수 타입을 Food로 할 수 있게 된다.

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

이는 유지보수를 짱짱맨으로 만들어주는 지름길이다.

정리

  • 객체 간 강한 결합을 이루게 되면 멤버 변수에 대한 오브젝트 변경시 코드의 변경이 많이 일어나 유지보수에 좋지 않다.
  • 인터페이스를 통해 약한 결합을 이루게 하여 유지보수를 향상시킨다.

Java에서 객체 간 강한 결합과 약한 결합에 대해 알아보았다. 이는 Java뿐만 아니라 오브젝트를 지원하는 프로그래밍 언어라면 반드시 알아야 할 내용인 것 같다.
또한 이 개념은 Java 프레임워크인 Spring에서의 DI(의존성 주입), IoC(제어의 역전) 개념과 직결되는 내용이니, 확실히 짚고 넘어가는 것이 좋을 것 같다.

profile
자기계발 블로그

2개의 댓글

comment-user-thumbnail
2020년 7월 12일

좋은 글 감사합니다

1개의 답글