Data abstraction refers to providing only essential information to the outside world and hiding background details. It is a technique that separates an interface from its implementation, so that the interface remains intact even if the underlying implementation changes. For example, a program can call a sorting function without knowing the specific sorting algorithm, and the algorithm could change without affecting the program. Data abstraction also protects class internals from errors and allows the implementation to evolve over time without requiring changes to user-level code.