Kotlin — Basic Types & Type Checks and Casts & Control Flow 1

Özgür Can
4 min readMay 12, 2021

Type Inference(Tip çıkarımı)

Kotlinde Javanın aksine bir değişken tanımlanırken tip belirtmek zorunlu değildir. Kotlin, değişkene atanan değere göre tipi belirler.

Herhangi bir “String,Int,Float,Long” belirtilmese otomatik olarak kotlin bunu tanımlıyor oluyor.

1-Primitive tipli değişkenler (String,Int,Boolean,Long,Float,Byte,Short,Char)
2- Referans tipli değişkenler (Integer)

Referans tipli değişkenler primitive tipli değişkenler ile aynı değişken tipinde daha fazla alan kaplar..

val = Value’dan gelir. Değeri ilk atamadan sonra değişmeyen(immutable) değişken türüdür.
var = Variable’dan gelir. Değeri değişebilen (mutable) değişken türü.

val name:String = “Ozgur” -> Atadın ve bitti.. Değiştirilemez..
var name:String = “Ozgur” -> Name’in altı çizilecektir..

Burada name = “Ozgur Can” dersem bana “val cannot be reassigned” hatası verecektir.. Yani val bir değişkenin değeri değiştirilemez.. Eğer değiştirmek istersen bunu var yapmalısın.Genel olarak “val” ile “var” farkı budur..

Şimdi “nullable” diye bir kavram var.. Biz genelde servisten(back-end) gelecek verileri nullable yaparız..
null -> Bomboş’ta olabilir,null’da gelebilir.. Bunuda “?” ile belirtiyoruz.

val age:Int? =null -> Burada servisten “age” gelecek. Hiçbirşey gelmezse hata verme null yap demiş oluyoruz.. Yani önlemi “client” almış oluyor. Peki o zaman bütün değişkenleri nullable yapalım? Hayır!
*Bir nullable olmayan değişken oluşturduğunda “kotlin byte code” decompile yaparsan

val age:Int -> int age = 3; olduğunu göreceksiniz..
val age? = null -> Integer age = (Integer)null; olduğunu göreceksiniz..

Kotlin’de eğer bir değişkene nullable(?) işareti koyuyorsanız,o değişken memoryde saklanırken referans tipli bir değişkene dönüştüğünü görüyorsunuz.. Bu da bir performans kaybıdır.. Diğer yandan bu değişkeni kullanabilmek için if-check yapmak gerekiyor.Yada scope fonksiyonları kullanmanızı önerir IDE.. Bunların hepsi toplanınca assembly kodun da yazdığınız her satır kod bir okuma süresi demektir.. Bu da performans kaybıdır.

Şimdi daha derine girelim.. Hangi değer aralıklarında ne verebileceklerimizi inceleyelim.. Bunların neden önemli olduğunu da açıklayalım..
Not1!

Yukarıda değişken tanımlarken “değişken : Tipi” demiştik.Burada “Byte” tipinde bir değişkenin minumum ve maksimum alabileceği değer aralığını yazdırdık.. Bilerek değiştirilebilir verdim ki değiştirmek istediğimizde hataları görelim diye..

Not2!

Burada "minByteValue" değişkeni için minumum verebileceğin değer aralığının dışında diyor.. Eğer bunu vermek istiyorsan "Int" yapmalısın.(Type mismatch: inferred type is Int but Byte was expected)

Short

Yine short bir değişkenin min-max değerleri görüyoruz..

Int

Yeterli mi? Belki ama “Banka” gibi “Forex” gibi şirketlerde çalışanlar için yeterli olmayabilir.

Long

Çok büyük bir değer..

“Float ve Double” Bu değişkenlere de kayan noktalı sayılar,kesirli ifadeleri belirten değişken tipleridir.

UByte,UShort….

Siz bir değişkeni Unside olarak alıyorsanız başlangıç değerini “0” olarak belirtmiş oluyorsunuz.. “Byte” en küçük değeri başta gördüğümüz gibi -127 idi.. Dolayısıyla en büyük değeri 128 +negatifte alınmayan -127 değerinin mutlak değeri kadar ekler.

Byte: 8 bit
Short: 16 bit
Int: 32 bit
Long: 64 bit

Bunları neden gösterdik?
-Genel olarak değerler “Int” tutulur.. Ama bu değer aralıkları büyüdükçe “Ram” dediğimiz alanda tuttuğumuz değerler büyür ve ya küçülür.. “Long” zorunluluktan dolayı kullanılır genel olarak.. TC Kimlik gibi ya da bu değer string alınır.. Ama bir “age” 127 den büyük olamaz sonuç olarak.
-Bu sayı “Long” değilse “Int” midir?. Yazılı olmayan bir kural mıdır? Evet. :)

Final olarak verdiğimiz her değişkenin “Ram” bellekte tuttuğu alanı yukarıda görebilirsiniz.. Yani buda kısaca 8 adet byte(8bit) değişken tanımladığınız yerde 1 adet Long(64bit) değişken tanımlayabilirsiniz;tuttuğu alan eşittir.Bir uygulama için çokta önemli olmayabilir, fakat bir saate uygulama yapacaksanız bunun bir önemi vardır.Bu artık o dile ne kadar hakim olduğunuzu gösteren ince bir noktadır.

Toplarsak
1-) 2 tip değişken var -Primitive ve Referans tipli değişken
2-) Referans tipli değişkenler primitive tipli değişkenler aynı değişken tipinde daha fazla alan kaplar.. Yani “nullable” bir değişken kullanmak memoryde daha fazla yer kaplamamıza neden oluyor.
3-)Sayısal bir değer tanımlarken değer aralığı ne kadar alan kaplacağınızı gösterir..Bu değer sabitse ve değişmeyecekse tipini belirtmek gerekir..

Bu makeleyi burada bitiriyorum okurken sıkılmamanız adına ;
Kotlin — Basic Types & Type Checks and Casts & Control Flow 2 de karşılaştırmalar ile devam ediyor olacağım..

Eksik gördüğünüz noktaları lütfen yorumlarda belirtin.. Bilgi paylaştıkça çoğalır.. Makaleler “depreceted” olacak Class’lar dahilinde güncelleniyor olacaktır..

--

--