Kotlin Erişim Belirleyiciler (public, internal , protected, private)

Merhaba arkadaşlar ,
Mobilhanem.com sitesi için anlattığımız / yayınladığımız Kotlin Dersleri serimize kaldığımız yerden devam ediyoruz. Bir önceki dersimizde Constructor (Yapıcı) Metot yapısından bahsetmiştik. Bu dersimizde ise Kotlin’de erişim belirleyiciler ile devam edeceğiz.

Kotlin ders listemizi takip ediyorsanız önceki derslerimizde değişkenler, fonksiyonlar ve sınıf yapılarından bahsettik. Nasıl değişken tanımlanır, fonksiyon nasıl tanımlanır ve nasıl çağırılır , sınıf nedir ve bu sınıftan nesne nasıl oluşturulur, constructor nedir ve ne işe yarar bunları anlatmış ve örnekler vermiştik. Bu dersimizde ise bu yapıları nasıl kısıtlı hale getiririz onu anlatmaya çalışacağız. Kısıtlamak nedir diye sorarsanız şöyle açıklamaya çalışayım.

Örneğin bir sınıf yazdınız ve bu sınıfınızın içinde değişkenleriniz, constructor’ınız ve fonksiyonlarınız var. Ama içerdeki değişkenlere herkesin ulaşmasını , değiştirmesini ve ya fonksiyonları herkesin kullanmasını istemiyorsunuz. Bunu neden yapmak isteyim ki gibi bir düşünceniz varsa ilerleyen derslerde Encapsulation (Kapsülleme) anlatacağız. O derste çok daha iyi anlayacaksınız. Nesne yönelimli programlamanın 3 temel kuralından biri olan encapsulation için erişim belirleyiciler olmazsa olmazdır.

Erişim belirleyiciler:

Kotlin’de 4 adet erişim belirleyici vardır: public, private, protected, internal

Örnekli anlatımlara geçmeden önce  aşağıda kısaca kim nelere ulaşıyor yazalım.

    1. public — Her yerden erişilebilir. public kelimesi halka açık anlamına gelmektedir. Bu erişim belirleyicisi ile tanımlanan her şey diğer bütün sınıflarlardan erişilebilinir. (Java ile aynı)
    2. private — Sadece tanımlandığı sınıftan erişilebilir. private özel veya gizli anlamına gelir. Bu erişim belirleyicisi ile tanımlanan herhangi bir eleman sadece ve sadece aynı sınıf içerisinden erişilebilir diğer sınıflar erişemez. (Java ile aynı)
    3. protected — Aynı sınıftan ya da o sınıftan türetilen sınıflar, nesneler tarafından erişilebilir. (Java’dan biraz daha farklı)
    4. internal —Aynı modül içindeki diğer sınıflar erişebilir. (Java’da yok)

     

Not: Eğer herhangi bir erişim belirleyici tanımlamazsak default olarak public olacaktır.

public fun test() {

}

fun test() {

}

Yukarıdaki kod da her iki fonksiyonun erişim belirleyicisi public’tir. Bu yüzden public erişim belirleyicisi yazmaya gerek yoktur.

Erişim Belirleyiciler’le Örnekler:

Örnek 1:

class Test {
    public var x = 1
    private var y = 9
    protected var z = 0
    internal var t = 5
}

class Test2 {
    fun mobilhanem() {
        val testObj = Test() // Test class'ından bir object(nesne) oluşturuyoruz
        
        testObj.x = 12
        testObj.y = 12 // hata (Can'not access 'y': it is private in Test )
        testObj.z = 12 // hata (Can'not access 'z': it is protected in Test )
        testObj.t = 12
    }
}

Test2 sınıfımızda ki mobilhanem fonksiyonu içinde öncelikle Test sınıfından bir nesne yarattık ve tek tek değişkenlerine ulaşmaya ve değiştirmeye çalıştık. x ile t değişkenine ulaşabilirken y ile z değişkenine ulaşamadık. Çünkü x değişkeni public ve herkese açık. t değişkeni internal ve bu iki sınıf (Test ve Test2) aynı modül içinde olduğu için ulaşabildik. y ise private başka bir sınıftan ulaşma şansımız yok. z ise protected sadece subclass’larından (türetilen) ulaşabiliriz.

Sadece değişken değil aynı şeyler fonksiyonlar için de geçerli.

Örnek 2:

class Test {
    fun publicFonksiyon() { // erişim belirleyicisi yazmadığı için public
        print("Public fonksiyon")
    }

    private fun privateFonksiyon() {
        print("Private fonksiyon")
    }

    protected fun protectedFonksiyon() {
        print("Protected fonksiyon")
    }

    internal  fun internalFonksiyon(){
        print("Internal fonksiyon")
    }


}

class Test2 {
    fun mobilhanem() {
        val testObj = Test()
        testObj.publicFonksiyon()
        testObj.privateFonksiyon() // hata
        testObj.protectedFonksiyon() //hata
        testObj.internalFonksiyon()
    }
}

İlk örnekle birebir aynı diyebileceğimiz bir örnek. Farklı bir sınıftan public ve internal (aynı modülde oldukları için) fonksiyonlara ulaştık. private ve protected olanlara ise ulaşamadık.

Örnek 3:

open class Test {

    fun publicFonksiyon() {
        print("Public fonksiyon")
    }

    private fun privateFonksiyon() {
        print("Private fonksiyon")
    }

    protected fun protectedFonksiyon() {
        print("Protected fonksiyon")
    }

    internal  fun internalFonksiyon(){
        print("Internal fonksiyon")
    }
}

class Test2: Test() { // Test sınıfından Test2 sınıfını türetiyoruz.

    fun mobilhanem() {
        publicFonksiyon()
        privateFonksiyon() // hata
        protectedFonksiyon()
        internalFonksiyon()
    }
}

Yukarıda ki örnekte Test2 sınıfı Test sınıfından türetildi. Türetmek ne demek derseniz bunu ilerleyen derslerde anlatacağız. Şimdilik bilmeniz gereken Test2 sınıfı Test sınıfından türetildi. Yani Test2, Test sınıfının alt sınıfıdır(subclass). Alt sınıf üst sınıfın protected değişken ve fonksiyonlarına ulaşabiliyor ama private olanlara ulaşamıyor. public ve internal’a ise zaten ulaşabiliyordu.

Örnek 4:

class Test {

    public fun publicFonksiyon() {
        print("Public fonksiyon")
    }

    private fun privateFonksiyon() {
        print("Private fonksiyon")
    }

    protected fun protectedFonksiyon() {
        print("Protected fonksiyon")
    }

    internal  fun internalFonksiyon(){
        print("Internal fonksiyon")
    }
    
    fun mobilhanem() {
        publicFonksiyon() 
        privateFonksiyon()
        protectedFonksiyon()
        internalFonksiyon()
    }

}

Yukarıda ki örnekte de aynı sınıf içinden private olsa bile değişken ve ya fonksiyona erişebildiğimizi görüyorsunuz. mobilhanem fonksiyonu içinde diğer fonksiyonlara hatasız ulaşabildik.

Bu dersimde sizlere Kotlin Erişim Belirleyiciler’i anlatmaya çalıştım. Bol örnekler vererek pekiştirdik. Bu örnekleri https://try.kotlinlang.org online ide ile deneyebilirsiniz. Bir sonraki dersimizde Nesne Yönelimli Programla’ya (OOP) giriş yapacağız. Umarım işinize yaramıştır.

Bir sonraki dersimde görüşmek dileğiyle …

73

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

2 Yorum

  • Taha hocam eğitimler için teşekkür ederim. Lütfen bu seriye devam ediniz. internette sizden başka bu kadar açıklayıcı ve net anlatmıyor kimse. Allah sizden razı olsun üni hocalarımız başından savıyor geçiştiriyor işlemiyor bile bu konuları

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?