🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-8: Encapsulation (Kapsülleme) ve Erişim Belirteçleri 🛡️

Konu Özeti

Java'da Encapsulation (Kapsülleme) ilkesi, sınıf içi veri alanlarını private yaparak dışarıdan doğrudan erişimi engeller ve veri güvenliği ile doğrulama sağlar. Erişim belirteçleri (private, default, protected, public) üyelerin görünürlüğünü belirler. Getter ve setter metotları, kontrollü okuma ve yazma işlemleri için kullanılır; setter içinde mantıksal kontroller yapılarak geçersiz değer atamaları önlenir.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-8: Encapsulation (Kapsülleme) ve Erişim Belirteçleri 🛡️

Selamlar! Serimizin 8. bölümüne hoş geldiniz.

Önceki bölümde Yapıcı Metotları (Constructors), `this()` ile zincirleme yapıları ve Garbage Collector bellek yönetimini detaylarıyla incelemiştik. Bu bölümde ise Nesne Yönelimli Programlamanın (OOP) 4 ana sütunundan ilki olan **Encapsulation (Kapsülleme)** ilkesini, **Erişim Belirteçlerini (Access Modifiers)** ve **Getter / Setter** metotlarını öğreneceğiz.

---

📌 1. Encapsulation (Kapsülleme) Nedir ve Neden Gereklidir? 🔒

Encapsulation; bir sınıfın içerisindeki veri alanlarını (fields) dış dünyadan saklayarak, bu verilere doğrudan kontrolsüz erişimi engelleme ilkesidir.

Neden Gereklidir?
🛡️ **Veri Güvenliği ve Doğrulama:** Nesnenin durum değişkenlerine mantıksız değerlerin (örneğin eksi yaş, negatif maaş veya hatalı tc kimlik no) atanmasını önler.
⚙️ **Esneklik ve Bakım Kolaylığı:** Sınıfın iç mantığı değiştirildiğinde, dışarıdaki kodların kırılmasını engeller.
👁️ **Gizleme (Information Hiding):** Dış dünyaya sadece gerekli arayüzü sunar, hassas detayları saklar.

---

🚪 2. Erişim Belirteçleri (Access Modifiers) 🔑

Java'da sınıf üyelerine (field, metot, constructor) nereden erişilebileceğini belirleyen 4 farklı erişim seviyesi vardır:

| Erişim Belirteci | Aynı Sınıf | Aynı Paket | Alt Sınıf (Subclass) | Tüm Dünya |
| :--- | :--- | :--- | :--- | :--- |
| `private` | ✅ Evet | ❌ Hayır | ❌ Hayır | ❌ Hayır |
| *(default)* (Belirteçsiz) | ✅ Evet | ✅ Evet | ❌ Hayır | ❌ Hayır |
| `protected` | ✅ Evet | ✅ Evet | ✅ Evet | ❌ Hayır |
| `public` | ✅ Evet | ✅ Evet | ✅ Evet | ✅ Evet |

> **Altın Kural:** Encapsulation ilkesi gereği sınıf içi değişkenler (fields) her zaman **`private`** yapılmalı, dış dünyaya erişim **Getter** ve **Setter** metotları ile kontrolden geçirilerek sunulmalıdır!

---

🛠️ 3. Getter ve Setter Metotları 🎛️

• **Getter:** `private` olan bir değişkenin değerini **okumak** için kullanılır (`getDegiskenAdi()`).
• **Setter:** `private` olan bir değişkenin değerini **değiştirmek/güncellemek** için kullanılır (`setDegiskenAdi(yeniDeger)`). Setter içinde veri doğrulaması (validation) yapılır.

### Sınıf Tanımı (`BankaHesabi.java`):

public class BankaHesabi {
private String hesapNumarasi;
private String hesapSahibi;
private double bakiye;

// Constructor
public BankaHesabi(String hesapNumarasi, String hesapSahibi, double ilkBakiye) {
this.hesapNumarasi = hesapNumarasi;
this.hesapSahibi = hesapSahibi;
setBakiye(ilkBakiye); // Doğrulama mantığından geçsin diye setter çağrılır
}

// Getter Metotları (Okuma)
public String getHesapNumarasi() {
return hesapNumarasi;
}

public String getHesapSahibi() {
return hesapSahibi;
}

public double getBakiye() {
return bakiye;
}

// Setter Metodu (Kontrollü Yazma)
public void setBakiye(double bakiye) {
if (bakiye >= 0) {
this.bakiye = bakiye;
} else {
System.out.println("HATA: Bakiye negatif olamaz! İşlem engellendi.");
}
}

// İş Mantığı Metotları
public void paraYatir(double miktar) {
if (miktar > 0) {
this.bakiye += miktar;
System.out.println(miktar + " TL yatırıldı. Güncel Bakiye: " + this.bakiye + " TL");
}
}

public void paraCek(double miktar) {
if (miktar > 0 && miktar <= this.bakiye) {
this.bakiye -= miktar;
System.out.println(miktar + " TL çekildi. Kalan Bakiye: " + this.bakiye + " TL");
} else {
System.out.println("HATA: Yetersiz bakiye veya geçersiz miktar!");
}
}
}

---

🧪 4. Kapsüllü Sınıfın Kullanımı (`Main.java`) 🚀

public class Main {
public static void main(String[] args) {
BankaHesabi hesap = new BankaHesabi("TR12345", "Ahmet Yılmaz", 1000.0);

// HATA! private değişkenlere doğrudan erişilemez:
// hesap.bakiye = -5000.0; // Derleme Hatası Verir! (bakiye has private access)

// Kontrollü erişim
System.out.println("Hesap Sahibi: " + hesap.getHesapSahibi());
System.out.println("Mevcut Bakiye: " + hesap.getBakiye() + " TL");

// Hatalı atama denemesi (Setter engeller)
hesap.setBakiye(-500.0);

// Doğru işlemler
hesap.paraYatir(500.0);
hesap.paraCek(2000.0); // Yetersiz bakiye uyarısı verir
hesap.paraCek(300.0); // Başarılı çekim
}
}

---

📖 5. Salt Okunur (Read-Only) ve Salt Yazılır (Write-Only) Yapılar 📝

Kapsülleme sayesinde sınıflarınızın erişim haklarını tamamen özelleştirebilirsiniz:

• **Read-Only (Salt Okunur) Sınıf:** Sadece `Getter` metotları tanımlanır, `Setter` metotları yazılmaz. Nesne oluştuktan sonra değerleri dışarıdan değiştirilemez (Immutable mantığına yakındır).
• **Write-Only (Salt Yazılır) Sınıf:** Sadece `Setter` metotları tanımlanır, `Getter` yazılmaz. Örneğin bir parola doğrulama sisteminde parolanın dışarıdan okunması istenmiyorsa tercih edilir.

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde OOP'nin ilk temel direği olan Encapsulation ilkesini, erişim belirteçlerini (`private`, `public`, `protected`, default) ve Getter/Setter mimarisini öğrendik.

👉 **Bölüm 9'da Bizi Ne Bekliyor?**
• OOP'nin İkinci Ana Temeli: **Inheritance (Kalıtım / Miras Alma)** 🧬
• `extends` Anahtar Kelimesi
• `super` Keyword Kullanımı (`super()`, `super.metot()`)
• Metot Ezme / İptal Et
me (**Method Overriding**) ve `@Override` Anotasyonu

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
136,520Threads
3,306,213Messages
328,368Members
InMyLtpiuuXDLatest member
Top Bottom