Kotlin’de Class Kavramı

Aysel Aydin
İyi Programlama
4 min readApr 11, 2020

--

Merhaba arkadaşlar, bu yazımızda Kotlin dilinde sınıf ve nesne kavramlarını detaylı bir şekilde ele alıyor olacağız.

Kotlin’de bir class oluşturmak için class keyword’ünü kullanırız.

 class Person{  }

Kotlin’de primary ve secondary olmak üzere iki tip constructor vardır. Bir class bir primary constructor’a ve birden fazla secondary constructor’a sahip olabilir. Constructor, bir nesneyi yaratmak için bize neyin gerekli olduğunu söyleyen yapılardır.

Primary Constructor

Primary constructor tanımlamak için class’ımızda ismin hemen yanında parantezden önce constructor keywordü ile tanımlama yapabiliyoruz. Eğer herhangi bir annotations’a veya access modifiers’a (public, private..) sahip değilse constructor anahtar kelimesinin kullanılmasına gerek yoktur.

class Person constructor(parameter: String){  }class Person (parameter: String){  }

Yukarıdaki iki tanımlama arasında bir fark yoktur. İki şekilde de kullanılabilir. Eğer herhangi bir primary constructor tanımlaması yapmazsak bile Java’daki default constructor gibi parametresiz bir primary constructor arka planda oluşturulacaktır.

class Person{ 
}

Bu şekilde oluşturulan bir Person class’ından

val personInstance = Person() şeklinde bir instance oluşturabiliriz.

Primary constructor tanımlayıp parametre verdiysek parametresiz şekilde Person class’ımızın bir nesnesini oluşturamayız.

Constructor’ın değişkenlerine default parametreler atayabiliriz yani overload edebiliriz.

class Person (name: String = "Aysel"){  
}

Primary constructor’lar herhangi bir kod bloğu içermezler. Eğer alınan parametrelerle herhangi bir işlem yapmak istiyorsak bunun için init bloğunu kullanmamız gerekir. init bloğu Primary cons. çalışmasıyla beraber çalışır. init bloğu secondary constructor’a göre öncelikli çalışır.

class Person (name: String){  init{
println("name: $name")
}
}

Secondary Constructor

Primary constructor’dan ayrı olarak class içerisinde yine constructor keywordü ile birden fazla secondary constructor oluşturulabilir.

class Person{

constructor(surname:String, age: Int)
}

Eğer primary cons. tanımlandıysa secondary cons. tanımlanırken primary cons.’ı delegate yani işaret etmesi gerekir ve bu işlem için secondary cons. sonuna :this() şeklinde this keyword’ünü ekleriz. Primary cons. parametre alıyorsa ona göre this() içerisinde o parametreleri de vermemiz gerekir. Ama primary cons. tanımlaması yoksa bu işleme gerek yoktur.

class Person (name: String){

constructor(personName:String, age: Int):this(personName){
}
}

Secondary constructor’da var ya da val keyword leri ile tanımlama yapılamaz.

class Person (name: String){   init{
print("name : $name")
}

constructor(personName:String, age: Int):this(personName){
}
}

Bu class içerisinde sırasıyla, primary cons., init blogu ve secondary cons. çalışır.

Instance

Kotlinde bir class’ın intance’ını;

val personInstance = Person()

şeklinde basitçe tanımlayabiliriz. Oluştururken kullanacağımız constructor bizden parametre bekliyorsa instance oluştururken bu değerleri de parametre olarak eklemeliyiz.

val personInstance = Person("Aysel")

Bir class’ın instance’ı oluşturulmasını engellemek istiyorsak primary cons. önüne private yazdığımızda bu class’tan instance oluşturulmasını engellemiş oluruz. Eğer secondary cons. public ise secondary cons. üzerinden instance oluşturulabilir. Bunun da önüne geçmek istiyorsak secondary cons. da private olarak tanımlamamız gerekir. Ya da direk class’ı abstract yaparız. Bu şekilde class’ımızdan instance oluşturulmasının önüne geçmiş oluruz.

Class’ı private yapmak instance oluşturulmasına engel değildir.

Inheritance (Kalıtım)

Bir class’tan miras alınabilmesi için miras alınmak istenen class’ın önünde open keyword’ünün olması gerekir.

class Person{
}
class Doctor: Person(){
}

: Person() ile miras işlemi gerçekleştirilir. (Bu işlem javada extends className şeklindedir. ) Kotlin’de tüm class’lar Any’den miras alır.

Bir class’ın extend edilmesini istemiyorsak önüne final keyword’ünü eklememiz yeterlidir. Kotlin’de default olarak bütün class’lar miras almaya kapalıdır. Bu yüzden open keyword’ü olmayan tüm class’lar final olarak düşünüldüğü için ayrıca belirtmeye gerek yoktur.

Bir class’ın içindeki bir metot ya da değişkene farklı bir işlev kazandırmak istiyorsak önüne open keywordü ekleriz ve extend ettiğimiz class’ta override ederiz open olarak tanımladığımız bu metot ve değişkenleri

open class Person{
open val name = "Aysel"
val age = 28
open fun writeName(){
print(name)
}
fun writeAge(){
print("Age: $age")
}
}
class Doctor: Person(){
override val name: String
get() = "Kotlin"
override fun writeName(){
print(name)
}
}

Person class’ında age değişkenimiz ve writeAge() metodumuzu override etmek zorunda değiliz çünkü open olarak tanımlanmamışlardır.

Override ettiğimizde;
val bir değişkeni var olarak değiştirebiliriz ama tam tersi işlemi yapamayız. Çünkü üst class’ta var olarak tanımlanan değişkenin alt class’ta val yapıldığı durumda set() metodu açıkta kalacaktır.

Extend edilen class’ın değişken ve metotlarına farklı bir anlam yüklenirse Polymorphism(çok biçimlilik) işlemi yapılmış olur

Not: Inheritance’a kapalı bir class’ın içinde open durumdaki bir değişkeni ya da metodu alt class’ta override edemeyiz. Çünkü class zaten inheritance işlemine kapalıdır.

Eğer primary constructor’da tanımlanan değişkenler var ya da val keywordü ile tanımlandıysa, class içerisindeki üye fonksiyonları içerisinde herhangi bir işlemde kullanabilmemiz için parametrelerin aynısından üye değişken olarak tanımlamamız ve init blogunda bu parametreleri ilgili değişkenlere atama yapmamız gerekir.

class Person constuctor(val name: String){
var name = name
init{
this.name = name
}
fun writeName(){
print(name)
}
}

Visibility Modifiers (Erişim Belirteçleri)

Kotlin’de toplamda 4 adet erişim belirteci bulunmaktadır. public, private, protected ve internal

Protected hariç geri kalanlar Top Level’dir. Yani protected belirteci class yanına yazılmaz sadece class içerisindeki değişkenlere verilir. Class önüne eklenmez ama primary constructor’da kullanabiliriz.

Bir sınıfın, fonksiyonun veya değişkenin başında herhangi bir erişim belirleyici tanımlanmazsa default olarak public atanır, bu da her yerde görüneceği anlamına gelir.

private her yerde görünürlüğünü gizler

internal sadece bulunduğu modülün içinde kullanılabilir.

Properties Vs Fields

Kotlin’de class içerisinde tanımlanan property’lerin get ve set metotları Java’nın aksine otomatik olarak yaratılır. Bir class içerisindeki property’e instance oluşturup okumak istersek orada değişkene değil get metoduna erişiriz. Değerinde değişiklik yapmak istediğimizde de set metoduna erişmiş oluruz. Eğer property private yapılırsa get ve set metotları silinmiş olur.

class Person{
val name = "Aysel"
}

bu işlemi Java’da yapmak istediğimiz de

class Person{
private String name;
public String getName(){
return name;
}
public void setName(String newName){
this.name = newName;
}
}

şeklinde get ve set metotlarını tanımlamak zorundaydık. Fakat Kotlin bunun otomatik olarak yapmaktadır.

Evet arkadaşlar Kotlin’de Class’lar konusuna giriş yapmış olduk. Abstract, Data, Sealed Class, Interfaces, enum, Object Decleration anlatımlarıyla devam ediyor olacağız. Bir sonraki yazımızda görüşmek dileğiyle :)

--

--