-
Sadrazamv4
ig:sadrazam_v4 tg: Sadrazam.spy
🚀 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! ☕✨
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