AOP works in tandem with OOP. It's a good practice in OOP to handle only a single responsibility in a particular class – this principle is called the Single Responsibility Principle (applicable for modules/classes/methods). For example, if you are writing a Gear class in an automotive domain application, then the Gear class should only allow functions related to the gear object, or it should not be allowed to perform other functions such as braking. However, in programming models, often you need a feature/function that scatters across more than one class. In fact, sometimes, most classes use features such as logging or metrics.
Features such as logging, security, transaction management, and metrics are required across multiple classes/modules. The code of these features is scattered across multiple classes. In OOP, there is no way to abstract and encapsulate such features. This is where AOP helps you. These features (read aspects) are cross-cutting concerns that cut across multiple points in the object model. AOP provides a way to let you handle these aspects across multiple classes/modules.