Kotlin Fonksiyonlar ve Fonksiyon Parametreleri

Merhaba Arkadaşlar,
Mobilhanem.com sitemiz üzerinden ankattığımız / yayınladığımız Kotlin Eğitimi yazı serisine bu dersimizde Kotlin Fonksiyonlar kullanımı ile devam ediyoruz. Fonksiyon yazmış olduğumuz programın küçük parçalara ayrılmış halidir diyebiliriz. Bizleri tekrar tekrar kod yazmaktan kurtaran bir yapı olan fonksiyonlar bir çok yazılım dilinde (hemen hemen hepsinde) kullanılmaktadır.

Kotlin Fonksiyonlar

Yukarıda belirttiğimiz gibi bir çok programlama dilinde olduğu gibi Kotlin dilinde de fonksiyonlar olmazsa olmaz yapılardır. Zaten biz bugüne kadar ki derslerimizde çoktan fonksiyon kullanmaya başladık. Programımıza başlarken kodumuz direk main fonksiyondan başlıyor. JVM bizim uygulamamızın main fonksiyonunu çağırarak uygulamamızı başlatıyor.

fun main(args: Array<String>) {
    //Kodlar
}

Her kotlin uygulamada main fonksiyon vardır ve yukarıda belirttiğim gibi programımız bu main fonksiyon çağırılarak başlatılır.

Ayrıca sıkca kullandığımız println("String değer") Kotlin’de tanımlanmış bir fonksiyondur. println() fonksiyonunun tanımlandığı yere gidersek  , kendi içinde System.out.println() Java fonksiyonunu çağırdığını , System.out.println() fonksiyonunun tanımlandığı yere gidersek kendi içinde print() ve newLine() fonksiyonlarının çağırdığını , print() fonksiyonun içine gidersek write() fonksiyonunu çağırdığını write() fonksiyonun içine gittiğimizde de Konsola string değeri yazdırmak için satırlarca işlem yaptığını yani satırlarca kod yazıldığını görürüz. Aşağıdaki kod write() fonksiyonun içi ve konsola değer yazdırmak için kullanılıyor.

try {
            synchronized (this) {
                ensureOpen();
                textOut.write(s);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush && (s.indexOf('\n') >= 0))
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }

Fonksiyon kullanımı olmasıydı işte bu satırlarca kodu her konsola bişey yazdırmak istediğimizde tekrar tekrar yazacaktık. Ama bunu bir defa yazıp istediğimiz yerde çağırarak tekrar tekrar kod yazmaktan kurtulacağız. İşte bu yüzden fonksiyon kullanımı bir dilde olmazsa olmazlardandır.

Fonksiyon Tanımlama

Kotlinde fonksiyon tanımlamak için fun keywordu kullanırız. Sonra fonksiyon adını yazar , parantez açar ve alacağı parametreleri yazarız. Parametre almıyacaksa parantezlerin içi boş kalacaktır. Sonrasında iki nokta (:) üst üste koyar ve geri dönüş tipini yazarız.

Örnek 1 : Paramtere almayan ve dönüş tipi String olan bir fonksiyon tanımlayalım.

fun merhaba() : String{
   return "Merhaba Kotlin"
}

Tek satırlık işlemler için Kotlin bizlere bir kolaylık sağlamıştır ve Java’da olmayan aşağıdaki fonksiyon tanımlamasınıda bizlere sağlamıştır.

fun merhaba() : String = "Merhaba Kotlin Fonksiyonlar"

Yukarıdaki iki fonksiyon aynıdır. Sadece tanımlaması farklıdır. Tek satırlık işlemlerde bunu kullanabilirsiniz.

Bu fonksiyonu nasıl çağırırız:

var degisken = merhaba()

Yukarıdaki kod çalıştığı zaman merhaba fonksiyonu çağırılacak , bu fonksiyon geriye “Merhaba Kotlin Fonksiyonlar” stringini döndürecek.

Örnek 2 : Parametre alan ve dönüş tipi String olan fonksiyon

fun merhaba(isim: String, soyisim: String): String = "Merhaba  $isim at $soyisim"

ve ya

fun merhaba(isim: String, soyisim: String): String {
    return "Merhaba $isim $soyisim"
}

Yukarıdaki fonksiyon iki parametre alıyor ve bu parametreleri fonksiyon içinde istediği gibi kullanabiliyor.

Nasıl çağırırız:

var degisken = merhaba("Taha","Kırca")

Yukarıdaki fonksiyonu çağırdığımız zaman kullanmakta olduğumuz Intellij Idea idesi otomatik olarak aşağıdaki gibi parametre adlarınıda görünür hale getiriyor.

 

 

 

Örnek 3: Parametre alan ve dönüş yapmayan fonksiyon

fun merhaba(isim: String, soyisim: String) : Unit{
    println("Merhaba  $isim $soyisim")
}

ve ya

fun merhaba(isim: String, soyisim: String) : Unit = println("Merhaba  $isim at $soyisim")

Dönüş yapmayan fonksiyon dedik ama Unit tipinde dönüş yaptık.  Unit tipinde dönüş yapmak demek, bu fonksiyonun dönüş yapmayacağını bildirmektedir. İstersek Unit kullanmadan da fonksiyonumuzu aşağıdaki gibi tanımlayabiliriz.

fun merhaba(isim: String, soyisim: String){
    println("Merhaba  $isim $soyisim")
}

ve ya

fun merhaba(isim: String, soyisim: String) = println("Merhaba  $isim $soyisim")

Unit kullanıp , kullanmamak size kalmıştır.

Nasıl çağırırız:

merhaba("Taha","Kırca")

Fonksiyonun herhangi bir geri dönüş değeri olmadığı için bir değişkene atamadık.

Örnek 4: 2 int parametre alan ve dönüş tipi int olan fonksiyon

fun topla(deger1:Int,deger2:Int):Int = deger1+deger2

Nasıl çağırırız:

var toplam = topla(3,5)

Fonksiyon Çağırma

Yukarıda her yazdığımız fonksiyonu nasıl çağırırız altında gösterdik. Yazılan fonksiyonların aldığı parametrelere göre fonksiyonların içine parametreleri sırasıyla yazarız. yukarıda da belirttiğim gibi ide’miz otomatik olarak parametrelerimizin başına fonksiyonda ki adını getirmektedir.

Dönüş değeri olan fonksiyonlar direk tek başına çağırılıp bırakılmaz. Çünkü dönüş değeri olduğu için bu dönüş değeri ya bir parametreye atanır, ya da farklı bir fonksiyona değer olarak gönderilir.

Örnek 4 ‘teki toplam fonksiyonumuzu ya aşağıdaki gibi bir paramtreye atarız:

var toplam = topla(3,5)

ya da yine aşağıdaki gibi bir methoda parametre olarak yollarız

println(topla(3,5))

Yukarıda println() fonksiyonuna topla() fonksiyonundan dönen değeri gönderiyoruz.

Peki paramtreleri her zaman sırasıyla mı yollamak zorundayız. Kotlin dili bu konuda da esnek yapısını ortaya koymuştur. Örnek 2 de ki merhaba(isim: String, soyisim: String) fonksiyonunu aşağıdaki gibi de çağırabiliriz:

merhaba(soyisim = "Kırca" , isim = "Taha")

Direk parametre adını vererek yukarıda gördüğünüz gibi istediğimiz sırada gönderebiliriz parametreleri.

Parametrelerde Default (başlangıç) Değeri

Bir fonksiyon yazdığımızı ve 2 parametre aldığını varsayalım. Bu parametrelerden birisi dışarıdan gönderilmek zorunda , diğeri ise gönderilmesede olur durumunda olduğunu varsayalım. Bu durumda gönderilmek zorunda olmayan parametreye fonksiyon tanımlaması yaparken başlangıç değeri atarız.

Örnek 1:  bir fonksiyonumuz var ve 3 Int  parametre alıyor ve bu değerlerin çarpımını geri dönüyor. 3. değer ise olabilir de olmayabilirde. İşte bu durumda fonksiyonumuzu aşağıdaki gibi yazabiliriz.

fun  carp(deger1: Int, deger2: Int, deger3: Int = 1) : Int {
    return  (deger1 * deger2 * deger3)
}

Gördüğünüz gibi son parametreyi deger3 : Int = 1 bu şekilde tanımladık. Burda demek istediğimiz deger3 parametresini gönderirseniz o değeri alırım. Eğer göndermezsiniz benim başlangıç değerim 1’dir.

Bu fonksiyonu aşağıdaki gibi çağırabiliriz

carp(5,7,9) //315
carp(5,7) //35

Gördüğünüz gibi aynı methodu iki şekilde de çağırdık. Birincisinde deger3 paramtresinin değerini fonksiyona dışardan 9 olarak gönderdik. İkincisinde ise deger3 parametresini boş bıraktığımız için başlangıç değeri olan 1’i aldı.

Örnek 2: 

Aşağıdaki fonksiyon ise iki adet String parametre alıyor , ikinci parametre default değer olarak “Mobilhanem” stringini veriyoruz.

fun  yazdir(deger1: String, deger2: String ="Mobilhanem") {
    println("$deger1 $deger2")
}

Bu fonksiyonu hem ikinci parametre değerini göndererek hemde göndermeyerek aşağıdaki gibi çağırabilirim.

 yazdir("Taha","Kırca") // Taha Kırca
 yazdir("Taha") //Taha Mobilhanem

Kotlin Fonksiyonlar ve Fonksiyon Parametreleri dersimde anlatacaklarım bu kadar. Bir sonraki dersimde Kotlin Dilinde Extension Fonksiyon ve Infix Fonksiyon kullanımı ile devam edeceğim.

Konu hakkında sorularınızı konu altından ve ya SoruCevap sitemizden sorabilirsiniz.

Tüm Kotlin derslerimiz için tıklayınız.

15

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

6 Yorum

  • Sitenizden sürekli yararlanıyorum. Anlatımınız olabildiğince açık. Teşekkür etmek istedim.

  • Öncelikle anlatımlar için teşekkür ediyorum. Aşağıdaki kodlamamda varsayılan değerlerin null durumunda işletilmesini yapmaya çalışıyorum. Ancak kullanıcıdan aldığım veri boş dönerse özel bir hata oluşturuyor. Buradaki yapmam gereken düzeltme ne olabilir.
    fun main(args:Array){

    fun sayilar(baslangic: Int, bitis: Int){
    var aralik = baslangic..bitis
    for(i in aralik)
    {
    println(i)
    }
    }
    println(“Başlangıç değerini giriniz.”)
    var degisken1 = readLine()?.toInt() ?: 0
    var degisken2 = readLine()?.toInt() ?: 0

    if(degisken1 > degisken2){
    println(“Birinci değer, ikinci değerden büyük olamaz.”)
    }
    else{

    sayilar(degisken1,degisken2)
    }

    }

    • var degisken1 = readLine()!!.toInt() (readline ‘ i boyle tanimla ve sonra (degisken1! > degisken2) yap

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?