Nesne Üretimi Nedir ? Sınıf ve Nesne Kavramları

Fatih İzgi
6 min readAug 6, 2021

--

Bir önceki yazımızda bahsettiğimiz gibi yazılım dünyasındaki nesneler, özelliklere ve davranışlara sahiptir. Nesne özellikleri değişkenler ile; davranışları ise metotlar ile tanımlanır. Bu tanımlamalar ise sınıf yani “Class” içerisinde gerçekleştirilir. Bu sebeple sınıfların, nesnelerin üretim merkezi olduğunu söylemek mümkündür. Bu üretim aşamasını anlamak için bir önceki yazıda verilen örnek üzerinden ilerleyelim. Daha önceki yazıyı okumayanlar için problem özeti :

Projede, bir sosyal medya uygulamasındaki kullanıcının profil sayfası üzerine kullanıcı bilgilerini yerleştirmek istiyoruz (Şimdilik bu işlemleri sadece ekrana bastırma olarak gerçekleştireceğiz ancak gerçekten bir web sitesi veya mobil uygulama geliştirirken de nesne kullanma mantığı örnekteki gibi olacaktır. Veri tabanından nesne verileri çekilir ve nesnelerin özellikleri ekrana yerleştirilir). Kullanıcının kullanıcı adı, yaşadığı ülke, yaş ve doğum tarihi özellikleri bulunsun. Ayrıca, kullanıcının profilin görüntülendiği gün eğer kullanıcının doğum günü ise doğum tarihinin yanında “Bugün Doğum Günü” bilgisi yazdırılsın. Ayrıca kullanıcı adının boş olup olunmadığı da kontrol edilsin ve buna göre ekrana bilgi bastırılsın. Tahmin edileceği üzere burada üreteceğimiz nesne “kullanıcı” nesnesidir. Dolayısıyla bir Kullanıcı sınıfına ihtiyacımız vardır. Daha sonra Main/Test sınıfımız içerisinde bu nesneyi üreterek bilgilerine erişmeye çalışacağız.

SINIF OLUŞTURMAK

Nesne üretebilmek için öncelikle bir üretim merkezine yani sınıf yapısına ihtiyacımız vardır. Sınıflar üretilecek olan nesnenin özelliklerini ve davranışlarını kapsar. Nesne tabanlı programlama mantığında her şey nesne olduğuna göre sınıfların ne kadar önemli yapılar olduğunu tahmin edebilirsiniz.

Sınıf oluşturma işleminde uyulması gereken zorunlu kurallar ve dikkat edilmesi gereken bazı noktalar bulunmaktadır. Bu kurallara dikkat etmek daha sağlıklı yazılımlar gerçekleştirmemizi sağlar. Bahsettiğimiz bu zorunluluklar ve noktalar :

1- Sınıfı hangi dosya içerisinde oluşturacağımız önemlidir. Proje içerisindeki “.java” uzantılı bir dosyada yalnızca bir tane “public” anahtarı ile tanımlanan sınıf bulunabilir ve tanımlanan bu sınıf ismi ile dosya ismi aynı olmalıdır. Örneğin, “Main.java” isimli bir dosyada “public” olarak tanımlanabilecek tek sınıf “Main” isimli sınıftır. Bunun dışında tanımlanan sınıflar “class ClassName{}” yapısıyla oluşturulur. Örneğin “Main.java” içerisindeki class User{} yapısı görülebilir. Eğer sınıf, başka bir “.java” uzantılı dosya içerisinde oluşturulacaksa “public” anahtarı ile oluşturulabilir. Bu durumda “public class ClassName{}” yapısı ile sınıf oluşturmak mümkündür. Örneğin “Main.java” isimli dosyada public class Main{} ve “User.java” isimli dosyada public class User{} yapılarını oluşturarak birbirleri ile arasında iletişim sağlanabilir. Böylece, aynı proje içerisinde bulunan farklı “.java” dosyalarındaki her iki sınıf da “public” tanımlanmış olur. (Not : Örneğimizi yalnızca “Main.java” adlı dosya içerisinde gerçekleştireceğimizden dolayı (Main dışındaki) sınıflarımızı oluştururken “public” anahtar kelimesini kullanmayacağız.)

Önemli bir husus olduğundan dolayı hatalı bir kod örneği inceleyelim :

Her iki sınıf da Main.java isimli dosya içerisinde yer alıyor ve her ikisinin de başında “public” anahtarı bulunuyor. Derleyici bu noktada programı çalıştırmayacaktır.

2- Sınıf isimleri boşluk karakteri içeremez. Örneğin “New Word” isiminde bir sınıf tanımlamak mümkün değildir. Yalnızca “class NewWord{}” şeklinde bir yapı kullanılabilir. Birden fazla kelime içeren sınıf isimlerinde kelimeler bitişik olarak yazılır.

3- Sınıf isimleri büyük harf ile başlamalıdır. Örneğin bir sınıf isminin “user” olması uygun değildir. “User” şeklinde isimlendirmek daha doğrudur. Ayrıca, sınıf ismi birden fazla kelime içerecekse kelimelerin ilk harflerinin büyük yazılması gerekmektedir. “Newword” şeklinde bir isimlendirmedense “NewWord” şeklinde bir isimlendirme daha uygun olacaktır. Bunun yerine alt çizgi (_) kullanımı da tercih edilebilir. Örneğin “New_Word” isminde bir sınıf oluşturmak da mümkündür.

4- Sınıf isimleri gerçekten “isim” olmalıdır. Örneğin bir fiil ile sınıf oluşturmak doğru değildir. Mesela sınıf isimleri “Walk”, “Run”, “Drink” gibi kelimeler olmamalıdır. Sınıflara isim verirken “User”, “Word”, “Student” gibi kelimeler kullanmak daha uygun olacaktır.

5- Sınıf isimlerinde kısaltmalardan kaçınmak gerekir. Örneğin “newWord” nesnelerini üreteceğimiz bir sınıfın ismini “NWord” olarak tanımlamak doğru değildir. Net ve anlaşılır isimler kullanılmalıdır. Sınıf isminin “NewWord” olması daha uygundur. Kısaltımı açılımından daha yaygın olan isimlerde bu kural göz ardı edilebilir. Örneğin “UniformResourceLocator” isimli bir sınıf oluşturmaktansa “URL” isimli bir sınıf oluşturmak tercih edilebilir.

6- Sınıf ismi ve üretilecek olan nesnelerin birbirlerini çağrıştırması gerekmektedir. Örneğin “user” nesnelerini üretmek için tasarlayacağımız sınıfın ismini “User” olarak belirleyebiliriz.

Yukarıdaki maddelerden ilk iki tanesi zorunlu olarak uymamız gereken kuralları kapsamaktadır. Kurallara uyulmadığı takdirde program hata verecektir. Diğer maddeler ise kodların anlaşılırlığını arttırmak amacıyla uymamız gereken kuralları içermektedir. Herhangi bir yazılımda bilgisayar, programcının isimlendirmelerini dikkate almaz. Yapması gereken işlemleri gerçekleştirir. Program sorunsuz bir şekilde çalışır ancak bu maddelere uyulması daha rahat bir yazılım süreci ilerletmek açısından önemlidir. Özellikle bir ekip ile birlikte yürütülen projelerde temiz, net ve anlaşılır kodlar yazmak neredeyse hayati önem taşımaktadır. Bu sebeple isimlendirme kurallarına uyulması gereklidir.

Sınıf oluştururken dikkat edilmesi gereken noktalara değindiğimize göre teknik işlemleri gerçekleştirmeye başlayabiliriz. Projeye ilk başladığımızda elimizdeki yapı aşağıdaki gibidir :

Elimizde “Main.java” isimli bir dosya var. Bu dosya içerisinde Main sınıfımız var ve bu sınıf, içerisinde işlemlerimizi gerçekleştirmemizi sağlayan main() metodunu barındırıyor. (Main sınıfı, dosyamız içerisindeki tek “public” sınıfımız.)

Şimdi nesneleri üreteceğimiz şablonumuzu, yani User sınıfımızı oluşturalım :

Sınıfımızı oluşturduğumuza göre sınıftan üretilecek olan nesnelerin sahip olduğu özellikleri tanımlayabiliriz :

Nesnenin sahip olacağı özellikleri belirledik. Şimdi de davranışlarını belirleyelim :

User sınıfımız tamamlandı. Artık “user” nesnelerini üretebileceğimiz bir üretim merkezine sahibiz. Üretim merkezinde tanımlandığına göre üretilecek olan “user” nesneleri;

- userName değişkeni ile Kullanıcı Adı,

- country değişkeni ile Ülke,

- age değişkeni ile Yaş,

- birthDate değişkeni ile Doğum Tarihi özelliklerine sahip. Ayrıca;

- showBirthDateInfo() metodu ile kendi doğum günü bilgisini (güncel tarihe göre inceleyerek) ekrana bastırma,

- isUserNameEmpty() metodu ile kendi kullanıcı adının boş olup olmadığını kontrol ederek “true” veya “false” değerler döndürme davranışlarına sahip oldu.

Peki bir nesne nasıl üretilir ?

SinifAdi nesneAdi = new SinifAdi();

Bizim örneğimize göre;

User user = new User();

Bu yapıyı biraz parçalayalım ve inceleyelim. Elimizde “User”, “user”, “new” ve “User()” parçacıkları oluştu. Bu parçalar nelerdir ?

1- User : Üretilecek olan nesnenin hangi sınıftan üretileceği bilgisini verir.

2- user : Üretilecek olan nesneye verilen isimdir. Aslında, User sınıfından üretilmiş olan nesnenin bellekteki adresini işaret etmektedir. Referans(Object Referrer) olarak bilinir. (C ve C++’dan aşina olunan “Pointer” kavramının karşılığıdır.) Nesne ile ilgili işlemleri nesne ismini kullanarak gerçekleştiririz.

3- new : Nesne yaratıcı anahtar kelimedir. “new” anahtarının kullanımı ile birlikte oluşturulan nesne için bellekte bir yer ayrılmış olur. Nesne artık var olmuştur ve bilgisayar içerisinde hayata geçmiştir.

4- User() : Nesne oluşurken hangi işlemlerin gerçekleştirileceği bilgilerini taşıyan metottur. Genellikle nesneye ait özelliklere değer vermek için kullanılır ancak içerisinde başka işlemleri gerçekleştirmek de mümkündür. Nesne oluşturulduğunda ilk olarak bu metot çağırılır, yani bilgisayar ilk olarak bu metottaki işlemleri gerçekleştirir. Constructor olarak adlandırılır. (Bir sonraki yazıda Constructor Method çok daha ayrıntılı olarak işlenecektir. Önemli bir kavramdır.)

Peki nesneyi sadece tanımlarsak ve oluşturmazsak ne olur ?

User user;

Bu durumda nesne tanımlanmıştır ancak oluşturulmamıştır. Yani bu nesne bellekte herhangi bir yeri işaret etmez, yalnızca boşluğu gösterir. Dolayısıyla bu nesne özelliklerine erişim mümkün değildir. Erişilmeye çalışıldığı takdirde “java.lang.RuntimeException” hatası alınacaktır. Eğer nesnelerin metotları kullanılmaya çalışırsa “ java.lang.NullPointerException” hatası alınır.

Peki nesneyi sadece oluşturursak ve tanımlamazsak ne olur ?

new User();

Esasında bu da bir objedir. Constructor çağırılır ancak herhangi bir atama yapılmadığından dolayı Java tarafından çöp(Garbage) olarak kabul edilir. Dolayısıyla Java Garbage Collecter tarafından toplanır. Garbage Collecter bir bellek yönetim mekanizmasıdır ve kullanılmayan, referans edilmeyen objelerin silinmesi işlemini gerçekleştirilir. (Not : “System.gc.()” ile Garbage Collecter çağırılabilir ancak çok istisnai durumlar dışında zaten “new User();” gibi bir kullanım gerçekleştirilmez. Muhtemelen hiç ihtiyacınız olmayacaktır.)

Hem nesneleri üreteceğimiz sınıf yapımız hazır olduğuna göre hem de nasıl nesne üretileceğini öğrendiğimize göre bu sınıftan birkaç adet nesne üretebiliriz. Bu işlemleri main() içerisinde gerçekleştireceğiz.

Peki üretilen bu nesnelerin özelliklerine/davranışlarına nasıl erişeceğiz ?

Nesnelerin isminin yanına bir nokta(.) konulur ve hangi özelliğe veya davranışa erişilmek istendiği belirtilir. Bu sayede hem özelliklere hem de davranışlara erişmemiz mümkündür. Kuralımız :

nesne.NesneOzelligi;

nesne.NesneMetodu;

Bizim örneğimize göre;

user.userName = “Kullanıcı245”;

user.showBirthDateInfo();

Nesne özelliklerine erişilerek hem değer ataması yapılabilir ve bu özellikler üzerinde işlemler gerçekleştirilebilir hem de sınıf metotları kullanılabilir. Nesne üretimi ve özelliklere erişimi tamamladığımıza göre ürettiğimiz nesnelere değer ataması gerçekleştirebiliriz :

Output :

Doğum Tarihi : 02.06.1998 (Bugün Doğum Günü)
Değer atanmayan user1.country = null

Not : Görüldüğü gibi eğer nesnenin herhangi bir özelliğine değer ataması yapmazsak Java default olarak o özelliğe null değer verecektir. “int” olarak tanımlanan age değişkeni ise default olarak 0 değerini alacaktır.

PROJE

Sınıf oluşturma, nesne üretme, nesne özelliklerine ve metotlarına erişim konuları tamamlandığına göre projeyi tamamen inceleyebiliriz :

Output :

Kullanıcı245
Türkiye
23
02.06.1998
Doğum Tarihi : 02.06.1998 (Bugün Doğum Günü)
Kullanıcı adı boş değil!
— — —
Değer atanmayan user2 özellikleri :
null
null
0
null

--

--