Kotlin’e Giriş 1- Basic Types(Değişkenler ve Veri Tipleri)

Muhammed Burak Çakır
Android Türkiye
Published in
7 min readFeb 12, 2020

Uzun bir aranın ardından tekrardan merhabalar. Son 2 yazım Android’de Layout kullanımı ve tasarım hakkındaydı.

Android ve Tasarım #1 : Etkili Layout Seçimi ve Kullanımı

Android ve Tasarım #2 : Oran-Orantı ile Responsive Tasarım

Bu yazımda ise Android Programlama’da Java’nın yavaş yavaş yerini bıraktığı Kotlin’e giriş yapacağız ve Kotlin’de değişken tiplerine göz atacağız.

Kotlin Nedir?

Kotlin, IntelliJ IDEA ve Android Studio ile çok defa ismini duyduğumuz JetBrains tarafından 2010 yılında geliştirilmeye başlanan, 2016 yılında piyasaya sürülen bir programlama dilidir.

İsminin duyulması ve Android sektörüne girişi 2017 yılında gerçekleşmiştir diyebiliriz. Mayıs 17' Google I/O etkinliğinde Kotlin’in duyurulması, Google tarafından geliştirici dili olarak kabul edilmesinden sonra ünü yayılmıştır.

Kotlin ile Web ve masaüstü uygulamalar da yapılabilir fakat güçlü varlığını Android üzerinde göstermektedir.

Kotlin’in özelliklerine ve Java’dan farklarına göz atalım:

1- Nesne tabanlı bir programlama dilidir ve fonksiyonel programlamayı destekler. Kotlin’de hem method, hem fonksiyon kullanabiliriz. Yani yazdığımız fonksiyonlar, bir Class yapısı içinde bulunmak zorunda değildir.

Fonksiyonel programlama ise; extension fonksiyonlar, higher-order fonksiyonlar gibi Class yapısına bağımlı kalmadan daha kısa kodla daha geniş yelpazede kullanımlar sağlar.

Belirtilmelidir ki; Kotlin, Java dilindeki tüm özellikleri içermez.

Ör : Static üyeler, ternary operatörler…

Java da, Kotlin dilindeki tüm özellikleri içermez.

Ör : Null Safety, Range ifadeleri, Type inference…

https://kotlinlang.org/docs/reference/comparison-to-java.html

2- Kotlin, Java kütüphanelerini kullanarak çalışır. Kodlarımızda kütüphaneler üzerinde gezinirken bu durumu sıkça göreceğiz.

3- Kotlin’de Java dili gibi statik bir dildir. Yani derlenme zamanında değişkenlerin tipleri bellidir ve derleme buna göre yapılır.

4- Java kodları derleyici üzerinde Kotlin’e çevrilebilir, Kotlin kodları ise Decompile ile Java kodlarına çevrilebilir.

5- Java’da POJO (veri taşıyıcı) class oluşturmak istediğimizde;

  • getter,
  • setter
  • constructor, v.b. yapılar bizim sorumluluğumuz altındaydı. Kotlin’de ise bu yapıları Data Class’lar oluşturuyor.

Bununla beraber,

  • equals(),
  • toString(),
  • hashCode() v.b. fonksiyonları kullanmak için override etmek durumundaydık. Kotlin’de ise yine Data Class’lar override fonksiyonlarını direkt olarak kullanma şansı tanıyor.

İnternette gezen o meşhur görseli bizde paylaşalım. 😊

POJO Class — Java vs Kotlin

6 — Kotlin dili üzerinde null kontrolü yapılabilir. İleride anlatacağımız değişkenlerimizin tanımlanırken ve kullanırken ki null durumunu tanımlayabiliriz, kısacası Null Safety mümkündür. Kısa bir giriş yapalım.

Null Safety

Kotlin’de bir değişkenin veya fonksiyonun tipi belirtilmişse, default olarak null değeri alamaz. Null değerini alabilmesi için “?” operatörünün kullanılması gerekir. Burada amaç, NullPointerException hatasından kurtulmaktır.

Tip belirtilmedi ise null değerini alabilir.

Peki tipini belirtmediysek, dil bunu nasıl anlayacak?

Derleyici bu noktada verilen değere göre tip çıkarımı (type inference)nda bulunur.

Değişken tiplerinde örneklemesini yapacağız.

Değişken tanımlamaları ve tiplerine giriş yapalım.

Hatırlarsak Java’da değişkeni tanımlarken tipini önceden belirtiyorduk. Kotlin’de ise tip belirtilmek zorunda değildir.

Tanımlanırken ise, var ve val anahtar kelimelerini kullanıyoruz.

  • var ( mutable / değiştirilebilir) : variable olarak düşünülebilir, Değişken var ile tanımlanırsa, daha sonra yeni değer ataması yapmak mümkündür.
  • val ( immutable / değiştirilemez) : value olarak düşünülebilir, tanımlanan değişken daha sonra değiştirilemez.

Best practice : val kullanmak.

Thread işlemlerinde, değişkenlerin mümkün olduğunca değişmemesini sağlarız. Birden fazla Thread’in aynı değişkene ulaşmasını engellemeye çalışırız. Bu durum, val gereksinimine bir örnektir.

NOT : Dizi, liste v.b çoklu veri tutan yapıların kendilerinde değişiklik yapılamaz, fakat içerideki değerler değiştirilebilir.

Değişken tiplerine giriş yapmadan önce, tip tutan değişkenlerin özelliklerine de göz atalım.

Biliyoruz ki Java’da, değer tutması için

  • int, boolean, float, double gibi primitive tiplerimiz, String, Arrays gibi classlar vardı.

Kotlin’de ise primitive tip direkt olarak bulunmamaktadır.

Primitive tiplerin Class yapılarını kullanıyoruz. Yukarıda verdiğimiz örneklerde de değişken tiplerinin Class olduklarına dikkat edelim.

Boxed variable ve unboxed variable

Boxed variable : Eğer bir değişken memory’de saklanırken, o değişkenin object referansı olarak saklanıyorsa boxed variabledir.

  • Örnek : Nullable ve Generic değişkenler.

Unboxed variable : Verinin kendisi olarak saklanıyorsa, unboxed variabledir.

Referans ve Değer Karşılaştırması

  • === : Değişkenlerin referansını karşılaştırılırken kullanılan operatör

İlk kod bloğunda, farklı Int tipindeki val değişkenlerine aynı number value atılmasına rağmen, karşılaştırma da false döndü. Çünkü ikisinin referansını işaret eden adresler farklıdır.

  • == : Değişkenlerin değerini karşılaştırırken kullanılan operatör

İkinci kod bloğunda ise, aynı işlemde true döndü. Çünkü orada karşılaştırılan değerlerdir. İkisi de number2 değişkeninin değerini taşır.

Unboxed değişkenler derleyicide class olarak Tanımlansalar da, JVM’de Primitive tipe dönüştürülürler.

Çünkü Primitive tiplerde işlemci ve ram maliyeti çok düşüktür.

Bu yönteme, 4. maddede belirttiğimiz Decompile ile bakalım.

Kotlin ile yazdığımız kod:

Burada, age değişkeni Int dolayısıyla Unboxed, age2 değişkeni Nullable Int dolasıyla Boxed değişkendir.

Java’da age değişkeni int değeri ile, age2 değişkeni Integer referansı ile tutuldu.

Kotlin’in mantığına giriş yaptıktan sonra değişken tiplerine giriş yapabiliriz.

Değişken Tipleri

Numbers ( Sayılar )

Kotlin’de, tam sayı tutan 4 değişkenimiz vardır ve her birinin değer aralığı vardır.

Değişkene tam sayı verdiğinizde; type inference (tip çıkarımı) ile verilen değer Int’in değer aralığında ise, sayı Int olarak kabul edilir.

Değil ise, Long olarak kabul edilir.

Örneğin:

Burada, sayıyı Byte tipinde tanımlayıp, o sayı için bellekte minimum alanı ayırmayı sağlayabiliriz.

Tipini belirtmediğimizde tipi default Int olarak kabul edildi ve değişkenimiz bellekte 4 byte (32 bit) yer kaplıyor.

atamasında ise, sayının değer aralığı Int’in dışına çıktığından, değişken Long olarak kabul edilir.

Tam sayı tutmayan 2 tip değişkenimiz vardır.

Değişkene tam sayı vermediğinizde; verilen değer Double olarak kabul edilir. Float olmasını istiyorsanız, sonuna “f” belirteçiyle belirtmeniz gerekir.

Tipi Long olarak belirtmek için, değer sonuna “L” belirteci koyulabilir.

Değişkenlere sayı verilirken altçizgi(_) kullanılabilir.

val creditCardNumber = 1234_5678_9012_3456L

Characters

Sadece 1 tane karakter taşır.

val initialOfName : Char = 'B'val firstNumberOfPI : Char = '3'

Char değişkenlerin değerleri tek tırnak (‘ ‘) içinde gösterilmelidir. Çift tırnak kullanımında String değer olurlar ve Char atamasında hata alırlar.

Escape karakterler ve Unicode’lar char olarak yazılırlar.

Boolean

Bilişimde duyduğumuz 0–1 mantığını tam olarak uygulayabileceğimiz değişken tipidir.

Mantıksal işlem sonucuna göre, true veya false değerini döndürür.

İşlem 3 operatör ile yapılabilir :

  • & : ve
  • || : veya
  • ! : değil

0 veya 1 olarak kullanılamazlar.

val isTrue : Boolean = trueval isFalse : Boolean = false

Array

Diziler, bir veya çok boyutlu olarak tanımlanır ve çeşitli türlerde veri tutar.

Kotlin’de, dizileri kullanım şekilleri :

  • arrayOf : En temel dizi kullanımıdır. Verilen tipteki değişkenleri tutar.

Kotlin’de, Any tipini kullanarak, farklı tipte değerler içeren arrayler kullanabilliriz.

Any, Java’da ki Object’in karşılığıdır. Her şey Object’ten ürer.

Any belirteçini olabildiğince az kullanmalıyız, memorydeki en büyük alanı kaplar.

Elimizdeki verilerin tipi boyutu belli fakat değerleri belli değilse,

  • arrayOfNulls kullanılırız.
val arrayOfNulls = arrayOfNulls<String>(4)

Verilen boyut kadar eleman null değer alır.

Eğer dizinin indexlerini kullanmak veya dönen boyut kadar işlemi for kullanmadan yapmak istiyorsak, bu noktada Kotlin bize kolaylık sunuyor.

it değişkeni, dizinin index’ini yönetmeyi sağlar, array tanımıyla gelir.

Sonuç olarak :

· arrayOf

· arrayOfNulls

· Array<Type>

· TypeArray

şeklinde dizi kullanımları mümkündür.

Kotlin’de, dizilere hem index ile hem de set get metodlarıyla ulaşmak mümkündür.

Array’i tanımlarken val olarak tanımlamamıza rağmen, içerisindeki değeri değiştirebiliyoruz. Bu durumda compiler error vermez, çünkü biz Array’e değil içindeki değere müdahale ediyoruz.

Boyutları elde edilebilir.

Array’e yeni bir atama yaptığımızda, içindeki değerler silinir.

val firstCharOfCountries = CharArray(4); // daha sonra eklemelerin yapıldığını da varsayalım.val firstCharOfCountries = CharArray(4); // tekrar atama yapıldı, bellekteki değerleri gitti.

Kotlin’de diziler geniş bir konu, giriş seviyesinde bu kadarını bilmek yeterli olacaktır.

String

Stringler için, Char değerlerin birleşimi diyebiliriz. Bu sebeple bir String, Char değerlere ayrılabilir, Char değerleri birleştirilip String bir değer oluşturulabilir.

Kotlin’de, String değişkenlere index aracılığı ile ulaşılıp, istenilen index’te ki karakter elde edilebilir.

Eğer String bir ifade ile, String olmayan bir ifadeyi birleştirmek istiyorsak, bunu fonksiyon kullanmadan yapmamız mümkündür. Fakat, String ifade daha önce kullanılmalıdır ki, toplanacak olan ifadenin String tipinde tutulacağı bilinsin.

Kotlin’de String’in kullanımlarından biri de, raw Stringlerdir. “”” “”” ile kullanılırlar ve içeriye verilen değerler aynen çıktıya yansırlar. Normalde döngülerle belirli şekilleri üretme gibi algoritma sorularında kullanılmaması gerekir 😊

Tek tırnaklı String kullanımında ise, yıldızlar tek satırda birleşecektir.

Bu şeklin boşluklarını değiştirmek istersek:

  • trimIndent : Soldan tarayarak bulduğu ilk karakterin hizasından tüm satırların kenar boşluklarını siler.
  • trimMargin : Kendisine verilen argümanın kenar boşluklarını siler

Kotlin’de, değişkenleri Çift Tırnak(“”) arasında da kullanmak mümkündür. Bunun için $ operatörü kullanılır.

Tip Dönüşümleri

Java’da tip dönüşümü olarak Implicit(kapalı şekilde) Conversion kullanabiliyorduk. Eğer atama yapacağımız yeni değişken, atama yapılacak değişkeni kapsıyorsa, değer atamasını yapabiliyorduk.

int intVariable = 20;
long longVariable = intVariable; // hata yok

Kotlin’de buna izin verilmez. Implicit Conversion yerine Explicit (açık şekilde) Conversion kullanmalıyız, yani dönüşümleri fonksiyonlar aracılığıyla yapmalıyız.

intVariable long tipine dönüştürüldü böylece “Type mismatch” hatası ortadan kalktı.

Kullanılabilen Explicit fonksiyonlar :

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

Char’dan Int’e çevirilirken, içeride sayı verilmesi bizi yanıltmasın. Aldığı Char karakteri, ASCII tablosuna göre çevirir.

6 çıktısını almak istiyorsak Character sınıfının getNumericValue fonksiyonunu kullanmalıyız.

Kaynaklar :

1- Kotlinglang

2- Codemy Github

Kotlin ile ilgili ilk yazımda, dili çalıştırılabilir uygulamalar ile adım adım anlatmaya çalıştım.

Control Flow ve Functions’ları anlatacağım diğer 2 yazıyla devam edeceğim. Daha sonra, RxJava’ya giriş yapacağız.

Faydalı olması dileğiyle. :)

--

--