Shane, good question and I've seen it asked here quite a few times. There are a lots of reasons: lower memory image, increased speed, better maintainability, reuse, very amenable for time-slicing and multi-threading, "cleaner," inheritance, encapsulation, etc. (lots of stupid buzz words).
This is a really long answer and I hope you can follow most of it.
Depending on your background, this may make some sense to you: Let's say you have a job that requires you to drill three different holes in three different gizmos that come off an assembly line in random order. Gizmo A requires a 16 size bit, B requires a 20, and C requires a 32. With one drill you select the bit depending on the gizmo, chuck it up, drill the hole, un-chuck it, select a new bit for the next gizmo, etc.
You tell your boss, "this is dumb." So, you get three drills and chuck them up once when you get to work and un-chuck them before you go home. Great, problem solved.
Now your boss says the assembly line will start outputting 50 different gizmos requiring 50 different size holes. Crap. Organizing 50 different drills for each gizmo is going to be a nightmare and you just don't have the work space for all those damn drills.
This is where we move from reality into object oriented programming and magic.
If you could define the 1) chuck, 2) drill hole, and 3) un-chuck actions as "Gizmo" class functions and bit number as a member variable, life would be easy. All you need to do for each gizmo is to initialize the class, set the drill bit number, chuck the bit (just once) and you're good to go to town and drill. You un-chuck just once when you destroy your object.
For the entire Gizmo class (50 objects), the drill function is in reality just one drill (machine code) for the 50 objects. It actually occupies just one code space in physical memory--not 50. Likewise, there is just a single chuck and un-chuck function in memory--not 50.
This is the beauty, once you set the bit number and chuck it for each gizmo object, the drill function will be set for the specific gizmo you're drilling. Just identify the specific object and drill knowing that the bit number is correct and it has been properly chucked up.
So, you now have a magic drill. As you bring it to different objects (gizmos), the correct bit is already chucked. Wow, life is really good. Object oriented programming and classes are pretty handy.
I give you lots of credit if you followed the above. Good luck.