Funkcje – podstawy
Funkcja to nazwany fragment kodu, który możesz wywoływać wielokrotnie. Poznasz słowo
fun, sposób przekazywania danych przez parametry (nazwa: Typ),
zwracanie wyniku (: Typ i return) oraz typ Unit
dla funkcji, które nic nie zwracają.
Czym jest funkcja
Funkcja to nazwany fragment kodu, który wykonuje jedno konkretne zadanie. Raz ją zapisujesz, a potem wywołujesz w dowolnym miejscu – nawet wiele razy. Dzięki temu nie powtarzasz tego samego kodu i łatwiej go poprawiać.
Funkcję main znasz już od pierwszych lekcji – to specjalna funkcja,
od której startuje program. Teraz nauczysz się pisać własne funkcje.
Dobra funkcja robi jedną rzecz i ma nazwę, która o tym mówi (np. policzPole,
przywitaj). Taki podział sprawia, że program czyta się jak listę
sensownych kroków.
Definiowanie i wywołanie
Funkcję definiujemy słowem kluczowym fun, po którym podajemy nazwę,
nawiasy () i ciało w klamrach. Aby ją uruchomić, piszemy jej nazwę
z nawiasami – to wywołanie.
fun przywitaj() { println("Witaj w programie!") } fun main() { przywitaj() // wywołanie przywitaj() // można wywołać wiele razy } // Witaj w programie! // Witaj w programie!
Funkcję możesz zdefiniować nad albo pod main – Kotlin i tak ją znajdzie.
Liczy się, żeby istniała w pliku.
Parametry – przekazywanie danych
Parametry pozwalają przekazać funkcji dane do pracy. Wypisujemy je
w nawiasach w postaci nazwa: Typ – tak samo jak przy deklaracji zmiennej,
nazwa najpierw, typ po dwukropku.
fun przywitaj(imie: String) { println("Cześć, $imie!") } fun main() { przywitaj("Anna") // Cześć, Anna! przywitaj("Krzysztof") // Cześć, Krzysztof! }
Wartość podana w wywołaniu (np. "Anna") to argument.
Parametrów może być więcej – rozdzielamy je przecinkami:
fun przedstaw(imie: String, wiek: Int) { println("$imie ma $wiek lat") } przedstaw("Anna", 18) // Anna ma 18 lat
Wewnątrz funkcji parametru nie można nadpisać (zachowuje się jak
val). Jeśli potrzebujesz go zmieniać, skopiuj wartość do własnej
zmiennej var.
Typ zwracany i return
Funkcja może zwrócić wynik. Typ tego wyniku podajemy po nawiasach,
po dwukropku (): Int), a samą wartość oddajemy słowem return.
fun suma(a: Int, b: Int): Int { return a + b } fun main() { val wynik = suma(3, 5) // wynik = 8 println(wynik) }
return robi dwie rzeczy naraz: oddaje wartość i
natychmiast kończy działanie funkcji – kod po nim już się nie wykona.
Unit – funkcje bez wyniku
Nie każda funkcja musi coś zwracać – wiele z nich po prostu „coś robi” (np. wypisuje
tekst). Taka funkcja zwraca specjalny typ Unit, oznaczający
„nic konkretnego”. To odpowiednik void z innych języków.
// typ zwracany pominięty -> domyślnie Unit fun przywitaj(imie: String) { println("Cześć, $imie!") } // to samo, z jawnym Unit (zwykle się go nie pisze) fun przywitaj2(imie: String): Unit { println("Cześć, $imie!") }
W praktyce typu Unit się nie zapisuje – po prostu nie podajesz typu
zwracanego. Gdy widzisz funkcję bez : Typ po nawiasach, wiesz,
że nic nie zwraca.
Wynik funkcji w użyciu
Wartość zwrócona przez funkcję to zwykła wartość – możesz ją przypisać do zmiennej, wstawić do szablonu albo użyć w dalszych obliczeniach.
fun poleKwadratu(bok: Int): Int { return bok * bok } fun main() { val p = poleKwadratu(5) // 1) przypisanie -> 25 println("Pole: ${poleKwadratu(4)}") // 2) wprost w szablonie -> 16 val razem = poleKwadratu(2) + poleKwadratu(3) // 3) w wyrażeniu -> 13 println("$p, $razem") }
Częste błędy
❌ Błąd 1: zła kolejność w parametrze
❌ Typ przed nazwą
fun przywitaj(String imie) {
// Błąd! najpierw nazwa,
// potem typ
}
✅ nazwa: Typ
fun przywitaj(imie: String) {
println("Cześć, $imie")
}
❌ Błąd 2: brak return przy typie zwracanym
❌ Obiecany Int, ale nic nie zwrócone
fun suma(a: Int, b: Int): Int {
a + b
// Błąd! brakuje return
✅ Ze słowem return
fun suma(a: Int, b: Int): Int {
return a + b
}
❌ Błąd 3: wywołanie bez nawiasów
❌ Sama nazwa nie uruchamia
fun main() {
przywitaj
// nic się nie dzieje –
// to nie jest wywołanie
}
✅ Z nawiasami
fun main() {
przywitaj()
}
❌ Błąd 4: zła liczba argumentów
❌ Za mało argumentów
fun suma(a: Int, b: Int): Int {
return a + b
}
suma(3)
// Błąd! funkcja wymaga
// dwóch argumentów
✅ Tyle argumentów, ile parametrów
fun suma(a: Int, b: Int): Int {
return a + b
}
suma(3, 5)
Podsumowanie
- Funkcję definiujemy słowem
fun, a uruchamiamy przez wywołanie:nazwa(). - Parametry zapisujemy jako
nazwa: Typ; wartości przekazane w wywołaniu to argumenty. - Parametr jest tylko do odczytu (jak
val). - Typ zwracany podajemy po nawiasach:
): Int, a wartość oddajemy przezreturn. returnzwraca wynik i kończy działanie funkcji.- Funkcja bez wyniku zwraca
Unit(odpowiednikvoid) – typu tego zwykle się nie zapisuje. - Wynik funkcji to zwykła wartość: można go przypisać, wstawić do szablonu lub użyć w wyrażeniu.
Zadania do wykonania
Zadania z wczytywaniem uruchamiaj w IntelliJ IDEA; pozostałe w Kotlin Playground.
Napisz funkcję przywitaj(imie: String), która wypisuje powitanie.
Wywołaj ją trzy razy z różnymi imionami.
Napisz funkcję suma(a: Int, b: Int): Int, która zwraca sumę dwóch
liczb. W main przypisz wynik do zmiennej i wypisz go.
Napisz funkcję czyParzysta(liczba: Int): Boolean, która zwraca
true, gdy liczba jest parzysta. Przetestuj ją na kilku liczbach,
wypisując wyniki.
Napisz dwie funkcje: pole(a: Int, b: Int): Int oraz
obwod(a: Int, b: Int): Int dla prostokąta. Wczytaj wymiary,
wywołaj obie funkcje i wypisz wyniki. Zwróć uwagę, że logika obliczeń jest
„zamknięta” w funkcjach, a main tylko je spina.