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.
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:
- Bir araya getirme. Veri (bakiye) ve onun üzerinde çalışan kod (para yatırma, para çekme) aynı sınıfta yaşar.
- 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.
| Dil | Gizli üye | Public üye | Kim zorunlu kılar |
|---|---|---|---|
| Python | _name, __name | name | Gelenek |
| Java | private int name | public int name | Derleyici |
| C++ | private: bölümü | public: bölümü | Derleyici |
| JavaScript | #name | name | JavaScript 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
withdrawiç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
setBalancehiçbir şeyi korumaz. Her alana ham erişim değil, nesnenin ihtiyaç duyduğu işlemleri (withdraw) sun. - Dahili nesneleri döndürmek.
self._itemsdö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
_namedeğ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?
deposit ve withdraw metotlarını verir. Ad, içindekileri içeride tutan bir kabuk olan kapsülden gelir.Kapsüllemeye örnekler nelerdir?
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?
C++'ta kapsülleme nedir ve nasıl kullanılır?
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.