Procedural programming separates data and functions, which can cause problems for large complex programs. Object-oriented programming combines data and procedures into objects, encapsulating them together. An object's attributes are stored in member variables and its procedures are member functions. This encapsulation also allows for data hiding so only an object's own functions can access and change its internal data. Some advantages of OOP include easier management of complex software, simple upgrades, and partitioning work based on objects.