First off, anything beyond a single machine code instruction is essentially abstraction--a while...do loop is an consistent symbolic way of representing the comparisons and address calls required to repeat a set of instructions until a condition is met. Likewise the int type is an abstraction for X number of bits (depending on your system). Programming is all about abstraction.
You'd probably agree that those primitive abstractions are mighty useful. Well, so is being able to build your own. OOAD and OOP are all about.
Suppose you've got a requirement where the users want to be able to export the data from a screen in a variety of formats: delimited text, excel, and pdf. Isn't it handy that you can create an interface called "Exporter" with a method export(data), based on which you can build a DelimitedTextExporter, an ExcelExporter, and a PDFExporter, each of which knows how to create it's particular output? All the calling program needs to know is that it can call the export(data) method, and whichever implementation is used will do its thing. Moreover, if the delimited text rules change, you can change the DelimitedTextExporter without having to mess with the ExcelExporter, possibly breaking it.
Pretty much all of the well known design patterns used in OO programming depend on abstraction. I'd recommend reading Freeman and Freeman's Head First Design Patterns to get a better feeling for why abstraction is a good thing