# Attribut (UML)

Ein Attribut (englisch attribute) ist ein Begriff in der Unified Modeling Language (UML), einer Modellierungssprache für Software und andere Systeme.
Ein Attribut ist ein strukturelles Merkmal einer Klasse und spezifiziert damit einen Teil der Struktur von Objekten, die für diese Klasse gebildet werden. Es hat einen Namen und einen Typ. Falls beispielsweise eine Klasse Konto ein Attribut mit dem Namen saldo vom Typ Integer hat, wird in der Struktur jedes Objekts von Konto ein entsprechender Saldowert aufgeführt sein. Mit UML 2.0 kann jedes typisierte Attribut als gerichtete Assoziation auf die entsprechende Klasse (als einfachen Datentyp oder Referenztyp) mit dem Rollenbezeichner als Attributnamen aufgefasst und in der grafischen Notation äquivalent dargestellt werden.
Ein Attribut ist kein eigenständiges Modellelement im Metamodell der UML2, sondern eine Rolle, die eine sogenannte Eigenschaft (Property) bei einer Klasse spielen kann.

## Multiplizitäten

Ein Attribut hat eine Multiplizität, die durch eine untere und eine obere Grenze spezifiziert wird.
Der Standardwert für die Multiplizität ist 1 für die untere wie für die obere Grenze. Bei der Spezifikation eines Attributs kann man von diesen Standardwerten abweichen. Damit drückt man aus, dass eine Instanz der Klasse nicht genau einen Wert für dieses Attribut hat, sondern eine Anzahl Werte, die irgendwo zwischen der unteren und der oberen Schranke liegt.
Ein optionales Attribut ist ein Attribut mit Multiplizität 0..1. Ein mehrwertiges Attribut ist ein Attribut, mit einer oberen Schranke größer als 1. Bei einem mehrwertigen Attribut kann man spezifizieren, ob die Werte des Attributs geordnet (isOrdered) sind oder nicht. Der Standardwert ist nicht geordnet. Weiter kann man spezifizieren, ob in den Werten eines Attributs jeder Wert höchstens einmal vorkommen darf (isUnique).

## Attribute mit ausschließlich lesendem Zugriff und abgeleitete Attribute

Auf ein Attribut kann nur lesend zugegriffen werden, wenn die Eigenschaft isReadOnly auf den Wert true gesetzt ist. Ohne entsprechende Deklaration sind schreibende und lesende Zugriffe gemeint.
Ein Attribut ist abgeleitet (isDerived), wenn die Werte des Attributs aus den Werten anderer Attribute berechnet werden (können). In der graphischen Notation wird ein abgeleitetes Attribut mit einem vorangestellten Schrägstrich markiert.

## Attribute für Instanzen und für Klassen

Definiert im Kontext einer Klasse, beschreiben Attribute normalerweise Instanzen dieser Klasse, nicht die Klasse selbst. Attribute, die die Klasse beschreiben, werden Klassenattribute genannt. Sie unterscheiden sich von den anderen Attributen dadurch, dass die Eigenschaft isStatic des Attributs auf den Wert true gesetzt ist. In der graphischen Notation werden Klassenattribute unterstrichen.

## Notation

Blaue Texte in den folgenden Abbildungen sind erläuternde Kommentare und gehören nicht zur Notation der UML2.
Attribute werden im Rechteck einer Klasse in einem speziellen Abschnitt aufgeführt.
Die folgende Abbildung zeigt eine Klasse mit zwei Attributen, die mit verschiedenen Notationsdetails dekoriert sind.
Die folgende Abbildung zeigt eine Klasse mit einem Klassenattribut, das einen Initialwert hat. Klassenattribute werden unterstrichen, um sie von den anderen Attributen abzugrenzen.

## Unterschiede zur UML 1.4

Das Konzept der Multiplizität von Attributen wurde in der UML2 vereinfacht. In der UML 1.4 konnte die Multiplizität eines Attributs aus mehreren unzusammenhängenden Zahlenabschnitten bestehen, zum Beispiel 0..5, 9..*, also aus allen Zahlen ohne 6, 7 und 8. In der UML2 sind mehrere Bereiche mit einer unteren und einer oberen Schranke nicht mehr möglich. Die Multiplizität muss aus genau einem zusammenhängenden Zahlenbereich bestehen.
Das Konzept eines nur lesbaren Attributs gab es auch schon in der UML 1.4, nur ist es dort nicht mit der Eigenschaft isReadOnly, sondern mit der Eigenschaft changeability = frozen spezifiziert. Analog wurde ein geordnetes Attribut nicht mit isOrdered, sondern mit ordering = ordered deklariert.
Auch das Konzept eines abgeleiteten Attributs ist schon aus der UML 1.4 bekannt. Dort konnte man entsprechende Attribute aber nur visuell kennzeichnen. Eine Eigenschaft isDerived war nicht vorhanden.
Klassenattribute waren in der UML 1.4 ebenfalls bekannt. Sie wurden dort jedoch von Attributen für die Beschreibung von Instanzen unterschieden, indem die Eigenschaft ownerScope auf den Wert classifier gesetzt wurde.