Kotlin Mülakat Soruları Part 7

Emine Şa
3 min readSep 9, 2024

Soru cevapta 7. serideyiz 61–70 arasındaki soruları cevaplıycaz :) HAZIRSANIZ BAŞLAYALIM 🎉🌟

Soru 61: Generic nedir?

Bizi karmaşıklığa götürmeden, casting işlemlerini compile-time’da hallederek run-time’da güvenli casting işlemi yapmayı sağlayan yapılara generic denir. Compile-time’da yapılan tür kontrolü, hatalı tür dönüşümlerini önler ve böylece kodun daha güvenli ve esnek olmasını sağlar. Bu sayede, tür belirleme işlemleri run-time’da değil, compile-time’da gerçekleşir.

Soru 62: Upcasting işlemi nedir?

Bir alt sınıfın (subclass) nesnesini, üst sınıf (superclass) olarak kullanma işlemidir. Bu işlem, türler arasındaki hiyerarşiyi yukarı doğru kullanır. Upcasting genellikle güvenlidir ve casting işlemi otomatik olarak yapılabilir. Aşağıdaki örnekte, Dog nesnesi Animal türünde bir değişkene atanıyor. Bu işlem otomatik olarak gerçekleşiyor çünkü Dog, Animal sınıfından türemiştir. Bu yüzden güvenlik ile ilgili bir sorun yoktur.

class Animal
class Dog : Animal()

val dog: Dog = Dog()
val animal: Animal = dog // Upcasting: Dog, Animal olarak kullanılıyor.

Soru 63: Downcasting işlemi nedir?

Downcasting, bir üst sınıfın (superclass) nesnesini, alt sınıf (subclass) olarak kullanma işlemidir. Türler arasındaki hiyerarşi bu kez aşağıya doğru kullanılır. Ancak downcasting işlemi güvenli olmayabilir ve çalışma zamanında (runtime) hata oluşabilir. Bu nedenle explicit (açık) casting yapılması gerekir. Aşağıdaki örnekte, Animal nesnesi Dog türüne dönüştürülüyor. Ancak bu işlem güvenli olmadığından, as anahtar kelimesi ile açık bir casting yapılması gerekir.

class Animal
class Dog : Animal()

val animal: Animal = Dog()
val dog: Dog = animal as Dog // Downcasting: Animal, Dog'a çevriliyor.

Soru 64: Generic’lerin invariant olması durumu nedir?

Kotlin’de generic’ler invariant’tır. Bu, örneğin List<String>'in List<Any>'nin bir alt tipi olmadığı anlamına gelir. Yani, List<String>, List<Any> yerine kullanılamaz.

Bu durum, tür güvenliğini (type safety) sağlamak için önemlidir. Eğer generic’ler covariant ya da contravariant olsaydı, farklı türler arasında hatalı işlemler yapılabilir ve çalışma zamanında hatalarla karşılaşılabilirdi. Bu yüzden, Kotlin generic’lerde invariance varsayılan bir davranıştır. Bu yaklaşım, tiplerin yanlış bir şekilde değiştirilmesini engelleyerek güvenli kod yazılmasını sağlar.

Soru 65: Generic’lerde Covariant Ne Demektir?

Kotlin’de covariance, bir generic sınıf ya da arayüzün kendisi ve sub type’ına sahip olabilmesi anlamına gelir. Kotlin’de bunu belirtmek için out anahtar kelimesi kullanılır. Örneğin, List<out T> ifadesi, List<String>'in List<Any> olarak kullanılabileceğini gösterir. Covariant yapılar, genellikle veriyi yalnızca okuyan durumlar için uygundur. Bu şekilde, farklı sub typeler arasında güvenli bir şekilde işlem yapılabilir.

Soru 66: Generic’lerde Contravariant Ne Demektir?

Kotlin’de contravariance, bir generic sınıf ya da arayüzün bir kendisine ve süper type’ına sahip olabilmesi anlamına gelir. Bunu ifade etmek için in anahtar kelimesi kullanılır. Örneğin, Comparable<in T> ifadesi, Comparable<Any>'nin Comparable<String> yerine kullanılabileceğini belirtir. Contravariant yapılar, genellikle veriyi yalnızca yazan durumlar için uygundur. Bu sayede, türler arasında güvenli bir şekilde veri işleme sağlanır.

Soru 67: Any yerine Generic Type’ları kullanmanın artısı nedir?

Any yerine generic type'ları kullanmanın birkaç avantajı vardır:

  • Tür Güvenliği: Generic type’lar, tür hatalarını derleme zamanında yakalayarak kodunuzu daha güvenli hale getirir. Örneğin, List<String> sadece String elemanlar içerir.
  • Kod Okunabilirliği: Generic type’lar, kodun amacını ve veri türünü net bir şekilde belirtir, bu da kodun anlaşılmasını kolaylaştırır.
  • Türe Özgü İşlemler: Belirli türlerle çalışarak, özel işlemler yapabilir ve kodunuzu özelleştirebilirsiniz.
  • Covariance ve Contravariance: out ve in anahtar kelimeleri sayesinde güvenli tip dönüşümleri sağlar ve tür güvenliğini korur.

Soru 68: Type Erasure Ne Demektir?

Type erasure, generic türlerin runtime sırasında tür bilgisinin kaybolmasıdır. Yani, compile time sırasında generic türlerin hangi türlerle çalıştığı belirlenmiş olabilir, ancak runtime sırasında bu türler hakkında net bir bilgi bulunmaz. Bu durum, generic türlerin runtime tür ayrımını yapmayı zorlaştırır bu da tür kaybına neden olabilir.

Soru 69: Type erasure’un yarattığı problem nasıl çözülebilir?

Type erasure’ın yarattığı sorunları çözmek için Kotlin’de iki etkili yöntem bulunmaktadır. İlk olarak, reified keyword'ü ile inline fonksiyonlar kullanarak generic tür bilgilerini runtime’da koruyabilirsiniz. Bu, tür kontrolü ve dönüşümlerini runtime'da gerçekleştirmenize olanak tanır. İkinci olarak, Class<T> nesneleri kullanarak tür bilgilerini saklayabilir ve bu bilgileri runtime boyunca erişilebilir hale getirebilirsiniz. Bu yöntemler, type erasure'ın neden olduğu tür kaybını yönetmenize yardımcı olur.

Soru 70: in ve out Anahtar Kelimeleri Kullanılarak Type Safety Nasıl Sağlanır?

Kotlin’de in ve out anahtar kelimeleri, generic türlerin type safety (tip güvenliği) sağlanmasında önemli bir rol oynar. in ve out anahtar kelimeleri, generic türlerin sadece belirli işlemlerde kullanılmasına izin vererek, tür uyumluluğunu garanti eder. Bu, özellikle generic türlerin farklı alt ve üst türlerle nasıl etkileşimde bulunacağını yönetirken kritik bir avantaj sağlar.

Eklemek istediğiniz bir soru veya var olan soruya yeni bir cevabınız varsa hemen ekleyin :)

--

--

Emine Şa
Emine Şa

Written by Emine Şa

Software Engineer | Android, Kotlin

No responses yet