Kotlin 101 : Fonksiyonlar ( Functions )

Recep Fırıncıoğlu
3 min readFeb 21, 2020

--

Merhabalar,

Bu yazıda fonksiyonlar hakkında konuşup, kullanımlarına dair bilgiler vereceğim. Yazının sonunda “fonksiyon nedir, nasıl kullanılır, ne tür fonksiyonlar vardır?” gibi sorulara cevap verebiliyor olacağız.

Herhangi bir tipte (int, string, double, float vs.) girilen verileri işleyip sonuçlar elde eden yapılara fonksiyon diyoruz. Kotlinde temelde 3 farklı fonksiyon yapısının varlığından söz edebiliriz.

Top Level Functions : Hiçbir sınıfa dahil olmayıp, doğrudan kotlin dosyasının içine tanımlanan fonksiyonlardır.

Member Functions : Bir sınıfın içerisinde tanımlanmış olan fonksiyonlara verilen isimdir, üye fonksiyon olarak da ifade edilebilir.

Local Functions : Bir fonksiyonun içerisinde tanımlanmış olan fonksiyonlardır.

Fonksiyonlar fun anahtar kelimesi ile tanımlanırlar, ardından fonksiyon ismi verilir, varsa parametre parantezleri açılır ve girilir. “ : “ operatörü ile geri dönüş değerinin tipi belirtilir, fonksiyon gövdesi “ { } “ ile açılır ve içerisine fonksiyonumuzun yapacağı işlemler tanımlanır. Geri dönüş değeri verilmeyen fonksiyonlar Unit tipini geri döndürür. Aşağıda bir fonksiyonun nasıl tanımlandığını görebiliyoruz.

Bu fonksiyonu kullanmak ise çok basit, main() fonksiyonumuzun içerisinde aşağıdaki şekilde kullanabiliriz. Ayrıca geri dönüş değeri varsa bir değişkene atayabiliriz.

Bir fonksiyona parametre tanımlanırken, o parametrenin ismi ve hangi tipte bir parametre olduğunu belirtmemiz gerekmektedir. Ayrıca bu parametreler default değer de alabilirler.

Fonksiyon tek satırdan oluşan bir ifadeden ibaret ise “single expression” denilen kullanım ile süslü parantezler olmadan da kullanılabilir. = operatörü ile geri dönüş ifadesi belirtilir.

Variable of Arguments (Vararg): Bu yapı ile fonksiyon parametresi olarak birden fazla veri girişi yapabilmek mümkündür. Fonksiyon tek bir parametre alıyor gibi görünürken çok miktarda değişken atanabilir ve bu değişkenlere arraya eriştiğimiz gibi erişebiliriz. Aşağda örneklenmiştir.

Not: Bir fonksiyon içerisinde iki tane vararg parametre tanımlanamaz.

Extension Fonksiyonlar, üzerinde değişiklik yapamadığımız sınıflara eklemek istediğimiz özellikler olduğunda kullanabildiğimiz, çok sayıda yerde işimizi kolaylaştıran harika yapılardır. Aslında isminden de tahmin edilebileceği gibi sınıfı extend etmek için kullanılırlar.

Infix Fonksiyonlar, özünde normal bir fonksiyondan farkları bulunmamakla birlikte okunabilirliği arttırmak için kullanılan yapılardır. Bir fonksiyonun infix olarak tanımlanabilmes için belli başlı şartları sağlıyor olması gerekmekte. Bunları sıralayacak olursak,

  • “ infix ” anahtar kelimesi ile başlıyor olması gerekmektedir.
  • Bir sınıfa üye fonksiyon olmalı ya da Extension fonksiyon olmalıdır.
  • Sadece bir parametre almalıdır. (Bu parametre vararg olamaz)
  • infix bir metodun parametresi default değer alamaz.
infix fun infixMethod(justOneParam : Param) : Whatever { }

Bir fonksiyon herhangi bir sınıfın içerisinde değilse “ top level ” fonksiyon olarak adlandırılır. Burada akla gelen, zaman zaman karıştırılan bir noktaya da değinelim. Fonksiyon mu method mu ? Şöyle ki aslında ikisi de aynı fakat ufak bir farkla. Eğer sadece bir sınıfa ait fonksiyonlar yazılıyorsa bunlara fonksiyon değil method denir. Fonksiyon denilebilmesi için top level olarak tanımlanabiliyor olması gerekmektedir.

Kotlin’de fonksiyon içerisinde fonksiyon tanımı yapılabilir. Bu tür kullanımlara “ Local Functions” denir. Yazılan fonksiyonun ait olduğu sınıftan dahi çağırılmasını, değiştirilmesini istemediğimiz özel durumlarda kullanabileceğimiz bir yapıdır.

Bir sınıfın içerisinde tanımlanan fonksiyonlara üye fonksiyon (Member Function) denir.

Bir Fonksiyon Generic tip alıyorsa Generic Function olarak adlandırılır.

Higher-order functions

Fonksiyon’lar Kotlin’de “First Class Citizen”dır. Yani degiskenlere değer olarak atanabilir, baska fonksiyonlara parametre olarak verilebilir ya da bir fonksiyonun geri donus değeri olabilirler. Higher order functions dediğimiz yapılar basitçe bir fonksiyona parametre olarak verilen fonksiyonlardır. Fonksiyona verilen parametre kısmı aslında fonksiyonun gövdesidir, yani { } ile süslü parantezler içerisine yazılan asıl fonksiyon kısmıdır.

Android platformunda interface kullanmak yerine olabildiğince higher-order functions yapılarından yararlanmak performans açısından daha verimli sonuçlar elde etmemize yardımcı olacaktır.

Higher-Order fonksiyonlar hakkında daha detaylı bilgi için,

Aşağıya da faydalı olabileceğini düşündüğüm bir linki bırakıyorum. Kotlin’i daha yakından tanımak adına verilen örnekler üzerinde çalışıp tarayıcınız üzerinden test edebilirsiniz.

--

--