Obsah
Veškeré hodnoty, s nimiž v programech pracujeme, můžeme rozdělit do několika skupin zvaných datové typy. Každý datový typ představuje množinu hodnot, nad kterými můžeme provádět společné operace a které mají společnou vnitřní reprezentaci. V případě programovacího jazyka Java máme k dispozici primitivní datové typy boolean, char, byte, short, int, long, float a double a konstrukci umožňující vytvořit pole. Chceme-li vytvořit nový datový typ, musíme nadefinovat třídu, jejímiž instancemi jsou pak objekty. Jednou z tříd, které nabízí standardně přímo jazyk Java, je třída String, reprezentující řetězce znaků.
Z hlediska programátorského se skutečná reprezentace primitivních hodnot a implementace operací mění od jedné platformy k druhé a od jednoho programovacího jazyka k druhému.
V případě objektů pak může rovněž existovat více možností, jak jej vnitřně reprezentovat a jak implementovat jeho metody. Abstraktní datový typ abstrahuje právě od těchto dvou vlastností - zajímají nás pouze hodnoty samotné, ať jsou reprezentovány jakkoliv, a operace, které můžeme nad těmito hodnotami provádět, a to bez ohledu na jejich implementaci. Takže abstraktní datový typ můžeme charakterizovat pouze jeho specifikací, bez dalších podrobností o tom, jak je tato specifikace implementována. Rozdíl mezi specifikací a implementací si ukážeme na příkladu, pro který na chvíli použijeme jazyk C.
V prvé řadě můžeme nad takto vytvořeným typem kromě uvedených tří operací provádět i všechny další operace, které jsou povolené pro typ int, neboť typ Time je pouze jeho synonymem. Ovšem jaký pak můžeme přisoudit význam operaci násobení mezi dvěma hodnotami typu Time? A co se stane, když k hodnotě typu Time rovnou přičteme 60? Hodnotu typu Time navíc nemusíme vytvořit funkcí createTime(), ale můžeme použít jakoukoliv celočíselnou hodnotu, bez ohledu na to, zda představuje platný čas nebo ne.
Jak tedy můžeme definovat lepší reprezentaci času? Je zřejmé, že musíme definovat typ, který umožňuje použít pouze námi dodané operace tak, aby uživatel nemohl zneužít informací, které má o vnitřní reprezentaci typu. To znamená, že nabídneme pouze jisté omezené rozhraní, pomocí kterého je možné s hodnotami námi definovaného typu pracovat. Veškeré další informace budou před uživatelem skryty.