The term inversion of control refers to a set of patterns that can help us when we have a lot of regression bugs or when it's hard to redeploy our code.
The inconvenience of these patterns becomes clear when we add more complexity to our applications; if they are not well used and understood, they can generate big performance issues and can be hard to debug.
When using inversion of control patterns, we want to invert the control that our classes have on their dependencies. The problem is that when we use classes inside other classes, modifying the low-level classes will impact the high-level classes.
That's why we would prefer to have a dependency on an abstraction rather than a concrete implementation.
IOC is a way of ...