Anasayfa / C# / CONSOLE APPS / C# Sınıflar ve Nesneler (Classes and Objects)

C# Sınıflar ve Nesneler (Classes and Objects)

C# programlama eğitim serimizin en önemli ve heyecan verici konularından birine hoş geldiniz. Şu ana kadar değişkenleri, döngüleri ve fonksiyonları kullanarak harika programlar yazdık. Ancak yazdığımız kodlar büyüdükçe, her şeyi tek bir dosyada veya dağınık fonksiyonlar halinde yönetmek imkansız hale gelir. İşte bu noktada yazılım dünyasının kurallarını değiştiren Nesne Yönelimli Programlama (OOP – Object Oriented Programming) devreye girer.

C#, modern ve nesne yönelimli (object-oriented) bir programlama dilidir. Nesne Yönelimli Programlama, yazılımın mantık ve işlevler yerine sınıflar (classes) ve veri yapıları (nesneler – objects) etrafında tasarlandığı bir programlama paradigmasıdır. Bu rehberimizde, C# dilinde sınıfların ve nesnelerin ne olduğunu, nasıl kullanıldığını ve gerçek dünyayı kodlara nasıl aktaracağımızı bol örneklerle inceleyeceğiz.

Nesne Yönelimli Programlama (OOP) Mantığı Nedir?

Nesne yönelimli programlamanın temel fikri, arabalar veya insanlar gibi gerçek dünyadaki şeyleri temsil etmek için nesneleri (objects) kullanmaktır. Gerçek dünyadaki her varlığın sahip olduğu özellikleri (rengi, boyu, modeli) ve yapabildiği davranışları (koşması, durması, çalışması) vardır. OOP sayesinde, bu özellikleri ve davranışları dijital dünyada birebir modelleyebiliriz. Bu yaklaşım, karmaşık programları daha küçük ve bakımı daha kolay bileşenlere ayırmanıza olanak tanır.

Sınıf (Class) Nedir?

C#, sınıf tabanlı (class-based) bir programlama dilidir. Sınıf (Class), nesnelerin oluşturulduğu, kullanıcı tarafından tanımlanan bir taslaktır (blueprint) veya prototiptir. Sınıflar; alanları (fields), özellikleri (properties) ve metotları (methods) tek bir birimde birleştirir.

Konuyu en basit haliyle anlamak için bir sınıfı “kurabiye kalıbı” (cookie cutter) olarak düşünebilirsiniz. Kurabiye kalıbının kendisi yenmez, o sadece ortaya çıkacak ürünün şeklini ve sınırlarını belirleyen bir tasarımdır.

Örneğin, bir Araba sınıfı Renk (Color) ve Model gibi özellikleri ve Çalıştır() – Start() ile Durdur() – Stop() gibi metotları içerebilir.

Nesne (Object) Nedir?

Nesneler, sınıfların örnekleridir (instances); yani oluşturduğumuz taslaktan (sınıftan) üretilen somut varlıklardır. Sınıflar ve nesneler arasındaki bu ilişki, gerçek dünyadaki nesneleri nasıl kategorize ettiğimizi yansıtır.

Kurabiye kalıbı analojisinden devam edersek; nesneler, o kalıptan çıkan bireysel kurabiyelerin ta kendisidir. Kalıp (Sınıf) tek bir tanedir, ancak o kalıbı kullanarak çikolatalı, vanilyalı veya üzümlü yüzlerce farklı kurabiye (Nesne) üretebilirsiniz.

C#’ta Sınıf ve Nesne Nasıl Oluşturulur?

Sınıf tanımlamak class anahtar kelimesi ile başlar ve ardından sınıfın adı gelir. Sınıf gövdesinin içinde verileri depolamak için alanlar (fields/properties) ve davranışları uygulamak için metotlar tanımlarız.

Bir nesne oluşturmak için ise sınıf adıyla birlikte new anahtar kelimesi kullanılır; bu işlem bellekte yer ayırır ve nesneyi başlatmak için sınıfın kurucusunu (constructor) çağırır.

Hemen Visual Studio veya VS Code üzerinde Araba sınıfımızı tasarlayalım:

// 1. Araba adında bir Sınıf (Class) yani TASLAK oluşturuyoruz.
public class Araba
{
    // Özellikler (Properties) - Arabanın neleri var?
    public string Marka { get; set; }
    public string Renk { get; set; }
    public int UretimYili { get; set; }

    // Metotlar (Methods) - Araba ne yapabilir?
    public void Calistir()
    {
        Console.WriteLine($"{Marka} marka araba çalıştırıldı! Vroom vroom...");
    }

    public void Durdur()
    {
        Console.WriteLine($"{Marka} marka araba durduruldu.");
    }
}

Yukarıda kalıbımızı hazırladık. Şimdi programımızın ana gövdesine gidip bu kalıptan gerçek arabalar (nesneler) üretelim:

// new anahtar kelimesi ile 'benimArabam' adında somut bir nesne (object) üretiyoruz.
Araba benimArabam = new Araba();

// Nesnemizin özelliklerini atıyoruz
benimArabam.Marka = "Tesla";
benimArabam.Renk = "Kırmızı";
benimArabam.UretimYili = 2025;

// Nesnemizin davranışlarını (metotlarını) çağırıyoruz
benimArabam.Calistir();
// Çıktı: Tesla marka araba çalıştırıldı! Vroom vroom...

// Aynı kalıptan tamamen farklı ikinci bir araba daha üretebiliriz
Araba digerAraba = new Araba();
digerAraba.Marka = "Ford";
digerAraba.Renk = "Mavi";

digerAraba.Calistir();
// Çıktı: Ford marka araba çalıştırıldı! Vroom vroom...

Gördüğünüz gibi, bir tane Araba sınıfı yazdık ancak bu sınıfı kullanarak birbirinden tamamen bağımsız, farklı özelliklere sahip sayısız araba nesnesi üretebildik!

OOP’nin Dört Temel Taşı (The 4 Pillars of OOP)

Genellikle Nesne Yönelimli Programlama dilleri dört ana özelliği paylaşır: kapsülleme (encapsulation), kalıtım (inheritance), soyutlama (abstraction) ve çok biçimlilik (polymorphism). İyi bir C# geliştiricisi olmak için bu dört kavramı mutlaka bilmelisiniz:

1. Kapsülleme (Encapsulation): Verilerin bir nesne içinde kapsüllendiği ve güvence altına alındığı modüller oluşturur. Bir nesnenin iç çalışma detayları gizli tutulur ve yalnızca dışarıdan erişilmesine izin verilen özellikler (public) açığa çıkarılır. Nesne, davranışlarını metotlar aracılığıyla gizler ve bilgileri niteliklerde (özelliklerde) tutar.

2. Kalıtım (Inheritance): Nesne yönelimli programlamada yeni bir sınıf oluşturulduğunda, ebeveyn sınıfının (parent class) yapılarını ve işlevlerini devralmasına kalıtım denir. Sınıflar başka sınıflardan türetilebildiği için bir sınıf, ebeveyn sınıfının davranışını üstlenebilir. Örneğin bir SporAraba sınıfı oluşturduğunuzda, Araba sınıfından kalıtım alarak tüm araba özelliklerini otomatik olarak kazanmasını ve ekstra özellikler eklenmesini (örneğin Turbo) sağlayabilirsiniz. Bu, programcıların kodu yeniden kullanmasına olanak tanır.

3. Soyutlama (Abstraction): Sınıfların kendi uygulama detayları vardır ve soyutlama ile programcılar bu detayların karmaşıklığını gizleyerek kodu daha kolay yönetebilirler. Örneğin arabayı çalıştırırken motorun içindeki pistonların nasıl hareket ettiğini bilmenize gerek yoktur; sadece anahtarı çevirmeniz (yani Calistir() metodunu çağırmanız) yeterlidir.

4. Çok Biçimlilik (Polymorphism): Hiyerarşik bir sınıftaki nesnelerin ebeveyn sınıfıyla aynı işlevleri paylaşmasına ve çeşitli nesnelerin aynı arayüzle etkileşime girmesine olanak tanır. Ayrıca nesnenin davranışı çağrıldığı durumlara göre değişiklik gösterebilir; buna metot aşırı yükleme (method overloading) de denir.

Modern C# ve Sınıflar: Yeni Özellikler (Records ve Primary Constructors)

C# dili geliştikçe nesne ve sınıf yapıları da modernize edilmektedir. Geleneksel sınıfların yanı sıra modern C# (C# 9 ve sonrası), veri taşımak için özel olarak tasarlanmış “Records” (Kayıtlar) adı verilen yapıları da tanıtmıştır. Kayıtlar (Records), eşitlik için değer semantiğini (value semantics) izleyen referans türleri için daha kısa bir sözdizimi sunar.

Ayrıca, C# 12 ile birlikte gelen Birincil Kurucular (Primary constructors) özelliği sayesinde, doğrudan sınıf bildiriminin yanına kurucu (constructor) parametreleri ekleyerek çok daha temiz ve kısa kodlar yazabilirsiniz.

// Modern C# ile Birincil Kurucu (Primary Constructor) Kullanımı
public class Kullanici(string isim, int yas)
{
    public string Isim { get; } = isim;
    public int Yas { get; } = yas;
}

Sonuç

C# programlama dilinde ustalaşmanın sırrı Sınıflar ve Nesneler mimarisini iyi anlamaktan geçer. Sınıfları birer şablon, nesneleri ise bu şablondan üretilen gerçek ürünler olarak düşünmek, yazılımın gerçek hayatı modelleme yeteneğini ortaya çıkarır. Verileri ve işlevleri bir arada tutarak (sınıf tabanlı programlama) bakım sırasında oluşabilecek istenmeyen yan etkilerin potansiyelini azaltır ve kodu daha okunabilir kılar.

Öğrendiğimiz bu temel yapı, ileride ASP.NET Core ile devasa Web projeleri geliştirirken veya Unity oyun motoru ile oyun programlarken kullanacağınız en büyük silahınız olacaktır. Bir sonraki dersimizde OOP’nin en eğlenceli kısımlarından biri olan Kalıtım (Inheritance) konusuna daha derin bir dalış yapacağız. İyi kodlamalar!

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir