Menu
Coddy logo textTech

Kapsülleme (Encapsulation) Nedir?

Nesne yönelimli programlamada kapsülleme (encapsulation), bir nesnenin verisini ve bu veri üzerinde çalışan metotları genellikle bir sınıf olan tek bir birimde bir arada tutmak ve iç ayrıntıları gizleyerek diğer kodun nesneyi yalnızca public metotları üzerinden kullanmasını sağlamaktır.

Yazan Kevin Spektor, Kurucu ortak ve CTO

Güncellendi: 24 Eylül 2026

Bir bankacılık uygulamasının her hesabın bakiyesini sıradan bir değişkende sakladığını düşün. Programın herhangi bir yerindeki herhangi bir satır account.balance = -500 yazabilir ve hiçbir şey bunu durdurmaz. Canlı ortamda negatif bir bakiye ortaya çıktığında, ona dokunan her yeri bulmak için tüm kod tabanını aramak zorunda kalırsın. Kapsülleme bunu çözer: bakiye yalnızca birkaç metot üzerinden değişebilir ve bu metotlar kuralları uygular, örneğin bir para çekme işleminin bakiyeyi asla aşamayacağını.

Kapsülleme nasıl çalışır

Kapsülleme iki fikri birleştirir:

  1. Bir araya getirme. Veri (bakiye) ve onun üzerinde çalışan kod (para yatırma, para çekme) aynı sınıfta yaşar.
  2. Gizleme. Diğer kod yalnızca sınıfın public arayüzünü görür. Arkasındaki veri içeridedir, bu yüzden yalnızca sınıfın izin verdiği şekillerde değişebilir.

Sınıfın koruduğu kurala değişmez (invariant) denir: burada "bakiye asla negatif değildir". Her değişiklik sınıfın metotlarından geçtiği için programın geri kalanı ne yaparsa yapsın değişmez korunur.

70
refused: not enough money

Dışarıdaki kod acct.balance değerini okuyabilir, ama property'nin bir setter'ı yoktur; bu yüzden acct.balance = 1000 bir AttributeError fırlatır. Bakiye bir gün yanlış çıkarsa incelenecek tam olarak iki metot vardır.

Python'da kapsülleme

Python'da private anahtar kelimesi yoktur. Her Python programcısının bildiği isimlendirme kurallarına dayanır:

  • name: public, arayüzün parçası.
  • _name: dahili. Okumana hiçbir şey engel olmaz, ama baştaki alt çizgi "buna bağımlı olma" der.
  • __name: Python onu sınıf içinde yeniden adlandırır (name mangling); böylece bir alt sınıf onu yanlışlıkla ezemez.
  • @property: bir metodu bir nitelik gibi okunan bir şeye dönüştürür; böylece çağıran hiçbir kodu değiştirmeden sonradan kontroller ekleyebilirsin.
0
False
42

Name mangling erişimi değil, kazaları önler: değiştirilmiş isim hâlâ çalışır. Python programcıların alt çizgiye saygı göstereceğine güvenir. Pratikte Python kodunun çoğu tek alt çizgi artı @property kullanır ve çift alt çizgiyi alt sınıflarının yazılması amaçlanan sınıflara saklar. Sınıf yazmak hakkında daha fazlası Python sınıfları dokümanında.

Java, C++ ve JavaScript'te kapsülleme

Diğer diller gizlemeyi zorunlu kılar. Java'da private bir alan yalnızca kendi sınıfının içinde kullanılabilir:

public class BankAccount {
    private int balance;  // hidden from every other class

    public int getBalance() { return balance; }

    public void withdraw(int amount) {
        if (amount > balance) throw new IllegalArgumentException("not enough money");
        balance -= amount;
    }
}

Başka bir sınıfta account.balance = 1000; yazmak derlenmez: javac balance has private access in BankAccount hatasını bildirir.

DilGizli üyePublic üyeKim zorunlu kılar
Python_name, __namenameGelenek
Javaprivate int namepublic int nameDerleyici
C++private: bölümüpublic: bölümüDerleyici
JavaScript#namenameJavaScript motoru

C++ class üyelerini varsayılan olarak private, struct üyelerini public yapar. JavaScript'in ES2022'de eklenen # private alanları sınıfın dışından hiç okunamaz. Dokümanlar her birini anlatır: Java erişim belirleyicileri, C++ erişim belirleyicileri ve JavaScript private alanları.

Kapsülleme neden önemlidir

  • Kurallar tek bir yerde yaşar. "Bakiyenin üstünde para çekilemez" kontrolü, programdaki her para çekmeden önce değil, bir kez withdraw içinde yazılır.
  • İçeriyi özgürce değiştirebilirsin. Parayı float yerine tam kuruş olarak saklamaya karar verirsen yalnızca sınıf değişir. deposit(100) çağıran kod çalışmaya devam eder.
  • Daha kolay hata ayıklama. Bir değer yanlış olduğunda şüpheliler programdaki her satır değil, onu değiştirmesine izin verilen birkaç metottur.
  • Öğrenecek ve test edecek daha az şey. Üç public metodu olan bir sınıf bu üç metot üzerinden anlaşılabilir ve test edilebilir.

Kapsülleme sınıf seviyesinin üstünde de çalışır. İki fonksiyon sunan ve on yardımcıyı dahili tutan bir modül aynı şekilde kapsüllenmiştir; programların dosyaları yalnızca sistem çağrıları üzerinden açmasına izin veren bir işletim sistemi de öyle.

Kapsülleme çoğu zaman soyutlama ile karıştırılır. Soyutlama arayüzün ne sunduğuna karar verir; kapsülleme ise arkasındaki veriyi korur. Soyutlama sayfasında ikisinin yan yana tam bir karşılaştırması var. Çok biçimlilik ve kalıtımla (inheritance) birlikte nesne yönelimli programlamanın dört temel ilkesini oluştururlar.

Sık yapılan hatalar

  • Her alan için bir getter ve bir setter. Herhangi bir sayıyı kabul eden bir setBalance hiçbir şeyi korumaz. Her alana ham erişim değil, nesnenin ihtiyaç duyduğu işlemleri (withdraw) sun.
  • Dahili nesneleri döndürmek. self._items döndüren bir metot, çağırana gerçek listeyi verir ve çağıran artık onu değiştirebilir. Bunun yerine bir kopya ya da bir tuple döndür.
  • Private'ı güvenlik saymak. Erişim belirleyicileri saldırıları değil, hataları önler. Java kodu private alanları reflection ile okuyabilir, Python kodu da _name değerini doğrudan okuyabilir. Şifreler ve anahtarlar hashing ve şifreleme gibi gerçek bir korumaya ihtiyaç duyar.

Sırada ne var

Sırada iki fikir arasındaki farkı anlatan soyutlama sayfasını, ardından çok biçimlilik sayfasını oku. Python kursu sınıfları adım adım kurar; Java kursu ise derleyicinin zorunlu kıldığı kapsüllemeyi gösterir.

Sıkça Sorulan Sorular

Kapsülleme en basit haliyle ne demek?
Kapsülleme, bir nesnenin verisini kendine saklaması ve onu kullanmak için birkaç güvenli yol sunması demektir. Bir banka hesabı nesnesi yeni bir bakiye yazmana izin vermez; önce kuralları kontrol eden deposit ve withdraw metotlarını verir. Ad, içindekileri içeride tutan bir kabuk olan kapsülden gelir.
Kapsüllemeye örnekler nelerdir?
Değişikliklere yalnızca deposit ve withdraw üzerinden izin veren bir banka hesabı sınıfı klasik örnektir. Python'un kendi list tipi de bir örnektir: append çağırırsın ve öğeleri saklayan belleği hiç yönetmezsin. Birkaç fonksiyon sunan ve yardımcı fonksiyonlarını gizli tutan bir modül, daha büyük ölçekte kapsüllemedir.
Kapsüllemenin üç türü nedir?
Üç tür sayan eğitimler genellikle üye değişken kapsüllemesini (private alanlar), fonksiyon kapsüllemesini (private yardımcı metotlar) ve sınıf kapsüllemesini (başka bir sınıfın ya da modülün içinde gizlenmiş bir sınıf) kasteder. Bunlar resmi kategoriler değildir; alanlara, metotlara ve sınıfların tamamına uygulanan aynı fikirdir.
C++'ta kapsülleme nedir ve nasıl kullanılır?
C++'ta veri üyelerini private olarak işaretler ve onları okuyan ya da değiştiren public üye fonksiyonlar sağlarsın. Bir class üyeleri varsayılan olarak private, bir struct üyeleri ise varsayılan olarak public'tir. Derleyici, sınıfın dışında private bir üyeyi kullanmaya çalışan her kodu reddeder.
Ağ iletişiminde kapsülleme ne demek?
Ağ iletişiminde kapsülleme, verinin dışarı çıkarken her protokol katmanının başlıklarıyla sarılması demektir: bir HTTP mesajı bir TCP segmentinin içine, o bir IP paketinin içine, o da bir Ethernet çerçevesinin içine girer. Adı programlamadaki fikirle aynıdır ama farklı bir kavramdır.
Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA