Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java의 강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling) 차이점 완벽 정리

강한 결합(Tight Coupling)은 클래스와 객체가 서로 깊게 의존하는 상태를 의미합니다. 일반적으로 강한 결합은 코드의 유연성과 재사용성을 떨어뜨리기 때문에 바람직하지 않습니다. 반면 느슨한 결합(Loose Coupling)은 한 클래스가 다른 클래스에 직접 의존하는 정도를 줄여서, 변경의 영향을 최소화하는 설계 방식입니다.

강한 결합(Tight Coupling)

  • 강하게 결합된 객체는 다른 객체의 내부 정보를 알아야 하며, 서로의 인터페이스에 높은 수준으로 의존합니다.
  • 강하게 결합된 애플리케이션에서는 하나의 객체를 수정하면 여러 다른 객체들도 연쇄적으로 수정해야 하는 경우가 많습니다.
  • 소규모 애플리케이션에서는 변경 사항을 쉽게 파악할 수 있지만, 대규모 애플리케이션에서는 이러한 상호 의존 관계를 모든 개발자가 알기 어렵고, 변경 사항을 놓칠 가능성이 커집니다.

강한 결합 예제

class A {
    public int a = 0;
    public int getA() {
        System.out.println("getA() method");
        return a;
    }
    public void setA(int aa) {
        if(!(aa > 10))
            a = aa;
    }
}
public class B {
    public static void main(String[] args) {
        A aObject = new A();
        aObject.a = 100; // 클래스 A의 규칙에 어긋나는 접근, 이것이 강한 결합의 문제
        System.out.println("aObject.a value is: " + aObject.a);
    }
}

위 예제는 전형적인 강한 결합 구조로, 권장되지 않는 방식입니다. 클래스 B가 클래스 A의 내부 세부 사항(변수 a)을 직접 알고 있기 때문입니다. 만약 클래스 A에서 변수 aprivate으로 변경하면 클래스 B는 즉시 컴파일 오류가 발생합니다. 또한 클래스 A의 설계 의도는 변수 a가 10을 초과하지 않도록 하는 것이지만, 외부에서 변수에 직접 접근할 수 있기 때문에 이 규칙을 강제할 방법이 없습니다.

실행 결과

aObject.a value is: 100

느슨한 결합(Loose Coupling)

  • 느슨한 결합은 시스템을 구성하는 컴포넌트 간의 상호 의존성을 줄여, 한 컴포넌트의 변경이 다른 컴포넌트의 변경으로 이어질 위험을 낮추는 것이 목표인 설계 원칙입니다.
  • 느슨한 결합은 시스템의 유연성을 높이고 유지보수성을 개선하며, 프레임워크 전체를 더욱 안정적으로 만드는 포괄적인 개념입니다.

느슨한 결합 예제

class A {
    private int a = 0;
    public int getA() {
        System.out.println("getA() method");
        return a;
    }
    public void setA(int aa) {
        if(!(aa > 10))
            a = aa;
    }
}
public class B {
    public static void main(String[] args) {
        A aObject = new A();
        aObject.setA(100); // 규칙에 의해 값이 설정되지 않음
                           // setA() 호출이 실패하므로 'a'는 그대로 유지됨
        System.out.println("aObject value is: " + aObject.getA());
    }
}

위 예제는 느슨한 결합 구조로, 권장되는 방식입니다. 변수 aprivate으로 선언되어 있어 클래스 B는 반드시 클래스 A가 제공하는 메서드(setA(), getA())를 통해서만 상태에 접근해야 합니다. 덕분에 클래스 A 내부 구현이 변경되더라도 클래스 B는 영향을 받지 않으며, 유효성 검사 규칙도 메서드 내부에서 확실하게 강제됩니다. 이것이 바로 캡슐화(Encapsulation)를 통해 느슨한 결합을 실현하는 핵심 원리입니다.

실행 결과

getA() method
aObject value is: 0

정리: 두 결합 방식의 비교

구분강한 결합느슨한 결합
의존성내부 구현까지 직접 의존공개된 인터페이스를 통해서만 의존
변경 영향한 곳의 수정이 여러 곳에 연쇄 영향변경 영향이 최소화됨
유지보수성낮음높음
재사용성낮음높음
권장 여부지양권장

결론적으로, Java에서는 변수를 private으로 선언하고 getter/setter 등 공개된 메서드를 통해 상태에 접근하도록 설계함으로써 느슨한 결합을 달성할 수 있습니다. 이는 객체 지향 설계의 기본 원칙 중 하나인 캡슐화와 직결되며, 대규모 시스템일수록 그 중요성이 더욱 커집니다.