UML is a notation to describe class hierarchies, activities, message sequences and uses cases (scenarios).
UML was created by the "three amigos": Grady Booch, Ivar Jacobson and James Rambaugh, considered the leading authorities in the field of Object Oriented Modeling. They originally developed their own notational systems for OO models, so there was a Booch notation, a Rambaugh notation etc. Over time they consolidated their methods, to avoid a "notation war", and jointly created the UML notation (the word "Unified" refers to the fact that three different notations were combined in UML).
UML class diagrams visually represent the classes of the model and their relationships such as
Generalization (i.e. inheritance), Association (use)
and Aggregation (containment). Aggregation can be simple or more specific such as Composition.
Multiplicities are also represented in UML.
Association: two classes are in a user-of relation ("uses-a").
The two classes are the client (user) and the supplier (helper) classes.
Aggregation: two classes are in a part-of relation ("has-a"),
in other words this represents the whole-part relationship.
The two classes are the container and the component classes.
If the contained and component objects can exsist independently, this is
implemented by aggregated objects.
Composition: a stronger form of aggregation: a component object can belong to only one container object and is constructed and destructed with the container object. It is implemented using pointers or references. Also known as containment.
Recently UML diagramming software has been developed and is generally available. Most of these tools include code generators that are capable of creating target language (e.g. C++, Java, VB, C# etc.) code from UML class diagrams (forward engineering). Some of these programs are two-way code generators in the sense that they are also capable of creating UML diagrams from existing code (reverse engineering).