Part 3 Nesne Kavramı(Object Concept)

Nesne nedir?

Nesne, programlama dünyasında canlı bir kavram olarak kabul edilir. Genellikle bir varlığı veya bir varlığı temsil eden bir şeyi ifade eder. Bir nesne, gerçek dünyadaki varlıkların (örneğin, bir araba, bir kişi veya bir kitap) soyutlaması veya modellemesi olarak düşünülebilir. Bir nesne, verilerin ve işlevlerin bir araya gelmesiyle oluşan bir varlıktır.

Örneğin, bir araba nesnesi, arabanın markası, modeli, rengi gibi özelliklerini içerebilir. Bu özellikler, arabanın gerçek dünyadaki karşılıklarına karşılık gelir. Aynı zamanda araba nesnesi, arabayla ilgili işlevleri gerçekleştirmek için kullanılabilir, örneğin arabayı çalıştırma, durdurma veya hızını değiştirme gibi.

Nesneler, kompleks veri türleri olarak kabul edilir, çünkü anlamlı verilerin bir araya gelmesiyle oluşurlar. Nesneler, programlama dillerinde sınıflar veya yapılar aracılığıyla tanımlanır ve bu sınıflar veya yapılar, nesnenin özelliklerini (veri alanları veya özellikler) ve davranışlarını (metotlar veya işlevler) belirtir.

Özetlemek gerekirse, bir nesne, gerçek dünyadaki varlıkların soyutlaması veya modellemesi olarak düşünülebilir ve anlamlı verilerin bir araya gelmesiyle oluşur

Sınıftan nesne üretme

Sınıftan nesne üretme, programlamada sıklıkla kullanılan bir kavramdır. Bir sınıf, bir nesnenin yapısını ve davranışını tanımlayan bir şablondur. Örneğin, bir “Araba” sınıfı, arabaların sahip olabileceği özellikleri (marka, model, renk) ve davranışlarını (çalıştırma, durdurma, hız değiştirme) tanımlar.

Sınıftan nesne üretme işlemi, bu tanımlanan şablonu kullanarak gerçek dünyadaki bir varlığın veya bir varlığın temsili olan bir nesne oluşturma işlemidir. Bu işlem, genellikle “new” anahtar kelimesiyle gerçekleştirilir.

C# programlama dilinde, bir nesne oluşturmak için “new” anahtar kelimesi kullanılır. Örneğin:

Araba myCar = new Araba();

Bu ifade, “Araba” sınıfından bir nesne oluşturur ve bu nesneyi “myCar” adlı değişkene atar. “new” anahtar kelimesi, bellekte yeni bir nesne için alan ayrılmasını ve ardından nesnenin oluşturulmasını sağlar.

Bu şekilde oluşturulan nesne, artık “myCar” adlı değişken aracılığıyla erişilebilir ve kullanılabilir. Örneğin, bu nesne üzerinde tanımlı olan özelliklere (marka, model, renk) veya davranışlara (çalıştırma, durdurma, hız değiştirme) erişilebilir ve bu davranışlar çağrılabilir.

Sınıftan nesne üretme işlemi, programlamada varlık temsili ve modülerlik sağlama açısından önemlidir. Bir sınıfın birden fazla nesnesini oluşturarak farklı varlıkları veya durumları temsil etmek mümkündür, böylece programın daha modüler ve esnek olmasını sağlar.

Referans Nedir?

“Referans, programlama dünyasında sıkça kullanılan bir kavramdır ve genellikle bellek yönetimiyle ilgilidir. Bir referans, belirli bir bellek konumunu (veya adresini) işaret eden veya bir nesneye atıfta bulunan bir değişken veya işaretçidir.

C# gibi bazı programlama dillerinde, nesneler genellikle heap bellek bölgesinde oluşturulur ve bu nesnelere erişmek için referanslar kullanılır. Bir referans, aslında o nesnenin bellek adresini tutar ve nesneye erişmek için bu adresi kullanır. Bu nedenle, bir referansı bir nesneyle ilişkilendirdiğinizde, aslında o nesneye işaret etmiş olursunuz.

Ancak unutulmamalıdır ki, referanslar her zaman bir nesneyi işaret etmek zorunda değildir. Bazı durumlarda, bir referans bir nesneyi işaret etmeyebilir ve bu durumda referans değeri “null” olur. “Null” değeri, herhangi bir nesneye işaret etmediğini gösterir.

Stack ve heap bellek bölgeleri arasındaki ilişki, referansların nasıl kullanıldığını anlamak için önemlidir. Stack bellek bölgesinde tanımlanan referanslar, genellikle nesnelerin bellek adreslerini (referanslarını) tutarlar. Bu referanslar, heap bellek bölgesindeki ilgili nesnelere işaret ederler.

Bir nesneye referansla erişmek için, ilgili referansı kullanarak nesnenin özelliklerine veya metodlarına erişebiliriz.

Örneğin:

MyClass m = new MyClass();
m.MyMethod(); // MyClass sınıfının bir metodu çağrılıyor<br>

Burada, “m” adlı referansı kullanarak, “MyClass” sınıfından oluşturulan bir nesnenin “MyMethod” adlı bir metodunu çağırıyoruz.

Sonuç olarak, referanslar bellek yönetiminde ve nesnelere erişimde önemli bir rol oynarlar ve programlama dilindeki dinamik bellek yönetimi için vazgeçilmez bir araçtır.

Referans türüne göre nesne elemanlarına erişim

nesne elemanlarına erişim genellikle referans türüne göre yapılır. Referans türleri, genellikle bir sınıfın örneği olan nesneleri işaret eder. Bu nedenle, bir nesnenin elemanlarına erişirken, önce o nesneye bir referansla erişiriz, ardından bu referans üzerinden elemanlara erişiriz.

Nesne elemanlarına erişim, nokta işareti (.) kullanılarak yapılır. Örneğin, bir araba sınıfı düşünelim:

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

Bu sınıfın özelliklerine (Marka, Model, Yil) erişmek için bu özellikleri içeren bir Araba nesnesi oluşturmalıyız. Daha sonra, bu nesnenin özelliklerine erişmek için oluşturduğumuz referansı kullanırız:

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

Console.WriteLine("Araba Markası: " + araba1.Marka);
Console.WriteLine("Araba Modeli: " + araba1.Model);
Console.WriteLine("Üretim Yılı: " + araba1.Yil);

Burada, “araba1” adında bir Araba nesnesi oluşturulmuştur. Daha sonra, bu nesnenin özelliklerine (Marka, Model, Yil) erişmek için bu nesneyi referans olarak kullanırız. Örneğin, “araba1.Marka” ifadesi, “araba1” referansının işaret ettiği Araba nesnesinin “Marka” özelliğine erişim sağlar.

Böylece, nesne elemanlarına erişim genellikle oluşturulan nesnenin referansı üzerinden yapılır ve her bir elemanın özelliği kullanılarak erişim gerçekleştirilir. Bu sayede, nesne içindeki verilerin saklanması ve yönetilmesi mümkün olur.

Nesne kopyalama davranışları

nesne kopyalama davranışları önemli bir konudur ve iki yaygın kopyalama türü vardır: shallow copy (sığ kopya) ve deep copy (derin kopya).

Shallow Copy (Sığ Kopya):

Shallow copy, referans türü değişkenlerin veya nesnelerin yalnızca referanslarını kopyalar. Yani, orijinal nesneyle yeni kopya arasında aynı referansa sahip olurlar. Bu nedenle, eğer bir değişiklik yapılırsa, hem orijinal nesne hem de kopyası etkilenir.

class Person {
    public string Name;
}

Person person1 = new Person();
person1.Name = "John";

Person person2 = person1; // Shallow copy

person2.Name = "Alice";

Console.WriteLine(person1.Name); // Çıktı: Alice
Console.WriteLine(person2.Name); // Çıktı: Alice

Yukarıdaki örnekte, person1 ve person2 değişkenleri aynı nesneyi işaret eder. Dolayısıyla, birinin adı değiştirildiğinde, diğeri de etkilenir.

Deep Copy (Derin Kopya):

Deep copy, nesnenin kendisini ve içindeki tüm alt nesneleri kopyalar. Yani, orijinal nesneyle yeni kopya arasında tamamen bağımsız bir ilişki vardır. Herhangi bir değişiklik, diğerini etkilemez.

class Person {
    public string Name;
}

Person person1 = new Person();
person1.Name = "John";

Person person2 = new Person();
person2.Name = person1.Name; // Deep copy

person2.Name = "Alice";

Console.WriteLine(person1.Name); // Çıktı: John
Console.WriteLine(person2.Name); // Çıktı: Alice

Yukarıdaki örnekte, person1 ve person2 değişkenleri farklı nesneleri işaret eder. Dolayısıyla, birinin adı değiştirilse bile, diğeri etkilenmez.

Shallow copy ve deep copy, nesne kopyalamanın farklı gereksinimlerini karşılamak için kullanılır. Shallow copy genellikle bellek kullanımını azaltırken, deep copy daha güvenli ve beklenen davranışı sağlar. Hangi kopyalama yönteminin kullanılacağı, belirli duruma ve gereksinimlere bağlıdır.

Encapsutation

kapsülleme (encapsulation), nesnelerimizin içindeki alanların kontrol altında tutulması ve dışarıdan erişimin sınırlanması anlamına gelir. Bu, nesnelerin kullanımını daha güvenli ve güvenilir hale getirir.

Nesnelerin içindeki alanlara, genellikle özel erişim belirteçleri (private) kullanılarak erişimi sınırlanır. Bu, alanların doğrudan değiştirilmesini veya okunmasını engeller ve nesnenin iç durumunu korur. Bunun yerine, bu alanlara erişmek için genellikle getter ve setter metodları kullanılır.

Örneğin, bir Araba sınıfı düşünelim:

public class Araba {
    private string model;

    // Model özelliği
    public string Model {
        get {
            return model;
        }
        set {
            model = value;
        }
    }
}

Yukarıdaki örnekte, Araba sınıfının model alanına doğrudan erişim yoktur. Bunun yerine, GetModel ve SetModel metotları kullanılarak alan okunabilir veya değiştirilebilir. Bu, Araba sınıfının iç durumunun kontrol altında tutulmasını sağlar.

Derinlemesine kapsülleme, nesneler arasındaki etkileşimi düzenler ve kodun daha modüler hale gelmesini sağlar. Aynı zamanda, kodun daha güvenli olmasını sağlayarak hataları ve beklenmeyen davranışları önler.

Yorum Yap

Bir yanıt yazın

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