Kotlin, JetBrains tarafından geliştirilen, JVM üzerinde çalışan ve 2017'den beri Google tarafından Android geliştirme için resmi olarak desteklenen statik olarak tiplendirilmiş bir programlama dilidir. Kotlin, Java ile tam uyumludur, kısa ve öz bir sözdizimine ve yerleşik null güvenliğine sahiptir. Kotlin Documentation — dil ve standart kütüphane için eksiksiz bir rehber.
Önemli Noktalar
Kotlin, JetBrains (IntelliJ IDEA'nın geliştiricisi) tarafından oluşturulan ve Apache 2.0 lisansı altında 2016'da yayınlanan statik olarak tiplendirilmiş bir programlama dilidir. Kotlin, JVM bayt koduna, JavaScript'e ve yerel koda (Kotlin/Native aracılığıyla) derlenir. Başlıca uygulama alanları Android geliştirme, sunucu tarafı uygulamalar ve Platformlar arası projelerdir.
Google, Google I/O 2017'de Kotlin'i Android geliştirmenin resmi dili ilan etti. Google'a (Android Developer Blog, 2026) göre, Google Play'deki yeni projelerin %85'inden fazlası Kotlin kullanıyor. Dil ayrıca sunucu tarafı geliştirmede (Spring Boot, Ktor) ve çoklu platform projelerinde (Kotlin Multiplatform Mobile) aktif olarak kullanılmaktadır.
Kotlin Java ile tam uyumludur — aynı proje içinde Kotlin'den Java kodunu ve tersini çağırabilirsiniz. Derleme araçları (Gradle, Maven) her iki dili de destekler, bu da geliştirmede kesinti olmadan Java'dan Kotlin'e kademeli geçişe olanak tanır.
Ana nedenler: kısalık — Kotlin, aynı görev için Java'dan ortalama %40 daha az kod satırı gerektirir. Null güvenliği — derleyici, kontrol olmadan nullable tiplerinin kullanımını yasaklar. Fonksiyonel yetenekler — yüksek dereceli fonksiyonlar, lambdalar, extension fonksiyonlar ve coroutine'ler kodu daha anlatımlı ve güvenli hale getirir.
Temel Kotlin sözdizimi kısalığı açıklıkla birleştirir. Değişkenler val (değişmez) ve var (değişebilir) ile bildirilir. Derleyici tür çıkarımı kullanır, ancak açık tür bildirimi desteklenir. Fonksiyonlar fun anahtar sözcüğüyle bildirilir.
package com.example.intro
// Sabitler ve değişkenler
val appName: String = "KotlinApp" // değişmez
var version = 1.0 // değişebilir, tür çıkarıldı
// İfade gövdesi olan fonksiyon
fun sum(a: Int, b: Int) = a + b
// String templates
fun greet(name: String) = "Merhaba, $name! Sürüm ${appName}_$version"
// Default and named arguments
fun createUser(
name: String,
age: Int = 18,
email: String? = null
)When ifadesi Java'daki switch'in yerini alır ve daha esnektir: tür denetimlerini, aralıkları, koşulları ve break olmadan dalları destekler. Derleyici, enum ve sealed sınıfları için kapsamlı kapsamayı denetler. Akıllı dönüşümler, is denetiminden sonra türleri otomatik olarak dönüştürerek açık dönüşümleri ortadan kaldırır.
fun analyzeValue(value: Any) = when (value) {
is String -> "${value.length} uzunluğunda dize" // akıllı dönüşüm
is Int -> "Tam sayı: $value"
in 1..10 -> "1-10 aralığında sayı"
else -> "Bilinmeyen tür"
}Null güvenliği, derleme zamanında NullPointerException'ı ortadan kaldıran temel bir Kotlin özelliğidir. Kotlin'de türler varsayılan olarak null olamaz. Null'a izin vermek için türe ? ekleyin: String?. Derleyici, her nullable değerin açıkça denetlenmesini gerektirir.
// Nullable ve non-null türler
val nonNull: String = "Her zaman null değil"
val nullable: String? = null // izin verildi
// Güvenli çağrı — yalnızca null değilse yürütülür
val length: Int? = nullable?.length
// Elvis operatörü — varsayılan değer
val text: String = nullable ?: "Default text"
// Let — non-null değerle blok yürüt
nullable?.let { value ->
println("Değer: $value")
}Güvenli çağrı operatörü (?.), operatörden önceki nesne null ise null döndürür, aksi halde metodu/özelliği çağırır. Elvis operatörü (?:), sol taraf null ise varsayılan bir değer sağlar. Not-null iddiası (!!), değer null ise NullPointerException fırlatır — yalnızca değerin %100 var olduğundan emin olduğunuzda kullanın.
Platform türleri — çağrılan Java kodundan, Kotlin'in nullable veya non-null olarak işaretleyemediği Java türleri. Tür, String! (ünlem işaretiyle) olarak görüntülenir. Java koduyla çalışırken null güvenliğinden geliştirici sorumludur.
Kotlin'deki data class'lar otomatik olarak equals(), hashCode(), toString(), copy() ve componentN() oluşturur. Bu, Java modellerinin (POJO) tekrarlayan kodunu ortadan kaldırır ve kodu temizler. Bir data class bildirimi, Java'daki 20-30 satır yerine bir satır alır.
data class User(
val id: Long,
val name: String,
val email: String,
val age: Int? = null
)
// Kullanım
val user = User(1, "Anna", "anna@example.com")
val updatedUser = user.copy(age = 25)
// Yapı bozma
val (id, name) = user
println("Kullanıcı #$id: $name")Yapı bozma, bir data class'ı tek satırda değişkenlere ayırmaya olanak tanır. Bu, çiftler, üçlüler ve diğer bileşik değerlerle çalışırken kullanışlıdır. Yapı bozma, data class'lar, standart koleksiyonlar (List, Map) ve operator fun componentN() olan herhangi bir sınıf için desteklenir.
Extension fonksiyonlar, kalıtım olmadan mevcut sınıflara yeni metotlar eklemek için bir Kotlin mekanizmasıdır. Uzantılar, bir alıcı parametresiyle statik metotlara derlenir, bu nedenle kalıtım gerekmez ve sanal gönderim desteklenmez.
// String için extension fonksiyon
fun String.isEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
// Extension özelliği
val String.isPhoneNumber: Boolean
get() = this.matches(Regex("^\\+?[\\d-]{10,15}$"))
// Koleksiyonlar için genel extension
fun List<Int>.sumOfEvens(): Int {
return this.filter { it % 2 == 0 }.sum()
}
// Kullanım
println("test@mail.com".isEmail()) // trueUzantılar, Android SDK ve kütüphanelerinde yaygın olarak kullanılır. Örneğin, Android KTX'teki Activity uzantıları, Activity, Fragment, View ve diğer sınıflar için extension fonksiyonlardır. Uzantılar, bir dosyada üst düzey işlevler olarak veya bir sınıfın üye uzantıları olarak bildirilebilir.
Coroutine'ler, sıralı stilde bloke olmayan kod yazmaya olanak tanıyan Kotlin'deki bir asenkron programlama mekanizmasıdır. Bir coroutine, iş parçacığını bloke etmeden bir suspend fonksiyonunda yürütmeyi askıya alır ve işlem tamamlandıktan sonra devam eder. Bu, RxJava geri çağrı zincirlerine ve AsyncTask'e bir alternatiftir.
import kotlinx.coroutines.*
// Suspend fonksiyonu — duraklatılabilir
suspend fun fetchUserData(userId: Int): User {
// delay — suspend fonksiyonu, iş parçacığını bloke etmez
delay(500)
return User(userId, "User $userId", "user@example.com")
}
// Coroutine'de başlat
fun loadData() {
CoroutineScope(Dispatchers.Main).launch {
val user = fetchUserData(1) // burada duraklat
updateUI(user) // Ana iş parçacığında devam et
}
}Dispatchers, bir coroutine için iş parçacığı havuzunu belirler: Dispatchers.Main (UI iş parçacığı), Dispatchers.IO (ağ/disk işlemleri), Dispatchers.Default (CPU yoğun görevler). Yapılandırılmış eşzamanlılık, bir coroutine'in kapsam tamamlandıktan sonra aktif kalmamasını sağlar — bu, bellek sızıntılarını önler.
// async/await ile paralel yürütme
suspend fun loadDashboard(): Dashboard = coroutineScope {
val user = async { fetchUserData(1) }
val orders = async { fetchOrders(1) }
val stats = async { fetchStats() }
Dashboard(user.await(), orders.await(), stats.await())
}Yeni bir Android projesi için Kotlin ve Java arasında seçim yapmak temel bir mimari karardır. Kotlin daha modern bir sözdizimi ve yerleşik güvenlik mekanizmaları sunarken, Java daha geniş bir geliştirici havuzuna ve olgun kütüphanelere sahiptir.
| Özellik | Kotlin | Java |
|---|---|---|
| Null güvenliği | Yerleşik (nullable/non-null) | Yerleşik değil (@Nullable ek açıklamaları) |
| Kod hacmi | Java'ya göre −%40 | Tekrarlayan kod (getters/setters) |
| Data class'lar | data class (tek satır) | Lombok'lu veya manuel POJO |
| Eşzamansızlık | Coroutine'ler (suspend/await) | CompletableFuture, RxJava |
| Extension fonksiyonlar | Yerleşik | Yalnızca yardımcı sınıflar aracılığıyla |
| Akıllı dönüşümler | is denetiminden sonra | Açık dönüşüm (Type) obj |
| Geriye uyumluluk | Java ile %100 | — |
Performans Kotlin ve Java karşılaştırılabilir — her ikisi de JVM bayt koduna derlenir. Kotlin bazen coroutine'ler ve içe aktarma için mikro ek yük ekler, ancak bu mobil uygulamalar için ihmal edilebilir düzeydedir. Google ve JetBrains, Kotlin'e aktif olarak yatırım yapıyor: Kotlin Multiplatform, Kotlin/Wasm ve K2 derleyici performans iyileştirmeleri.
Sıkça Sorulan Sorular
Kotlin, Java'dan %40 daha kısadır — daha az tekrarlayan kod. Kotlin, null güvenliği, data class'lar, extension fonksiyonlar, coroutine'ler, akıllı dönüşümler, when ifadeleri ekler. Java ile tam uyumluluk: her iki dil de JVM'de çalışır ve çakışma olmadan aynı projede kullanılabilir.
Türler varsayılan olarak non-null'dur. Nullable için ?: String? kullanın. Derleyici, nullable değerlere doğrudan erişimi yasaklar. Güvenli çağrı (?.) null alıcıda null döndürür. Elvis operatörü (?:) varsayılan bir değer ayarlar. !! — olası istisna ile zorla çıkarma.
Coroutine'ler, asenkron kodu sıralı olarak yazmayı sağlayan hafif iş parçacıklarıdır. Suspend fonksiyonları, iş parçacığını bloke etmeden duraklar. launch ve async, CoroutineScope'da coroutine'leri başlatır. Ağ istekleri için Dispatchers.IO, UI güncellemeleri için Dispatchers.Main.
data class otomatik olarak equals(), hashCode(), toString(), copy() ve componentN() oluşturur. Örnek: data class User(val name: String, val age: Int). val (name, age) = user ile yapı bozma. Java 14+'taki record'a benzer, ancak ek copy() metoduyla.
Extension fonksiyonlar mevcut sınıflara metot ekler: fun String.isEmail(): Boolean. Derleyici bunları bir alıcı parametresiyle statik çağrılarla değiştirir. Kalıtım gerekmez. Uzantılar Android KTX'te yaygın olarak kullanılır: view.showToast(), activity.viewModels().
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun