소프트웨어 엔지니어링의 주요 원칙 중 하나는 클래스가 최소한의 상호 의존성, 즉 낮은 결합성을 가져야 한다는 것이다. IoC(Inversion of Control)는 클래스가 느슨하게 결합되어 테스트 및 유지 관리가 더 쉬워지는 설계 원칙이다.
기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다.
반면에 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다. 이러한 제어의 역전은 클래스간의 결합을 느슨하게 설계하여 테스트와 유지보수가 용이하게 만드는데 도움이 된다.