티스토리 뷰

Goal

 - Dependency Injection (의존 주입)에 대해 알아본다

 - 클래스의 강한 결합과 약한 결합에 대해 알아본다

 - 클래스의 강한 결합과 약한결합을 코드 예시를 통해 알아본다

 

1. Dependency Injection (의존 주입 )

 - Java 객체 프로그래밍에서 매우 중요한 개념으로, 어떠한 객체가 다른 객체를 사용하는 것을 그 객체에 의존한다고 표현한다. 

 

2. 클래스의 강한 결합, 약한 결합

 - 다른 객체를 사용하기 위해서는 객체를 직접 생성하거나 생성되어 있는 개체가 있어야 한다.

 - 내가 직접 생성하여 다른 객체를 사용하는 것을 클래스의 강한 결합, 미리 만들어져 있는 것을 할당받아 사용하는 것을 약한 결합이라 한다.

 

2-1 강한 결합 

  - A객체는 갑 B, C 객체는 을인 관계 즉, A객체가 B,C 객체의 기능이 필요할 때 직접 만들어 사용하는 관계를 강한 결합 관계라고 한다.

  - 갑을 관계에 따라 A객체는 B, C객체의 기능을 만들어 사용하지만 결과적으로 A객체는 B, C객체의 기능이 필요하기 때문에 A객체가 B,C객체에 의존한다고 표현할 수 있다.

2-2 약한 결합

 - A객체가 을이고 B, C객체를 갖고 있는 누군가가 갑인 관계를 약한 결합 관계라고 한다.

 - 을인 A객체가 B, C객체의 기능이 필요해 갑에게 요청하면 갑이 A객체에게 B, C객체의 기능을 

주입시켜 주는 구조이며 이러한 클래스의 주입 행위를 의존 주입이라 한다.

 - B, C객체를 A객체에 주입해줌으로써 A객체는 B, C의 기능을 사용할 수 있게 된다.

 

이처럼 객체간의 의존관계에서 객체를 직접생성하면, 생성부터 메모리 관리를 위한 소멸까지 해당 객체의 라이프 사이클을 개발자가 다 관리해야 하며,

 

이미 누군가가 생성한 객체를 주입받으면 사용만하면되기 때문에 개발자가 관리할 것이 적어진다는 장점이 있다.

 

3. 강한결합, 약한 결합 코드 예시 (Java)

 

 1) 강한결합과 약한결합 1

package dependencyinjection;

import java.util.Date;

public class UnderstandDI {

    public static void main(String[] args) {


    }

    // 2. 강한 결합 (직접 생성)
    public static void memberUse1() {
        Member m1 = new Member();
    }
    
    // 3. 약한 결합 (생성된 것을 주입 받음 - 의존 주입)
    public static void memberUse2(Member m) {
        Member m2 = m;
    }

}
// 1. 의존해야할 기능이 있는 class 정의
class Member {
    String name;
    String nickname;
    public Member() {  
        
    }
}

 2) 강한결합과 약한결합 2

  - 자바에서 제공하는 API또는 프레임워크에서 제공하는 기능에도 DI 개념을 적용할 수 있음

  - Date : 자바에서 제공하는 클래스

package dependencyinjection;

import java.util.Date;

public class UnderstandDI {

    public static void main(String[] args) {
        
        // 기존의 API또는 프레임워크에서 제공하는 기능도 DI개념을 적용할 수 있음
        Date date = new Date(); // Date클래스를 직접 생성하여 사용함 : 강한 결합
        System.out.println(date); 
        
        

    }
    public static void getDate(Date d) { // 약한결합
        Date date = d;
        System.out.println(date);
    }
}
    

 3) 약한 결합의 장점

  - 클래스를 이용할 때 해당 클래스의 생성자를 private로 선언하면, 직접 클래스를 생성하는 강한 결합의 경우 생성자에 접근할 수 없어 에러가 발생할 수 있음.

 - 약한 결합의 경우에는 이미 생성된 클래스를 주입받기 때문에, 객체의 라이프 사이클중 생성단계를 고려할 필요가 없으므로 에러가 발생하지 않는다.

package dependencyinjection;

import java.util.Date;

public class UnderstandDI {

    public static void main(String[] args) {


    }

    // 2. 강한 결합 (직접 생성)
    public static void memberUse1() {
        Member m1 = new Member();
    }
    
    // 3. 약한 결합 (생성된 것을 주입 받음 - 의존 주입)
    public static void memberUse2(Member m) {
        Member m2 = m;
    }

}
// 1. 의존해야할 기능이 있는 class 정의
class Member {
    String name;
    String nickname;
    /*
     * private으로 선언할 경우 약한 결합에는 error가 발생하지 않음
     * 약한 결합은 만들어져 있는 인스턴스를 주입받기 때문에, 만들어질지 아닐지 걱정할 필요가 없기 때문
     * 약한 결합을 사용하는 프로그래밍은 다른 클래스의 변화에 보다 더안전하고 유연하게 대처할 수 있음
     */
    private Member() {  
        
    }
}
댓글