a data type that specifies values that can be stores and operations that can be done on the values; created by programmers
data types created by the programmer. they have their own range (or domain) of data and their own sets of operations that may be performed on them. p 593
describe how methods should modify the stored data, without specifying what underlying actions are required