An Abstract Data Type is a programmer-defined data type that can be
manipulated in a manner similar to system-provided data types
- Must have the ability to instantiate many different copies of the data type.
 - Data type can be implemented using provided operations, without knowledge of
internal representation.