In most of the interviews this is the question one asks and most of us don’t know what is the straight answer for this question.
Not just from the interview perspective, it necessary to know why IOC (Inversion of control) is called so. Let’s start without much ado:
Whenever we start thinking of any application we do follow in the lines of high level modules and low level modules. High level modules depends low level modules to get of functionality. That's how its start is not?
Yeah, that's good design, because it has some kind of modularity because each low level component shall provide some specific functionality.
But the issue is high level modules is directly depend on the low level modules. So there is tight coupling, hence we cannot easily replace low level module if we wish to use some other module which provides the same functionality. It’s not flexible design.
So point here is, high level module depends on low level module.
Now how can we bring flexibility into the system?
Let’s introduce a layer of abstraction in between the high level modules and low level modules; such that high modules depend on the abstraction and where as low level modules implement functionality as per the abstraction.
So point here is, high level modules no longer depend on the low level modules (which now providing the implementation) instead they just depend on the abstraction.
That means to say that, whenever we need to replace the lower level component with the other component which implements the given abstraction, it doesn't involve much change (minor changes in configuration file in well designed application) and hence system becomes flexible.
But still not clear as, why it’s called Inversion of Control. Is not?
Yes that right. Still low level components are not depending on high level components instead they follow the abstraction to implement the functionality.
Now let’s make this abstraction are owned by high level modules. It’s also making sense they are the ones which uses implementation (low level modules) as per the required abstraction. So abstraction is dictated by the high level modules as they own them.
So with this approach of designing, high level modules no longer depend on the low level modules. Instead they depends low level depends on the high level modules as the implementation they have provide as per the abstraction owned by the high level components.
So the point here is, dependency has been inverted and hence the name, Inversion of Control (IOC).
Low level modules depend on high level modules making the system flexible.
Ref: More on Inversion of control on wikipedia.