İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Zafer Teker
tekzaf@yahoo.com

Adım Adım Class Yapmak

Programcı olmak isteyenlerin belki de en zorlandıkları şey nesneye yönelik programlama kavramlarını anlamak. Class nedir, nesne nedir ?. Kurucu (Constructor) nedir ? Ve bunlar gibi bir çok soru.

Bir program geliştirelim. Bu program kodunu en ilkel kodlama yönteminden en "modern" kodlama yöntemine kadar aşama aşama değiştirelim. Bir int dizisinin elemanlarını ekrana basan bir program yapalım. Eski programlar ilk satırdan başlar son satırda sona ererdi. Aşağıdaki gibi bir şey

int[] array=new int[]{2,3,4,5}//bu dizi kullanıcıdan alınabilir
for(int i=0;i<array.length;i++){
	System.out.println(array[i]);
}

Bir dizi yarattık (veya kullanıcıdan aldık) Bir döngü açıp ekrana bastırdık. İkinci bir dizi daha ekrana bastırmamız gerektiğini düşünelim. Aşağıdaki gibi yapılabilir.

int[] array=new int[]{2,3,4,5}//bu dizi kullanıcıdan alınabilir
int[] array2=new int[]{7,8,9,10}//bu dizi kullanıcıdan alınabilir
for(int i=0;i<array.length;i++){
	System.out.println(array[i]);
}
for(int i=0;i<array2.length;i++){
	System.out.println(array2[i]);
}

Yukarıda görüldüğü gibi iki for döngüsü yaptık. Halbuki bir int dizisinin ekrana basılması olayı tek seferde yapılabilirdi. Burada devreye fonksiyon kavramı girer. Bir fonksiyonla bu işi yapsak daha iyi olurdu.

public void print(int[] array){
	for(int i=0;i<array.length;i++){
		System.out.println(array[i]);
	}
}

//Program burdan başlıyor

int[] array=new int[]{2,3,4,5}//bu dizi kullanıcıdan alınabilir
int[] array2=new int[]{7,8,9,10}//bu dizi kullanıcıdan alınabilir
print(array);
print(array2);

Program kodunun daha basitleşmiş olduğunu görüyorsunuz. Üçüncü bir diziyi bastırmak artık çok kolay. Sadece print fonksiyonunu çağıracağız o kadar.

Diyelim int[] dizisini toplamını gerekiyor. Bunun için aşağıdaki gibi bir fonksiyon yazabiliriz. Ve programımız hem elemanları ekrana basar hem de toplamını ekrana basar.

public int getSum(int[] array){
	int sum=0;
	for(int i=0;i<array.length;i++){
		sum+=array[i];
	}
	return sum;
}

public void print(int[] array){
	for(int i=0;i<array.length;i++){
		System.out.println(array[i]);
	}
}

//Program burdan başlıyor

int[] array=new int[]{2,3,4,5}//bu dizi kullanıcıdan alınabilir
print(array);
int sum=getSum(array);
System.out.println(sum);

program hem print hem de getSum method'unu çağırıyor. Çağırırken de diziyi parametre olarak veriyor. int[] dizisi üzerinde başka işlemler yapmanız gerekebilir. Örneğin dizinin en büyük elemanını bulabilirsiniz. Veya diziyi küçükten büyüğe sıralıyabilirsiniz. Bu method'ların sayısı artıkça bir şey farketmiş olmanız gerekir. Bu fonksiyonların hepsi bir int[] dizisi üzerinde işlem yapıyorlar. Ve her fonksiyonu çağırdığımızda bu diziyi vermek zorunda kalıyoruz. Bunun yerine diziyi bir kere versek ve daha sonra fonksiyonları kullandığımızda vermemiz gerekmese. Artık class kavramına girebiliriz.

Class veriler ve bu veriler üzerinde yapılacak işlemleri tutan birimdir. Örneğin String class'ı bir "ali" şeklinde bir String ifadesi tutar. Ve bu "ali" üzerinde çeşitli işleri yapmanızı sağlar. Örneğin "ali"'nin kaç karakter olduğunu öğrenebilirsin. İçinde herhangi bir harfin geçip geçmediğini öğrenebilirsin. i index'inden j index'ine kadar olan parçasını alabilirsin. Sonuç olarak String class'ının görevi bir string ifadesi üzerinde işlem yapmaktır. Yukarıdaki örneklere dikkat ettiyseniz hep int[] dizisi üzerinde işlem yapmaktadır. O halde bizim class'ın amacı int[] dizisi üzerinde işlemler yapmaktır. Class int[] dizisini başlangıçta ister. Böylece hep aynı dizi üzerinde işlem yapar.

public class IntArray{
	int[] array;
	public IntArray(int[] a){ //Kurucu (Constructor)
		array=a;
	}
	public void print(){
		for(int i=0;i<array.length;i++){
			System.out.println(array[i]);
		}
	}
	public int getSum(){
		int sum=0;
		for(int i=0;i<array.length;i++){
			sum+=array[i];
		}
		return sum;
	}
	//başka fonksiyonlar eklenebilir.
}

// program burdan başlar.

int[] array=new int[]{2,3,4,5}//bu dizi kullanıcıdan alınabilir
IntArray intA=new IntArray(array); //Class'ımızdan bir nesne yaratıyoruz. Bu nesne ile artık tüm fonksiyonları çağırabiliriz.
intA.print(); //intA nesnesi bir IntArray olduğu için print ve getSum method'unu kullanabiliyoruz. 
int sum= intA.getSum();
System.out.println(sum);

Dikkat edilirse print ve getSum method'larına dizi vermedik. Çünkü zaten başlangıçta vermiştik:

IntArray intA=new IntArray(array);

IntArray class'ının içinde 

public IntArray(int[] a){
	array=a;
}

class'ın kurucusudur. Dikkat edilirse class ile aynı isimdedir. Parametre olarak a dizisini alır ve array değişkenine atar. array değişkeni ise class'ın bir değişkenidir. Ve hemen class'ın içinde tanımlanmıştır. array class'ın bir değişkeni olduğu için class içindeki her yerden erişilebilir. Örneğin

public void print(){
	for(int i=0;i<array.length;i++){
		System.out.println(array[i]);
	}
}

method'u içindeki array nesnesi bu başta verilen dizidir. Başka bir dizi içinde aynı işlemleri yapalım.

int[] array=new int[]{2,3,4,5}
int[] array2=new int[]{1,8,7,9,6,5,6,3};

IntArray intA=new IntArray(array);
intA.print();
int sum= intA.getSum();
System.out.println(sum);

IntArray intA2=new IntArray(array2);
intA2.print();
int sum2= intA2.getSum();
System.out.println(sum2);

Yukarıda görüldüğü gibi iki dizinin elemanlarını ve elemanlarının toplamlarını ekrana bastık. Aynı işi class ve fonksiyon kullanmadan yapsaydık bir hayli karışık ve uzun olurdu.

Şimdi bir class yapalım. Bu class bir öğrencinin sınav sonuçlarını tutan bir dizi olsun. Bu class IntArray'ı extend edebilir veya kendisi bir IntArray değişkeni tutabilir.

class Students{
	IntArray intA;
	int no;
	int sozluPuan;
	public Students(int n,IntArray a,int sozlu){
		no=n;
		intA=a;	
		sozluPuan=sozlu;
	}
	public int getYilSonuPuan(){
		int ortalama=intA.getOrtalama(); //IntArray class'ının getOrtalama diye bir methodu kullanıyoruz.
		int puan=(ortalama+sozluPuan)/2;
		return puan;
	}	
}

Student class'ı öğrencinin numarası, yazılılardan aldığı notların dizisi (IntArrray) ve sozlu puanı. Öğrencinin yıl sonu puanı şu şekilde hesaplansın. Yazılıların ortalaması ile sozlu notunun toplamlarının yarısı. Bu işi getYilSonuPuan method'u yapıyor. Bu method önce intA'dan dizinin ortalamasını istiyor. Daha sonra sozlu puanı ile toplayıp ikiye bölüyor. Böylece yıl sonu puanı hesaplanıyor. Şimdi aşağıda iki öğrencinin yıl sonu puanı ekrana basan bir program yapalım.

int[] ilkNot=new int[]{"75","34","24"};
IntArray intA1=new IntArray(ilkNot);
Student s1=new Student("987",intA1,50);

int[] ikinciNot=new int[]{"70","55","64"};
IntArray intA2=new IntArray(ikinciNot);
Student s2=new Student("1089",intA2,60);

int puan1=s1.getYilSonuPuan();
int puan2=s2.getYilSonuPuan();

System.out.println(puan1);
System.out.println(puan2);

İki öğrenci yarattık. Bu iki öğrenciye yazılı notlarını ve sözlü notlarını verdik. Ve en son yıl sonu puanlarını hesaplayıp ekrana bastık.

Yukarıdaki programın hiç bir yerinde for,if vs.. göremessiniz. Hesap işlemleri class'lar içinde gizlenmiştir. Ben Student'den yıl sonu puanını istiyorum. Bu hesabın nasıl yapıldığı ile ilgilenmiyorum.

Sonuç olarak nesneye yönelik programlama ile programların okunaklığı artar. Bir çok işlem class'lara bırakılır. Programın yaptığı sadece bu class'ları kullanmaktır.

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır