아 이게 뭐임!

제어의 역전이 뭐임!! [Inversion of Control]

마로가마따 2021. 7. 26. 08:16

진짜 뭐냐구ㅜㅜㅠㅠㅜㅠㅜㅠㅜㅠㅜㅠㅜㅜㅠㅜ

 

Contents

-       제어의 역전이 뭐임!

-       의존성 주입이 뭐임??!

-       둘이 뭔 차이임?

 

 

 

제어의 역전 고양이

 

 

제어의 역전이 뭐임!!

 

제어의 역전은 하나의 설계 원칙입니다. 디자인 패턴이라고도 합니다.

 

프로그래머가 직접 객체의 생성과 소멸 객체간 관계같은 객체의 제어를 수행하는 것이 아니라, 여러  프레임워크, 컨테이너에서 제어를 수행하는 것 입니다.

 

확장 가능하고 모듈화된 프로그램을 구성하는 느슨한 결합을 달성하기 위해 다양한 종류의 컨트롤을 반전하는 것을 의미합니다.

 

여기에는 응용 프로그램의 흐름에 대한 제어와 개체 생성 또는 종속 개체 생성 및 바인딩의 흐름에 대한 제어가 포함됩니다.

 

이러한 제어의 역전은 클래스간의 결합을 느슨하게 설계하여 테스트가 가능하고 유지보수가 용이하게 만드는데 도움이 됩니다.

 

제어의 역전

 

 

의존성 주입은 또 뭐임!!

 

객체지향에서 다른객체를 사용하는것을 다른객체에 의존한다라고 표현합니다.

 

 

객체를 사용할 때 객체에서 다른 객체를 new 하여 직접 생성하는 방식이 있고.

객체 외부에서 new로 생성되어 객체 내부로 주입하여 사용하는  방식이 있습니다.

 

의존성 주입은 이중 객체 외부에서 내부로 주입받아서 사용하는 방식입니다.

 

예시를 보여드리겠습니다.

 

public  class Example {

    public static void strongUse(){ // 강한 결합
        Man man1 = new Man();
    }
    
    public static void weakUse(Man man){ // 약한 결합
    	Man man2 = man;
    }
}


class Man{
    String name;
    
    public Man() {}
}

 

Man이라는 클래스에 의존하는 strongUseweakUse를 만들었습니다.

 

클래스를 만들때 인스턴스화를 막기위해 private 생성자로 만드는데 이 예제에서 private으로 변경시켜 보면

 

public  class Example {

    public static void strongUse(){ // 강한 결합은 에러남
        Man man1 = new Man();
    }
    
    public static void weakUse(Man man){ // 약한 결합
    	Man man2 = man;
    }
}


class Man{
    String name;
    
    private Man() {}
}

 

실제로 구현해보면 강한 결합일 경우 에러가 나게 됩니다.

 

이처럼 의존성이 덕분에 아주 적은 부분의 변경이 줄줄이 에러코드를 토해내는 모습을 볼 수 있습니다. 게다가 JAVA(이클립스)의 에러코드는 사람이 읽기 좋은 편도 아닙니다...

 

 

그래서 이러한 강한 결합과 의존성의 문제를 잘 다루기 위해 Spring과 같은 프레임워크에서 웹을 구현하기 위한 많은 클래스들을 이미 구현해두고 개발자는 이를 주입받아서 사용할 수 있게 하였습니다.

 

 

 

둘이 뭔 차이임?!

 

둘의 차이점(?)을 잘 설명한 글이 있습니다.

 

실력자의 깊이 있는 설명을 원하시는 분들은 한번 가셔서 기사를 읽어보는 것을 추천드립니다.

 

 

요약하자면..

 

제어의 역전(Inversion of Control)은  일반적인 디자인 패턴 중 하나이고

 

의존성 주입(DI)는 이런 제어의 반전 패턴을 달성하는 방법 중 하나입니다.

 

 

 

 

 

 

 

 

 

 

반응형