Abstraction refers to the set of concepts that some entity provides for achieving a task or solve a problem (e.g., the public methods of Java's String class). Abstraction is the **most important concern** in [[object oriented programming]].
Abstraction is often accomplished early in the software engineering process during conceptual design.
Abstraction answers the questions
- how will users think about using what I develop?
- what mental model do I want to provide for them?
- What level of detail is needed?
- What responsibilities will classes in the design have?
- What will the connections be between elements, and which methods will be exposed?
[[Encapsulation]] supports abstraction, but abstraction is more than just encapsulation.