1. Intro
IoC(Inversion of Control)의 개념을 설명한다.
직역하면 IoC는 제어의 역전으로 불리우는데, 글자만 봐서는 도통 감이 오지 않는다.
따라서 이를 예제코드와, 그림과 함께 설명하도록 하겠다.
IoC를 설명하기 전에 알아야 할 것이 있다.
바로 이 것을 왜 사용하는데? 부터 출발을 해야할 것이다.
이유는 간단하다 OOP 원칙 중, Loosely coupled 원칙을 지키기 위해서!
Loosely coupled는 "느슨한 결합"이다. 객체 지향 프로그래밍의 중요한 원칙 중 하나이다.
나사를 덜 조이는 느슨한이 아닌, 상호 연관성이 있는 객체끼리 최대한 분리하겠다. 이 의미이다.
자동차를 생각해보라. 예를 들어 타이어와 휠을 분리해놓지 않았다면, 비교적 자주 갈아주는 타이어를 갈 때마다 휠을 같이 교체해야 했을 것이다.
이러한 참사를 막기위해 Loosely Coupled 원칙을 OOP에서는 고수하고 있다.
2. IoC Example
먼저 Strongly coupled의 예제를 보겠다.
package org.example.ioc;
public class Wheel {
private Tire myTire;
public Wheel()
{
this.myTire = new Tire();
}
}
<Code 1> Strongly coupled
위 <Code 1> 처럼 구성을 한다면 <Fig 1> 처럼 Whell Class가 Tire Field를 가지고 형태로 강하게 결합된 형태를 볼 수 있다. Wheel 클래스가 Tire클래스에 직접적으로 의존한다는 것을 알 수 있고, 현재로선 Tire의 제어권을 Wheel이 갖고 있는 것을 확인할 수 있다. (Tire클래스가 생성되는 시점은, Wheel의 생성자)
이를 Loosely Coupled로 변경해본다. (= IoC 한다)
package org.example.ioc;
public class IocWheel {
private Tire myTire;
public IocWheel(Tire tire)
{
this.myTire = tire;
}
}
<Code 2> Loosely coupled
당연하게도 위 <code 1>의 상황보다는 결합도가 약해진 것을 확인할 수 있고 또한 이는 제어가 역전된 것을 의미한다.
만약 테스트 코드에서는, 아래와 같이 사용할 수 있다.
Tier myTier = new Tier(); // dependency
Wheel myWheel = new Wheel(myTier);
코드를 보면,
myTier라는 dependency를 만들고, myWheel에 주입하지 않았는가?
이게 의존성 주입이라 불리는 Dependency injection이다.
3. IoC의 종류
<Fig 3>은 IoC의 종류를 의미한다.
Ref.
https://redcoder.tistory.com/198
https://bestowing.github.io/spring/Spring1/
https://stackoverflow.com/questions/3058/what-is-inversion-of-control
댓글