Abstraction is the process of identifying the essential aspects of an entity and ignoring the
unimportant properties. In software engineering this means that we concentrate on what
an object is and what it does before we decide how it should be implemented. In this way
we delay implementation details for as long as possible, thereby avoiding commitments that
we may find restrictive at a later stage. There are two fundamental aspects of abstraction:
encapsulation and information hiding.