Kotlin Mülakat Soruları #2

Vefa Can Beytorun
Paycell Tech Team
Published in
4 min readJul 30, 2024

Kotlin, hızla popülerleşen bir programlama dili olarak, birçok android geliştiricisinin tercih ettiği bir seçenek olmaya devam ediyor. Daha önce yayınladığım “Kotlin Mülakat Soruları #1” yazısının devamı olarak, bu yazıda da Kotlin ile ilgili sıkça karşılaşabileceğiniz mülakat sorularını ele alacağız. Bu sorular, Kotlin bilgisi gerektiren iş görüşmelerinde size yardımcı olacak.

Kotlin Mülakat Soruları #1 başlıklı makalemi burada bulabilirsiniz:

  1. Data Class Nedir?

Kotlin’de data class, veri tutma amacıyla kullanılan özel bir sınıf türüdür. Data class’lar, veri taşıma nesneleri oluştururken bazı temel fonksiyonları da içerisinde barındırarak kolaylıklar sağlar.

data class User(val name: String, val age: Int)

Data class’lar, otomatik olarak equals(), hashCode(), toString(), copy(), ve componentN() fonksiyonlarını sağlar.

2. Extension Functions Nedir ve Nasıl Kullanılır?

Kotlin, mevcut sınıflara yeni fonksiyonlar eklemenizi sağlayan extension functions özelliğini sunar. Bu sayede, var olan sınıfların kaynak koduna dokunmadan yeni işlevler ekleyebilirsiniz.

  • Sınıfın mevcut yapısını değiştirmeden, sınıfa yeni fonksiyonlar ekler.
  • Daha okunabilir ve anlaşılır kod yazmanıza yardımcı olur
fun String.removeFirstAndLastChar(): String = this.substring(1, this.length - 1)

val str = "Kotlin"
println(str.removeFirstAndLastChar())

// Çıktı: otli

Extension functions, kodu daha modüler ve reusable hale getirir.

3. Sealed Class Nedir?

Kotlin’de sealed class, sınıf hiyerarşisini sınırlamak ve belirli bir sınıfın alt sınıflarını belirlemek için kullanılır. Bu tür sınıflar, belirli bir sınıfın tüm alt sınıflarını bildiğiniz zaman faydalıdır.

  • Alt sınıfların belirli bir sınıf hiyerarşisi içinde tanımlanmasını sağlar.
  • when ifadeleri ile kullanıldığında, tüm olası durumların ele alınmasını garanti eder.
sealed class Result {
data class Success(val data: String) : Result()
data class Failure(val error: Throwable) : Result()
}

fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Success: ${result.data}")
is Result.Failure -> println("Error: ${result.error}")
}
}

Success ve Failure olarak iki adet data class oluşturulmuştur ve bu data classlar hiyerarşide sealed data classların alt classları olarak kabul edilebilir. Success data classımız data string’ine sahip iken, Failure data classımız throwable bir error’a sahiptir.

Success durumunda result.data kod parçacığı çalıştırılırken fail durumunda ise result.error kod parçacığı çalışır.

4. Coroutines ve Suspend Functions Nedir?

Mülakatlarda çokça karşılaşılabilmesi mümkün olan bir konu başlığı ve sorudur. Coroutines’in ne olduğunu özetlemek istersek asenkron ve paralel işlemleri daha kolay ve verimli bir şekilde yönetmenizi sağlayan yapıdır. Suspend Functions ise coroutine içinde çalıştırılabilen ve diğer suspend fonksiyonları çağırabilen fonksiyonlardır. Daha okunulabilir ve yönetilmesi kolay bir kod yazmanızı sağlar, ayrıca performansı arttırır.

import kotlinx.coroutines.*

fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
}

Bu kod akışında 1000L’lik bir delay (1 sn) ile “World!” string’i çalışır ama “Hello” stringi bu delaydan etkilenmeden hemen çalışır ve ekrana yazılır. Program çıktısı şu şekilde olur:

Hello,
World!

5. High Order Fonksiyonlar Nedir?

High order fonksiyonlar kısaca başka fonksiyonları parametre olarak alan veya fonksiyon döndüren fonksiyonlardır.

Örneklerle anlatmak gerekirse:

fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
return operation(x, y)
}

val sum = calculate(4, 5, { a, b -> a + b })
println(sum) // Output: 9

calculate fonksiyonunu oluştururken içerisine verebileceğimiz iki değişken (x ve y) bir de bu iki değişkeni döndürürken ne yapılacağını (operation) yazdık ardından oluşturduğumuz sum değişkeni ile calculate fonksiyonunu çağırıp x ve y değişkenlerimiz için bir değer atadık ardından lambda fonksiyonu içerisinde bu iki değer ile ne işlem yapacağımızı yazdık. Doğal olarak çıktımız 9 sayısını aldı.

Bir diğer örneğimiz:

fun createMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}

val multiplier = createMultiplier(2)
println(multiplier(5)) // Output: 10

Burada ilk örnekten biraz daha farklı olarak createMultiplier fonksiyonunda tek değişken (factor) veriyoruz ve bu değişkeni döndürürken number değişkeninden ekstra bir parametre ile çarpım işleminin yapılmasını istiyoruz.

multiplier ile bir değişken oluşuturup önceden oluşturduğumuz fonksiyon olan createMultiplier’ı çağırıp içerisine istediğimiz değeri verebiliyoruz (Örnekte 2 sayısı verilmiş).

Daha sonrasında bu oluşturduğumuz değişkeni çapırıp içerisine istediğimiz değeri verebiliyoruz (Örnekte 5 sayısı verilmiş). Daha sonra değişkeni oluştururken ve çağırırken verdiğimiz iki değer çarpılarak çıktı olarak yazılıyor.

Bir diğer örneğimiz:

val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled) // Output: [2, 4, 6, 8, 10]

Bu örnekte de lambda değişkeni ile kullanım gösterilmiştir.

numbers değişkeni 1'den 5'e kadar bir liste döndürüyor ve oluşturulan doubled değişkeni ile numbers değişkenini map’leyip her bir elemanını 2 ile çarpıyor.

Sonuç

Bu makalede ele aldığımız sorular ve konular, Kotlin bilgisi gerektiren iş görüşmelerinde sıkça karşılaşabileceğiniz önemli başlıkları kapsamaktadır. Data class’lar, extension functions, sealed class’lar, coroutines, ve higher-order functions gibi kavramlar, dilin sunduğu güçlü özellikleri anlamanızı ve uygulamanızı sağlar.

Mülakatlarda başarılı olmanız için sadece dilin temel kavramlarını bilmek yetmez; aynı zamanda bu bilgiyi nasıl uygulayacağınızı da bilmeniz gerekir.

Herkese iyi çalışmalar ve mülakatlarda başarılar dilerim!

Referanslar

--

--