Keylearnings:
- Was ist eine Funktion bzw. Methode?
- Was ist die Parameterliste einer Funktion?
- Was ist der Rückgabewert einer Funktion?
- Gibt es einen Unterschied zwischen einer Funktion und einer Methode?
Erwischt! Du führst gerade eine Funktion aus!!
Was ich?
Ja du!! Und das finde ich super!
Lass mich das erklären!
Du schaust dir gerade die Seite www.codeadventurer.de (Danke dafür!!) in deinem Webbrowser an. Dies ist nur möglich, weil dein Browser eine Funktion verwendet, mit der der HTML Code (die Beschreibungssprache einer Webseite) in das umgewandelt wird was du gerade auf dem Bildschirm siehst.
Selbstveständlich kann dein Browser auch andere Webseiten, wie z.B. facebook oder Google darstellen.
Mit jeder dieser Seiten muss der Browser dasselbe Prozedre durchführen. Immer muss der HTML Code in das übersetzt werden, was du auf deinem Bildschirm siehst.
Es gibt also drei Programme, eines für codeadventurer.de, ein zweites für google und ein drittes für facebook, welches den HTML Code der jeweiligen Seite übesetzt.
NEIN!!!! Das ist natürlich blanker Unsinn!
Danke Funktion!
Funktionen ermöglichen es uns den SELBEN Programmcode auf unterschiedliche Eingabedaten anzuwenden.
Der Programmcode, der den HTML-Code übersetzt und im Browser darstellt, muss also nur ein EINZIGES mal geschrieben werden und kann dann mit Hilfe von Funktionen auf jedes HTML-Dokument der Welt angewendet werden.
Wie ist eine Funktion aufgebaut?
Eine Funktion hat drei wesentliche Bestandteile:
- Übergabeparameter (Parameterliste)
- einen Funktionsnamen
- genau einen Rückgabewert
In unserem Beispiel gibt es genau einen Übergabeparameter, der den Namen der aufzurufenden Seite also codeadventurer.de, google.de oder facebook.com annimmt.
Ein sinnvoller Funktionsname wäre z.B. HTMLSeiteAnzeigen
. Der Rückgabewert ist dann die aus dem HTML -Code übersetzte Seite, die du auf dem Bildschirm siehst.
Am besten kann man sich den Aufbau einer Funktion anhand einer Skizze veranschaulichen.
Die Skizze zeigt den Funktionskopf einer Funktion in JAVA. Aber keine Bange, wenn du das verstanden hast, dann wirst du auch in jeder anderen Programmiersprache damit keine Probleme haben.
Lass uns mit einem Köpper vom 10er ins eiskalte Wasser springen! Schauen wir uns an, wie Funktionen in Java verwendet werden.
Wir gehen in zwei Schritten vor. Als erstes werde ich dir zeigen wie du eine eigene Funktion erstellst. Anschließend wirst du sehen wie man diese dann auf verschiedene Eingadaten anwendet.
Die Funktionsdefinition!
Achtung ! Jetzt kommt eine JAVA Funktion!
1: public static boolean genugGeld(double dKontoStand, double dBetrag){ 2: if (dKontoStand >= dBetrag){ 3: return true; 4: }else{ 5: return false; 6: } 7:}
Streng dich an! 😉 Hast du eine Vorstellung wofür das gut ist?
Du erinnerst dich bestimmt an Franka’s Bohrmaschine. Franka’s Bohrmaschine kostete 190
Euro, welche sie sich natürlich nur leisten kann, wenn sie genügend Geld auf ihrem Konto hat.
Über die Funktion genugGeld
können wir überprüfen, ob ein bestimmter Geldbetrag von Franka’s Konto gedeckt werden kann. Das passiert über eine if-Abfrage
, die überprüft, ob der Betrag für die Kosten der Bohrmaschine kleiner oder gleich dem Kontostand ist.
Ist die Bedingung erfüllt, ist der Rückgabewert der Funktion der Wahrheitswert true
andernfalls false
.
Also tun wir Butter bei die Fische!
Der Funktionsaufruf!
1:if (genugGeld(1500.99,190) == true){ 2: System.out.println("Franka freut sich über eine neue Bohrmaschine!"); 3:}else{ 4: System.out.println("Franka kann sich leider keine Bohrmaschine kaufen!"); 5:}
Gleich vorweg! Die Ausgabe dieses Programms ist "Franka freut sich über eine neue Bohrmaschine!"
.
In dem Bedingungsteil der if..then..else Anweisung rufen wir die Funktion genugGeld
auf wodurch der Programmcode in der Funktionsdefinition, der zwischen dem ersten Paar geschweifter Klammern steht (Zeile 2 bis 6) ausgeführt wird. Diesen Teil nennt man Funktionsrumpf.
Welche Werte haben die Variablen dKontostand
und dBetrag
?
Hier kommen die Parameter innerhalb der Klammern direkt nach dem Funktionsnamen, die der Fachmann Parameterliste nennt ins Spiel.
Entscheidend ist hier der Kopf der Funktion.
public static boolean genugGeld(double dKontoStand, double dBetrag)
Vergiss bitte im Moment die Schlüsselwörter public
und static
. Hierzu kommen wir später.
Du musst auf die Reihenfolge achten, in der die Parameter in der Parameterliste stehen!
In den Klammern nach dem Funktionsnamen genugGeld
, also in der Parameterliste, steht an erster Stelle die Variable dKontoStand
.
In unserem Funktionsaufruf haben wir an erster Stelle den Wert 1500.99
stehen, weshalb dKontoStand
den Wert 1500.99
zugewiesen bekommt.
An zweiter Stelle, der Fachmann redet von Parameter Nummer zwei, steht die Variable dBetrag
. Um herauszufinden, welchen Wert diese Variable bekommt müssen wir wieder unseren Funktionsaufruf
genugGeld(1500.99,190);
betrachten. Genauer den zweiten Wert innerhalb der runden Klammern. Hier steht 190
, weshalb die Variable dBetrag
den Wert 190
bekommt.
Die Werte, die wir an die Funktion übergeben werden Argumente genannt.
Kim, und wie funktioniert das jetzt mit dem Rückgabewert?
Um aus einer Funktion einen Wert zurückzugeben gibt es das Schlüsselwort return
. Dieses sorgt dafür, dass in unserem Beispiel, in Abhängigkeit von Franka’s Kontostand und dem Preis der Bohrmaschine entweder der Wert FALSE
oder TRUE
zurückgeliefert wird.
Auf den Rückgabewert greifen wir in unserer if..then..else Anweisung in Zeile eins einfach über den Funktionsnamen zu!
Wichtig ist, dass du bei der Definition der Funktion den Typ des Rückgabewertes festlegst. Das machst du in dem du den Typ des Rückgabewertes einfach vor den Namen der Funktion schreibst.
In unserem Beispiel ist der Rückgabewert ein Wahrheitswert, also vom Typ boolean
.
Kim, muss jede Funktion einen Rückgabewert haben?
Nein! Hierfür gibt es das Schlüsselwort void
. Dieses musst du verwenden, wenn deine Funktion keine Rückgabe liefern soll. Natürlich macht dann auch das Schlüsselwort return
innerhalb der Funktion keinen Sinn und muss weggelassen werden.
Kim, aber wozu ist das gut?
Die besondere Sexiness an Funktionen ist, dass man Programmteile nur EINMAL programmieren muss und diese dann beliebig oft mit verschiedenen Eingabedaten aufrufen kann.
Häufig sind das Programmteile die zwar eine Aktion ausführen, die aber zu keinem Ergebnis führen, welches als Rückgabewert zurückgeliefert werden kann.
Einzigster Sinn deser Funktionen ist es Arbeit zu sparen!
Jippieh, wir dürfen also Faul sein?
Ja, so ist es!
Stell dir nur mal vor, du möchtest nicht nur von Franka wissen, ob sie sich eine Bohrmaschine leisten kann, sondern auch von ihrer Freundin Monika.
Die fleißigen unter uns würden jetzt den Programmcode für Franka kopieren und überall da wo Franka steht Monika hinschreiben.
Natürlich das geht! Aber clever ist das nicht!!
Der smarte Programmierer löst das Problem mit Hilfe von Fuktionen! Und zwar so:
1: public static void neueBohrmaschine(double dKontoStand, double dBetrag,String personenName){ 2: if dKontoStand >= dBetrag{ 3: System.out.println(personenName+" freut sich über eine neue Bohrmaschine!"); 4: }else{ 5: System.out.println(personenName+" kann sich leider keine neue Bohrmaschine leisten."); 6: } 7:}
Okay, was macht diese Funktion?
Was haben wir nochmal über das Wörtchen void
gelernt?
Korrekt, es handelt sich um eine Funktion ohne Rückagebewert. Deshalb ist auch nirgends das Schlüsselwort return
zu entdecken.
Neben den üblichen Parametern für den Kontostand und den Preis für die Bohrmaschine haben wir als weiteren Parameter einen String PersonenName
, über den wir Steuern können, für welche Person wir den Preis der Bohrmaschine gegen den Kontostand prüfen.
Der Name der Person, der in PersonenName
gespeichert ist, wird dann in den Zeilen drei und fünf in der Bildschirmausgabe verwendet.
Jetzt haben wir es einfach! Hast du eine Idee, wie wir das ganze zu unserem Vorteil nutzen können?
Richtig! Wir müssen jetzt einfach die Funktion einmal für Franka und einmal für Monika aufrufen!
1: neueBohrmaschine(1500.99,190,"Franka"); 2: neueBohrmaschine(100,190,"Monika");
Okay, welche Programmausgabe ist zu erwarten?
In Zeile eins rufen wir unsere Funktion mit den Parametern dKontoStand = 1500.99
, dBohrmaschine = 190
und personenName = Franka
auf, da der Kontostand bei Franka zum Kauf einer neuen Bohrmaschine ausreicht, ist die Ausgabe;
Franka freut sich über eine neue Bohrmaschine!
In Zeile zwei rufen wir unsere Funktion mit den Parametern dKontoStand = 100
, dBohrmaschine = 190
und personenName = Monika
auf, da der Kontostand bei Monika nicht zum Kauf einer neuen Bohrmaschine ausreicht, ist die Ausgabe:
Monika kann sich leider keine neue Bohrmaschine leisten.
Variablen als Parameter übergeben
In unserem Beispiel haben wir immer konkrete Werte wie 1500.99
oder "Franka"
als Parameter an die Funktion übergeben.
Natürlich ist es auch möglich Variablen als Parameter zu verwenden. Schau dir mal folgendes Beispiel an:
1: double dKontostandFranka = 1500.99; 2: double dkostenBohrMaschineFranka = 190; 3: if (genugGeld(dKontostandFranka,dkostenBohrMaschineFranka) == true){ 4: System.out.println("Franka freut sich über eine neue Bohrmaschine!"); 5: }else{ 6: System.out.println("Franka ist traurig, weil sie keine neue Bohrmaschine bekommt."); 7:}
Okay, was ist das Ergebnis? Richtig! Kein anderes als oben. Auch hier darf sich Franka über eine neue Bohrmaschine freuen.
Einzigster Unterschied ist, dass wir in der if-Abfrage
in Zeile drei anstatt der Werte 1500.99
und 190
, Variablen dKontostandFranka
und dkostenBohrMaschineFranka
in denen diese Werte gespeichert sind an die Funktion genugGeld
übergeben.
Was passiert wenn wir die Variablen, die wir übergeben innerhalb der Funktion manipulieren?
Nehmen wir mal an, Franka bekommt als gute Kundin einen Rabatt von 10 Euro auf jede Bohrmaschine. Um den Rabatt zu berücksichtigen müssen wir unsere Funktion wie folgt anpassen.
1: public static boolean genugGeld(double dKontoStand, double dBetrag){ 2: double dRabatt = 10; 3: dBetrag = dBetrag - dRabatt; 4: if (dKontoStand >= dBetrag){ 5: return true; 6: }else{ 7: return false; 8:}
In Zeile zwei initialisieren wir eine Variable dRabatt
mit dem Rabatt-Betrag von 10Euro, den wir in Zeile drei von den Kosten für die Bohrmaschine subtrahieren.
Hat diese Manipulation Auswirkungen auf den Wert, der in der Variable dkostenBohrMaschineFranka
gespeichert ist?
Probier es ruhig mal aus indem du dkostenBohrMaschineFranka
auf dem Bildschirm ausgibst!
Die Antwort ist Nein! Das liegt einfach daran, dass innerhalb der Funktion lediglich mit einer Kopie namens dBetrag
von dkostenBohrMaschineFranka
gearbeitet wird, die nur während der Ausführung der Funktion existiert.
Innerhalb der Funktion kannst du auch nur mit dieser Kopie arbeiten. Die Variablen dKontostandFranka
und dkostenBohrMaschineFranka
sind innerhalb von genugGeld
nicht bekannt.
Diese Kopie gibt es nur solange wie die Funktion genugGeld
abgearbeitet wird.
Der Unterschied zwischen einer Funktion und einer Methode
Gerade im Zusammenhang mit objekorientierten Programmiersprachen wird gerne von Methoden anstatt von Funktionen gesprochen. Merke: Beides beschreibt die gleiche Logik es handelt sich lediglich um unterschiedliche Vokabeln!
Auch wird dir, insbesondere in der nicht objektorientierten Welt, häufiger der Name Unterprogramm begegnen. Meistens ist hiermit eine sogenannte Prozedur gemeint, was aber nichts anderes ist, als eine Funktion ohne Rückgabewert.
Ich hoffe ich konnte dir die Frage „Was ist eine Funktion?“ verständlich beantworten.
Wie immer freue ich mich über deine Fragen im Kommentarbereich!
Hat dir der Artikel gefallen? Dann folge uns doch am besten gleich auf Facebook!
Sascha
16. Januar 2018 at 10:13Hi Kim
sehr schön geschriebener Artikel !
In dem Beispiel
if dKontostand >= dBetrag {
…
fehlen allerdings die runden Klammern um die Bedingung
Gruß
Sascha
Kim Peter
17. Januar 2018 at 12:11Hallo Sascha, vielen Dank für den Hinweis. Habe es geändert! Viele Grüße Kim
Sebastian
7. März 2018 at 15:16Hi Kim
guter Artikel, aber zu „Vergiss bitte im Moment die Schlüsselwörter public und static. Hierzu kommen wir später.“
Entweder uebersehe ich es oder es wurde leider die Erklearung fuer static nicht mehr mitreingenommen?
Gruss Sebastian
Kim Peter
7. März 2018 at 15:38Hallo Sebastian, nein, die beiden begriffe werden in diesem Artikel nicht erklärt. Zu dem Wort public schreibe ich was in meinem Artikel über OOP http://www.codeadventurer.de/?p=1288. Für das Schlüsselwort static habe ich ein Video gemacht https://www.youtube.com/watch?v=wXA6LJGc4Ho. Ich hoffe das hilft dir weiter. Viele Grüße Kim
Josef
30. Dezember 2018 at 15:04Hallo Kim, ich möchte ja nicht kleinlich sein, aber hier hast du beim Wort „Eingabedaten“ ein paar Buchstaben vergessen 😉
„Wir gehen in zwei Schritten vor. Als erstes werde ich dir zeigen wie du eine eigene Funktion erstellst. Anschließend wirst du sehen wie man diese dann auf verschiedene Eingadaten anwendet.“
Kim Peter
30. Dezember 2018 at 15:18Hallo Josef, danke für den Hinweis. Ich habe es korrigiert. Viele Grüße Kim
Marco
14. Juni 2019 at 9:35Also nach meinem Kenntnisstand gibt es durchaus Unterschiede in der Begrifflichkeit von Funktion und Methode. Eine Methode ist immer gebunden an eine Instanz und eine Funktion ist ungebunden. Daher ist in den meisten Skriptsprachen meist die Rede von Funktionen oder auch in C und in Java wird immer von Methoden gesprochen welche immer an das Objekt gebunden sind.
Kim Peter
2. Juli 2019 at 11:22Hallo Marco, schon richtig was du sagst. Der Begriff Methode kommt erst in objektorientierten Sprachen auf. Aber eine Funktion in C ist in Java einfach eine Methode die zusätzlich mit dem Schlüsselwort static versehen ist. Viele Grüße Kim
Choose a style: