Kotlin ile Android Programlama #2

Büşra Yıldız
4 min readMay 24, 2019

Başlangıçta Kotlin’in dil özelliklerini ayrıntılı ele alacağımı belirttiğim blog yazımın ikincisiyle devam ediyorum.

İlk yazıya ulaşmak isteyenler için 👇

Ayrıca bu süreçte benim de Twitter aracılığıyla öğrendiğim, Google’ın Udacity ile yayınladığı android kursunu da takip etmeye başladım.İlgilenenler için onun da linkini bırakıyorum. 👇

Dilerseniz kaldığımız yerden devam edelim 😇

Bir önceki yazımda Kotlin’de değişken bildiriminin iki yolu olduğunu belirtmiştim.(val ve var anahtar kelimeleri)

Ancak fonksiyonların parametre değişkenleri için var veya val anahtar sözcükleri kullanılamaz.

fun foo(val a:Int, b:Double) = println("a=$a, b=$b") //error!!!

Ayrıca fonksiyonların parametre değişkenlerine fonksiyon içerisinde atama yapılması geçersizdir.(readonly)

Yani parametre değişkenlerini val anahtar kelimesiyle tanımlanmış gibi düşünebiliriz.Hatta yine aynı sebepten , parametre değişkenlerine fonksiyon içerisinde atama yapılamaz.

fun example(a:Int, b:Float)
{
a *= 2 //error
println("a=$a, b=$b")
}

Normalde Java’da 3 şekilde değişken bildirimi yapılabiliyor. Sınıfın veri elemanı olarak, fonksiyon parametre değişkenleri ve fonksiyonların içerisinde yerel değişkenler şeklinde.

Fonksiyonların parametresi olarak bildirilen değişkenlerin faaliyet alanı ilgili bloğun başlangıcından bitişine kadardır.Bu scope’ta parametre değişkeniyle aynı isimde yerel değişken bildirilemez.

Kotlin’de bunu yapabiliriz ancak tavsiye edilmez. (Sonuçta pek de okunabilir bir kod olmuyor.)

fun example(a:Int, b:Double)
{
var a = a
var b = b
a *= 2
b -= 22
println("a=$a, b=$b")
}

Kotlin’de fonksiyonlar default argüman alabiliyor.

fun main()
{
println(add())
println(add(11))
println(add(22, 22))
}
fun add(a: Int = 0, b: Int = 0) = a + b

Yani Java’da method overloading ile müdahale etmemiz gereken durumu Kotlin bizim için kolaylaştırmış.

Hatta fonksiyonları çağırırken argümanları isimli olarak da verebiliyoruz.

fun main()
{
print(add (b=10 ,a=25))
}
fun add(a: Int = 0, b: Int = 0) = a + b

Ancak şöyle bir durumda

fun main()
{
example(b=3.4, c='d')
}
fun example(a:Int = 10, b:Double, c:Char) = println("a=$a, b=$b, c=$c")

fonksiyon bildiriminde a’ya 10 atamış olmasaydık fonksiyon çağırılırken hata alırdık.(No value passed for parameter ‘a’)

Yine Java’dan farklı olarak Kotlin’de fonksiyon içerisinde fonksiyon bildirimi yapılabilir. İçteki fonsiyon bildirildiği yerden bildirildiği bloğun sonuna kadar çağırılabilir. Bu tür fonksiyonlara yerel (local) fonksiyonlar diyoruz.

fun example(){
fun bar()
{
println("bar")
}
bar()}

bu durumda “bar” fonksiyonu yerel bir fonksiyondur ve “example” fonksiyonunun içinde dahi olsa bildirildiği yerden önce çağırılamaz.

Local fonksiyonlar bildirildiği metod içerisindeki yerel değişkenleri kullanabilir. Aynı örnekten devam edersem “example” fonksiyonunun “a :Int” şeklinde bir parametre değişkeni olsaydı “bar” fonksiyonu bu değişkeni kullanabilir ve değişiklik de yapabilirdi.

Bir işleme yol açan ve sonucunda değer üreten atomlara operatör diyoruz.Kotlin’de Java’dan daha fazla operatör var ve her operatörün bir de fonksiyon karşılığı var.Bunun temel sebebi Java’dan farklı olarak Kotlin’in operator overloadinge imkan vermesi.

Yani “+” operatörü yerine “plus” fonksiyonunu , “-” operatörü yerine “minus” fonksiyonunu, “*” operatörü yerine “times” fonksiyonunu, “/” operatörü yerine “div” fonksiyonunu kullanabiliyoruz.

Daha önceki sürümlerde “%” operatörü yerine mod isimli bir fonksiyon kullanılabiliyorken artık tamamen kullanımdan kalkmış ve bunun yerine “rem” fonksiyonu (remain) kullanılıyor.

fun main()
{
var a : Int = 10
var b : Int = 3
var sum = a + b println("sum=$sum") sum = a.plus(b) println("sum=$sum")
}
// a + b ile a.plus(b) arasında hiç bir fark yok.

Tabi şu ana kadar bahsettiklerim matematiksel operatörler. Tüm operatörlere ve özel sembollerine linkten ulaşabilirsiniz.

Operator overloadinge ilişkin, operatörlerin fonksiyon karşılıklarına da buradan ulaşabilirsiniz.

Atama operatörü (=) Kotlin’de bir expression değildir.Bu sebeple atama işlemi sırasında değer üretmez.

Yani javada

public static void main (String [] args)
{
int a,b,c;
c=10;
a=b=c;
}

şeklinde gerçekleştirebileceğimiz bir atamayı Kotlin’de yapamıyoruz.

fun main(){
var a: Int
var b: Int
var c: Int = 10
a = b = c //error!!!}

Kotlin’de if deyiminin sonucunu bir değişkene atayabiliriz. Yani istenilen durumlarda Javada “:?” ile gerçekleştirdiğimiz koşul operatörünün işlevselliğini de içerir.

fun main()
{
println("Bir sayı giriniz")
var a = readLine()!!.toInt()
println(if (a > 10) "10'dan büyük" else "10'dan küçük")}

Kotlin’de while döngüsünün çok güzel bir yanı var.Kontrolün başta yapıldığı while döngüsünün kullanımının Java’daki kullanımdan hiç bir farkı yok. Ancak kontrolün sonda yapıldığı yani bizim do-while dediğimiz deyimde blok parantezleri içinde bildirilen değişkeni kontrol aşamasında kullanabiliyoruz.

fun main(){
do {
var a = readLine()!!.toInt()
println("a=$a")
} while (a != 0)}

Java’daki mantıkla düşünürsek scope dışında olduğu için a != 0 gibi bir kontrol anlamsız olacaktı.

Scope kavramı Kotlinde de aynı şekilde düşünülmesine rağmen sadece do-while’ın kolay kullanımı için dilin böyle bir istisnası var.

Bir sonraki yazıda görüşmek üzere…

Bol kodlu günler 👩‍💻👨‍💻

--

--