22 Ocak 2015 Perşembe

Hadi Java Öğrenelim - Sınıflar #1

Sınıflar, nesne yönelimli programlama dillerinin işlevsel alt parçalarıdır. Basit programların yazımında çok ihtiyaç olmasa da yıllar ve bilgisayar teknolojileri ilerledikçe daha karmaşık ve büyük programların, oyunların ve işletim sistemlerinin yazımları zorlaştığı için ihtiyaçtan ortaya çıkmıştır. Sınıfların aslında temelde yaptığı şey kodunuzu organize etmek ve sizi ciddi anlamda zaman kaybından kurtarmaktır.

Örneklerle anlatmak her zaman daha keyifli ve kolaydır. Mesela bir oyun geliştirdiğinizi düşünün, bir çok oyun karakteri yaratmalısınız. İsimleri, kıyafetleri, güçleri, canları, kabiliyetleri, silahları... farklı farklı bir çok karakter. Bazen aynı karakterden de onlarca oluşturmanız gerekir. O zaman her karakter için defalarca belki de aynı tanımlamaları kullanarak satırlarca kod yazmak zorunda kalacaksınız. Bunun yerine bütün karakterleri türetebileceğiniz bir karakter sınıfı olduğunu düşünün. Hazır çikolata kalıpları gibi. Tek yapmanız gereken sıcak çikolatayı hazır kalıba dökmek. Belki ilk başta sadece o hazır kalıbı oluştururken biraz zaman harcayacak ama sonra her bir çikolata için aynı kalıbı  tekrar tekrar kullanacak ve büyük bir zaman kaybından kurtulacaksınız. Bu güzel bir örnek oldu aslında, sınıf yazmak bir nevi kalıp hazırlamaya benziyor. Bir kere yazın, istediğiniz kadar kullanın ve paylaşın.


Dahası sınıflar bundan çok daha fazlasını yapmanıza imkan verir. Mesela kullandığınız işletim sistemlerindeki butonlar, klasörler, pencereler vb. ilgili sınıflardan türetilmiş nesnelerdir. Her lazım olduğunda bir buton hazırlamazsınız, bir kere buton sınıfı yazar gerektiğinde de bu sınıfa ait bir buton nesnesi oluşturur ve kullanırsınız. Bununla kalmayıp, butonun ismini, aktifliğini, boyutlarını, işlevini de yine önceden tanımlanmış özellikler sayesinde değiştirebilir aynı kalıptan farklı çikolatalar çıkarabilirsiniz. 

Neyse işin edebiyat kısmı böyle işte. Kafanız karışıksa da biraz alıştırma yaparak daha iyi anlayacağınızı düşünüyorum ki zaten atla deve değil. Oldukça kolay, basit ve işlevsel bu şeyleri seveceksiniz.

Başlayalım
Birinci yazıda proje oluşturup, projemize sınıf  ve o sınıfa da main fonksiyonunu eklemeyi görmüştük. Nasıl olduğunu hatırlamak için o yazıyı tekrar okuyabilirsiniz. Şimdi oradan devam edelim ve projeye "karakter" adında yeni bir sınıf ekleyelim. 


Gerekli olan kodu eclipse'in kendisin oluşturduğunu gördük. Demek ki java'da sınıflar bu şekilde tanımlanıyor. Oldukça basit değil mi?

public class <sınıf_ismi> 
{

}

Buradaki "publicifadesi bir "modifier", modifierların ne olduğunu, ne işe yaradığını sonra öğreniriz, şimdilik geçiyorum.  Şimdi, oluşturacağımız karakterlere ait bazı özellikleri bu sınıf içinde tanımlayalım. Bunlar isim, yas, guc ve saglik olsun. Bu değişkenleri her bir karakteri oluştururken ben belirlemek istiyorum, ama takdir edersiniz ki sağlıkları varsayılan olarak 100 olsun. O halde kullanacağım yapı bir "constructor". Çok kısa olarak şöyle söyleyeyim, "constuctor" lar nesne oluşturulurken çağrılan ve adı sınıf adı ile aynı olan fonksiyonlardır. Yani bu sınıf içerisine bir fonksiyon yazacağız adı da "karakter" olacak, ama şu var ki bir sınıfta birden fazla constructor olabilir. Nasıl olur ? Eğer aldıkları parametreler farklı ise olabilir. Bunun farkını ilerki derslerde örneklerle daha iyi anlayacağız.


Bu kodda bir kaç önemli şey var, onları açıklayayım. Öncelikle dediğim gibi bir "constructor" yazdık. Yani sınıf adı olan "karakter" adında bir fonksiyon yazdık. Bu fonksiyonun parametreleri var; "isim","yas","guc". Fonksiyon içinde ise aldığımız bu parametre değerlerini sırasıyla "this.isim","this.yas" ve "this.guc" değişkenlerine atadık. Bunu neden yaptık ? "this" ne demek ? Aslında yapmaya çalıştığımız şey fonksiyon parametrelerinden aldığımız değerleri yukarıda belirlediğimiz değişkenlere atamaktı. Ama dikkat ederseniz parametre değişken isimleri ile üsteki değişken isimleri aynı. O halde "isim = isim" gibi bir atama yapamazsınız. Burada devreye "this" ifadesi giriyor. "This" kelimesi içinde olduğunuz sınıfı temsil eder. "This" kelimesinden sonra nokta koyarak o sınıfa ait değişkenlere sınıfın içerisinde herhangi bir yerde ulaşabiliriz. Böylelikle sınıfın kendi değişkenlerinin değerini "constructor" içerisinde değiştirmiş olduk. Parametre değişkenlerine farklı isimler vererek "this" kelimesini kullanmayabilirdik, ancak baştan bu ifadeyi öğrenelim diye bu örneği bilerek seçtim.

Son olarak bu dersi çok uzatmadan, oluşturduğumuz karakterlerin özelliklerini ekrana yazdıracağımız bir metot yazalım. İlgili metodu da(fonksiyon) yazdıktan sonra sınıfımız görüntüsü aşağıdaki gibi olacaktır. [Bu arada belirteyim Java'da fonksiyon yerine metot kelimesi tercih edilir, kafanız karışmasın metot dediğim şeyler aslında bildiğiniz fonksiyon rutinleri]


Ozellikler() fonksiyonu "void" değerli bir fonksiyon. Yani geri döndüreceği herhangi bir değer olmayacak, yapacağı tek şey formatlı bir şekilde isim, yas, guc ve saglik değişkenlerini ekrana yazmak. Ekrana yazma işlemini de yine geçen yazımda göstermiştim. Burada belki de tek bahsetmem gereken şey, formatlı yazı yazarken Java'da stringleri "+" ile kolayca birleştirebiliyor oluşunuz. Oldukça kolay ve güzel bir kullanım.

Tamam sınıfımızı hazırladık. Şimdi bu sınıftan bir nesne oluşturmak kaldı. Diğer bir deyişle kalıbımız hazır, çikolata üretmeye başlayabiliriz. O halde ilk derste oluşturduğumuz main() fonksiyonumuzun olduğu sınıfa gidelim ve aşağıdaki kodu yazalım.


Şimdi kodu analiz edelim.
Java'da var olan bir sınıftan nesne türetmek için;

<sınıf_adı> <nesne_adı> = new <sınıf_adı>(parametre_degerleri);

kalıbı kullanılır. Burada "jack" adıyla bir karakter oluşturmuş olduk. "=" den önceki ifadeye bakarsanız aslında bir değişken tanımlamak gibi, yani "int x, double z, String s" gibi. Yalnız bu kez değişken türümüz bir sınıf ve adıda "karakter". Öyleyse "karakter jack", karakter tipinde bir değişken tanımlar, işte buna da o sınıfın bir nesnesi denir.

"new" kelimesi, C dilinden hatırlayacağınız üzere "malloc" (memory allocation) komutuna karşılık gelir, yani oluşturulacak nesne için bellekte bir yer ayırır. "new" kelimesinden sonra gelen şey ise sınıf içinde, sınıf adıyla tanımlamış olduğumuz "constructor" metodudur. Aldığı parametreler, nesne yaratılırken doğrudan verilir. Böylece "jack" nesnesi oluştururken aynı zamanda, ismini, yaşını, gücünü parametre olarak vermiş ve nesnemizi "initialize" yani başlangıç değerlerini vererek kurmuş olduk. Aynı sınıftan başka bir karakteri de yine aynı şekilde, farklı parametrelerle (isim, yas, güc ve değişken ismi) oluşturabiliriz.

Son satırda bu nesnenin Ozellikler() metodunu çağırdık. Bunu yaparken aşağıdaki formatı kullandık;

<nesne_ismi> . <metod_ismi>(varsa paramatreleri);

Yani önce nesne ismini yazıyor, sonra "." koyuyor daha sonrada ilgili metodu(fonksiyon) yazıyoruz. Bu metotla karaktere atadığımız değerleri ekrana yazdırmış olduk. Bu kadar basit. 

Programı çalıştırırsak aşağıdaki sonucu göreceğiz. 



Kodları bilerek yazmadım ve doğrudan resim olarak koydum. Bunun nedeni ise tembelliği önlemek. Yazmadan, kopyalamak aklınızda pek bir şey bırakmaz bu yüzden öğrenmek için bakarak da olsa kendiniz yazın.

Kodlar içinde "public" gibi bazı tanımlamaları anlatmayı atladım. Bunları ilerde daha detaylı anlatacağım. Şimdilik bir çok temel konuyu anlattığımı düşünüyorum. Sonraki yazılarımda da sınıflarla ilgili işlemlere devam edeceğiz.

Esen kalın!!

eminucer@gmail.com




Hiç yorum yok:

Yorum Gönder