C# gibi nesne yönelimli programlama dillerinde sınıflar, nesneler ve kapsülleme temel kavramlardır. Bu yapılar, gerçek dünyadaki varlıkları ve süreçleri yazılım dünyasında modellemeyi sağlar. Bu makalede C# dilinde sınıflar nasıl tanımlanır, nesneler nasıl oluşturulur ve kapsülleme ile veri nasıl korunur gibi konuları detaylı olarak ele alacağız.

Sınıflar ve Gerçek Dünya Modellemesi

Sınıflar, nesne yönelimli programlamada gerçek dünyadaki nesneleri soyutlamak için kullanılır. Örneğin bir “Araba” sınıfı oluşturduğumuzda, bu sınıf araba ile ilgili özellikleri (renk, marka, model) ve davranışları (hızlanma, fren yapma) tanımlar. Sınıflar, veri ve işlevleri bir arada tutan şablonlardır. Gerçek dünya modellemesi yaparken sınıflar verileri ve bu veriler üzerinde çalışan metotları (fonksiyonları) içerir.


public class Araba
{
    public string Marka;
    public string Model;
    public int Yil;

    public void Hizlan()
    {
        Console.WriteLine("Araba hızlanıyor...");
    }

    public void FrenYap()
    {
        Console.WriteLine("Araba fren yapıyor...");
    }
}

Nesne Oluşturma ve Kullanımı

Sınıf tanımlandıktan sonra bu sınıftan nesneler üretilebilir. Nesneler, sınıfların somut örnekleridir. Bir sınıf birden fazla nesne oluşturmak için kullanılabilir. Araba sınıfından bir nesne oluşturduğumuzda, bu nesne sınıfın tanımladığı değerlere sahip olacaktır. Her nesne kendi içinde bağımsızdır ve kendi verilerini tutar.


Araba benimArabam = new Araba();
benimArabam.Marka = "Toyota";
benimArabam.Model = "Corolla";
benimArabam.Yil = 2020;

benimArabam.Hizlan();  // Çıktı: Araba hızlanıyor...

Kapsülleme (Encapsulation) ve Veri Güvenliği

Kapsülleme, nesne yönelimli programlamanın temel ilkelerinden biridir. Bu ilke sayesinde sınıf içindeki verilerin dış dünyadan korunması sağlanır. C# dilinde bu işlem, erişim belirteçleri (access modifiers) ile yapılır. En yaygın kullanılan erişim belirteçleri şunlardır:

  • public: Her yerden erişilebilir.
  • private: Sadece tanımlandığı sınıf içinden erişilebilir.
  • protected: Sadece tanımlandığı sınıf ve bu sınıftan türeyen sınıflar tarafından erişilebilir.

Kapsülleme sayesinde sınıf içindeki verilerin yanlışlıkla değiştirilmesi engellenir. Bu verileri kontrol altına almak için genellikle “property” (özellik) kullanılır. Property’ler aracılığıyla veri okuma ve yazma işlemleri üzerinde kontrol sağlanabilir.


public class Araba
{
    private string marka;
    private string model;
    private int yil;

    public string Marka
    {
        get { return marka; }
        set { marka = value; }
    }

    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    public int Yil
    {
        get { return yil; }
        set
        {
            if (value > 1900)
                yil = value;
            else
                Console.WriteLine("Geçersiz yıl!");
        }
    }
}

Yapıcı Metotlar (Constructors)

Sınıfın bir nesnesi oluşturulduğunda başlatma işlemleri genellikle yapıcı metotlar (constructor) ile yapılır. Yapıcı metotlar, sınıf ile aynı isme sahiptir ve geri dönüş değeri yoktur. Nesne oluşturulurken başlatılması gereken veriler burada tanımlanabilir.


public class Araba
{
    public string Marka { get; set; }
    public string Model { get; set; }
    public int Yil { get; set; }

    public Araba(string marka, string model, int yil)
    {
        Marka = marka;
        Model = model;
        Yil = yil;
    }
}

// Nesne oluşturulurken değerler constructor ile atanır:
Araba yeniAraba = new Araba("Honda", "Civic", 2022);

Gerçek Dünya Örneği: Kütüphane Sistemi

Bir kütüphane sistemi örneği üzerinden bu kavramları daha iyi anlayabiliriz. Kitaplar, üyeler ve ödünç alma işlemleri gibi yapıları modelleyebiliriz. Örneğin “Kitap” sınıfı şu şekilde tanımlanabilir:


public class Kitap
{
    private string baslik;
    private string yazar;
    private bool oduncAlindi;

    public string Baslik
    {
        get { return baslik; }
        set { baslik = value; }
    }

    public string Yazar
    {
        get { return yazar; }
        set { yazar = value; }
    }

    public bool OduncAlindi
    {
        get { return oduncAlindi; }
        private set { oduncAlindi = value; } // Sadece sınıf içinden değiştirilebilir
    }

    public void OduncVer()
    {
        if (!OduncAlindi)
        {
            OduncAlindi = true;
            Console.WriteLine($"{Baslik} kitabı ödünç verildi.");
        }
        else
        {
            Console.WriteLine($"{Baslik} zaten ödünç alınmış.");
        }
    }

    public void IadeEt()
    {
        if (OduncAlindi)
        {
            OduncAlindi = false;
            Console.WriteLine($"{Baslik} kitabı iade edildi.");
        }
        else
        {
            Console.WriteLine($"{Baslik} ödünç alınmamış.");
        }
    }
}

Bu örnekte, oduncAlindi alanı private olarak tanımlanmıştır. Böylece dışarıdan doğrudan erişim engellenmiş olur. Kitabın ödünç verilip verilmediğini kontrol etmek ve değiştirmek için sadece sınıf içinde tanımlı metotlar kullanılabilir. Bu da veri bütünlüğünü sağlar.

Sonuç

C# dilinde sınıflar, nesneler ve kapsülleme, gerçek dünya problemlerini yazılım dünyasında modellemek için güçlü araçlardır. Sınıflar sayesinde verileri ve davranışları düzenli bir şekilde tanımlayabilir, nesneler ile bu tanımları somutlaştırabiliriz. Kapsülleme ile de verileri dış etkenlerden koruyarak güvenliği artırabiliriz. Bu yapılar bir araya geldiğinde daha güvenli, okunabilir ve sürdürülebilir kod yazmamız mümkün olur.