Monday, July 26, 2010

Class Compositions and Associations(Siniflarin Olusumu ve Birlikteliyi)

Composition Association(Oluşum) : Sahiplik ("ownership") modellemesi için kullanılan özel bir birliktelik türüdür. Bütün-Parça ilişkisini temsil etmesi ve parçanın kendi bağımsız varlığına sahip olmayışıdır. Bütünün varlığını temsil eden nesne ayrıca parçanın da yaşamından sorumludur.A composition association can be described as object A is “composed-of” object B..Temel olarak Association ve Aggregation ilişki türleri birer Conposition çeşidi olarak düşünülebilir.
Yani Composition elde etmek için verilerimiz veya nesnelerimiz arasında kurabileceğimiz ilişki türleri Association veya Aggregation olabilir. Bu iki ilişki türünün arasındaki en temel fark ise birisinin verileri kendi içinde barındırması diğerinin ise atıfta bulunmasıdır.




 

Direct Association(Birliktelik) : İki sınıf arasındaki yapısal ilişkiye verilen isim. Herhangi bir dereceye sahip olacak şekilde aralarında ilişki bulunan sınıflar bu birlikteliğe sahip olurlar. UML gösteriminde düz bir çizgi ile temsil edilmektedir. Bu ilişki bize o iki sınıf arasında mesaj alışverişini sağlayan bir kanalın olduğunu anlatır. Burada Java'da mesaj alışverişinin metot çağrımlarıyla gerçekleştiğini hatırlatmak gerekir. Birliktelikler genellikle referanslar ile gerçekleştirilir.Direct association describes a “has-a” relationship.



Aggregation Association(Münasebet ):  "Sahip olma" ("possession") ilişkisini temsil eden özel bir birlikteliktir. An aggregation association represents a “part-of” the whole relationship. Her iki nesne de kendi bağımsız varoluşlarına sahiptir. Örneğin Aggregation ilişkisinde bir nesneden diğer nesneye atıfta bulunulur. Bu durum bir ders ile öğrenci arasındaki ilişkiye benzer. Dersin bitmesi ve ders nesnesinin (object) yok olması durumunda bu dersi alan öğrencilerin varlığı devam eder.






Temporary Association(Gecici) :Bu Temporary  bir methotun geri donus deyeri , yerel degisken yada methot parametrei olabilir.Temporary en zayıf şeklidir. Bu ilişki için kalıcı değildir









Multiplicities
İki sınıf arasındaki nasil bir ilişki oldugunu gosterir. 3 bolumden olsur.
  • One-to-one multiplicity
  • One-to-many multiplicity
  • Many-to-many multiplicity.



Class Association Relationships
  • One-to-one class association
  • One-to-many class association
  • Many-to-many class association
Example One-to-one class association
 public class Truck {
/* This is an example of a one-to-one direct association */
        Trailer trailer;
       public void setTrailer(Trailer t){
              trailer = t;
       }
/** Remainder of Truck class would be here */
}


Example One-to-many class association
public class Car {
       Wheel[] wheel = new Wheel[4];
        
        public void setWheels(Wheel w) {
            wheel[0] = w;
            wheel[1] = w;
            wheel[2] = w;
           wheel[3] = w;
      }
// Remainder of Car class would be here
}

Example Many-to-many class association


// TrafficLight class
public class TrafficLight {
     int lightID;
     TrafficLight(int ID) {
           lightID = ID;
     }

}

// Car class
public class Car {
      TrafficLight[] allTrafficLights;
     Car(TrafficLight[] trafficLights) {
          allTrafficLights=trafficLights;
     }
}


public class TrafficSimulator {
        Car[] cars = new Car[3];
        TrafficLight[] trafficLights = new TrafficLight[8];
        public static void main(String[] args) {
                new TrafficSimulator();
       }
      TrafficSimulator() {
            for (int i = 0; i < trafficLights.length; i++) {
                    trafficLights[i] = new TrafficLight(i);
             }
             cars[0] = new Car(trafficLights);
             cars[1] = new Car(trafficLights);
             cars[2] = new Car(trafficLights);
       }
}


Class Composition Relationships
  • One-to-One Class Composition
  • One-to-Many Class Composition
 Example One-to-One Class Composition
public class Tire {
       TireAirPressure tireAirPressure;
       Tire(){
             tireAirPressure = new TireAirPressure();
       }
}


 Example One-to-Many Class Composition
public class SensorStatus {
      int status;
      public SensorStatus(int newStatus) {
            status = newStatus;
       }
}





public class CarComputer {
         SensorStatus[] sensorStatus = new SensorStatus[5];
         public CarComputer() {
                  sensorStatus[0] = new SensorStatus(1);
                  sensorStatus[1] = new SensorStatus(1);
                  sensorStatus[2] = new SensorStatus(1);
                  sensorStatus[3] = new SensorStatus(1);
                  sensorStatus[4] = new SensorStatus(1);
         }
}



Bu Yaziyi olusturuken kullandigim kaynaklar
http://www.bilgisayarkavramlari.com/2008/12/20/birliktelik-munasebet-ve-olusum-association-aggregation-and-composition/comment-page-1/#comment-43264


Friday, July 23, 2010

Array

 * Array(Dizi) belli bir sayida ve ayni veri turundeki degiskenlere  ayni isim altinda erismeyi saglayan 'Referans' lardir.
 * Diziler 'Referans'  tipli degiskenlerdir. Dolayisiyle bir dizi belegin 'stack(Yigin)' kisminda tutulurken dizi elemankarinin tamami 'heap(Obek)' kisminda tutulur. Yani dizinin adi 'heap' teki elemanlarin baslangic adreslerini isaret eder.
 * Diziler ayni turden elemanlara sahip olmak zorundadir.
 * Diziler olusturulunca eleman sayilari ayni anda verilir. Boylece bir dizi en bastan boyutlandirirlir dizinin boyutu ile dinami olarak oynamamizi engellenir.Bu kisitlama Java dilinde Collection(List , Map, HAshMap, .....) sinifinin olusmasi ve gelismesini saglamistir.
  *  Referans tipli dizilerin nasil olusturuldugunu inceliyelim. Bir dizinin Referans tipli olmasini saglamk icin 'new' anahtar socuyunden istifade edilir.
 *  Tanimimizin en basindada dedigimiz gibi diziler Referans tipli degikenlerdir. Dolayisiyla bir sinif ornegi olusturmak zorunda.
int dizi[]= new int[3];
int[] dizi= new int[3];
Yukaridaki olusturdugumuz dizini 3 elemani var. Dizinin baslangic elemeni SIFIR '0' dir.Dizinin 3 elemanni var ve ilk ilemani 0 ise son elemani 2 dir
0,1,2,.....,n-1
int dizi[]= new int[3];
dizi[0] = 10;
dizi[1] = 20;
dizi[2] = 30;
for(int i=0;i
      System.out.println(dizi[i]);
}

//CONSOLE
10
20
30

 *   Diziyi new anahtar sozcuyu ile kullanabilecegimiz gibi baska yol daha var
int dizi[] ={1,5,7,-1,11,2};
for(int i=0;i<6;i++){
      System.out.println(dizi[i]);
}
//CONSOLE
1
5
7
-1
11
2


Simdi dizinin belekte nasil yer tutuguna bakalim


 * Yukaridaki sekilde 5 elemanli bir dizimiz var. eyer biz bu dizide herhandi bir index doldurmasak default olarak null veya SIFIR '0' olusturur. Yani Olusturdugunuz degiskenin default degerinin olusturur.
int dizi[] = new int[5];
dizi[0] = 47;
dizi[1] = 21;
dizi[2] = 27;

for(int i=0;i<5;i++){
      System.out.println(dizi[i]);
}
//CONSOLE
47
21
27
0
0


 * Simdi gelelim baska bir ayrintiya Bir dizimiz olsun 5 elemanli biz bu dizimize 6 elemani eklemeye calisirsak hata verir.

int dizi[] = new int[5];
dizi[0] = 47;
dizi[1] = 21;
dizi[2] = 27;
dizi[3] = 65;
dizi[4] = 72;
dizi[5] = 34;

for(int i=0;i<6;i++){
      System.out.println(dizi[i]);
}

//CONSOLE
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5

 * Ayni veri tipine ait bir cok elemani tutmasi diye bir tanim vardi gelin bir bunu ionceliyelim
        int dizi[] = new int[5]; 
        dizi[0] = 47;                   //Dogru kullanim
        dizi[1] = "Abdulakdir";   //Yanlis kullanim
        dizi[2] = 'A';                  //Dogru kullanim ama istenmiyen sonuc cunku ASCI karekterindeki //degeri alacak ve dizi 65 olmus olacak. 
        dizi[3] = true;                //Yanlis kullanim
        dizi[4] = 7.2;                //Yanlis kullanim
  

 * Yazimizin basinda demistik diziler ayni veri tipindeki elamanlarin toplulugudur. Biz diziyi int yaptiysak ancak sayilari verebiliyoruz yada diziyi string yaptiysak ancak karekter bilgilerini yazabiliyoruz.Peki butun degerleri yazablecegimiz bir diziyi nasil olusturacaz. Iste bu kisimda Javada SIKCA duyacaginiz Object  devreye giriryor yani dizimizi Objec tipinde olustururnca tum degerleri girebiliyoz bunu sebebi Object tum siniflarin atasi olmasi yani tum siniflar Object sinifindan turemistir.
Object dizi[] = new Object[5];
        dizi[0] = 47;
        dizi[1] = "Abdulakdir";
        dizi[2] = 'A';
        dizi[3] = true;
        dizi[4] = 7.2;
        for (int i = 0; i < dizi.length; i++) {
            System.out.println(dizi[i]);
        }

//CONSOLE
47
Abdulakdir
A
true
7.2


  *  Diziler aslinda java.util,Arrays sinifinin orneklenmis nesnelerdir.
  Simdi gelelim Arrays sinifini ile gelen ve isimize cok yariyacak olan methodlara
- sort : Bu method dizideki elemanlari duzgun siralam icin kullanilir.Dizinin tipine bagli olarak gerceklestirirlen bir siralama.
         System.out.println("----------------- NORMAL ---------------------------");
        int dizi[] ={33,2,31,1,13,47,200,21};
        for (int i = 0; i < dizi.length; i++) {
            System.out.println(dizi[i]);
        }
        System.out.println("----------------- SIRALI ---------------------------");
        Arrays.sort(dizi);
        for (int i = 0; i < dizi.length; i++) {
            System.out.println(dizi[i]);
        }

//CONSOLE
----------------- NORMAL ---------------------------
33
2
31
1
13
47
200
21
----------------- SIRALI ---------------------------
1
2
13
21
31
33
47
200


Bu methot asiri yuklenmis bir methot. Bu asirir yuklu methotlardanda biri
Arrays.sort(dizi,2,5)
Dizinin aralik olarak 2 index dahildir ama 5 index dahil degildir.

- binarySearch  : Bu method dizi icindeki bir elemanin var olup olmadigini ogrenmek icin kullanilir.. binarySearch methotunu kullanmak icin oncelikle diziyi siralanmis bir hale getirmek lazim yani sort methodu evelden kullanilmali.
Dizinin izinde istenilen deger yoksa negetif bir deger donderir varsa ise bulundugu index numarasini dondurur.
         int dizi[] ={33,2,31,-1,13,47,200,21};
        Arrays.sort(dizi);
        for (int i = 0; i < dizi.length; i++) {
            System.out.println(i+" . index "+ dizi[i]);
        }
        System.out.println("Sonuc "+Arrays.binarySearch(dizi,33) +" . index..");
        System.out.println("Sonuc "+Arrays.binarySearch(dizi,-1) +" . index..");
        System.out.println("Sonuc "+Arrays.binarySearch(dizi,-33) +" . index..");
        System.out.println("Sonuc "+Arrays.binarySearch(dizi,45) +" . index.."); 


//CONSOLE
0 . index -1
1 . index 2
2 . index 13
3 . index 21
4 . index 31
5 . index 33
6 . index 47
7 . index 200
Sonuc 5 . index..
Sonuc 0 . index..
Sonuc -1 . index..
Sonuc -7 . index..



- copyOf  : Bir dizinin kopyasini olusturur iki parametreye sahiptir birinci parametre kopyasi alinaca dizi ikincisi ise kopyasi alinacak dizinin kactanesini kopyalasin.
        int dizi[] ={33,2,31,-1,13,47,200,21};
        int diziCopy[] = Arrays.copyOf(dizi, dizi.length);
        for (int i = 0; i < diziCopy.length; i++) {
            System.out.println( diziCopy[i]);
        }



//CONSOLE
33
2
31
-1
13
47
200
21


 - copyOfRange  : Bu method bir dizinin kopyasini almak icin kullanilir.bu methotun 3 parametresi var birincisi kopyasi alinacak dizi ikincisi dizinin hangi satirindan itibaren kopyasi alinsin. Ucuncusu ise hangi satira kadar kopya alinsin.
        int dizi[] ={33,2,31,-1,13,47,200,21};
        int diziCopy[] = Arrays.copyOfRange(dizi,0, dizi.length);
        for (int i = 0; i < diziCopy.length; i++) {
            System.out.println( diziCopy[i]);
        }



//CONSOLE
33
2
31
-1
13
47
200
21


  - deepEquals : Bu methot object tipindeki iki object diziyi karsilastirmak icin kullanilir iki object dizi birbirinin aynisi ise true diyer durum ise false dondurur.
        Object dizi1[] = {33, 2, 31, -1, 13, 47, 200, 21};
        Object dizi2[] = {33, 2, 31, -1, 13, 47, 200, 21};
        Object dizi3[] = {33, 245, 31, -1, 13, 47, 200, 21};
        System.out.println(Arrays.deepEquals(dizi1, dizi2));
        System.out.println(Arrays.deepEquals(dizi1, dizi3));



//CONSOLE
true
false



 - fill : Bu method bir diziye ilk deger vermek icin yani diziye hicbir deger verilmemisse default olarak o degerin verilmesini saglar;
        int dizi[] = new int[4];
        Arrays.fill(dizi, -1);
        dizi[0] = 47;
        dizi[1] = 27;
        for (int i = 0; i < dizi.length; i++) {
            System.out.println( dizi[i]); 
        }


//CONSOLE
 47
27
-1
-1


 - asList : Bu diziyi List tipine cevirmek icin kullanilir.
        Integer dizi[] = {27,47,33,2};
        List list = Arrays.asList(dizi);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }


//CONSOLE
 27
47
33
2


 - equals :  Iki diziyi kontrol eder birbirini aynisi ise true farkli sie false dondurur.
 - hashCode : Bir dizinin code olarak gelen numarasini int tipinde yollar yani su sekilde diyelimki iki dizimiz olsun birinci diziyi Arrays.hashCode(dizi1) ile code degerini aliyoruz ve ikinci dizininde ayni sekilde Arrays.hashCode(dizi2) aliyoruz. Bunlarini donen code ayni ise diziler ayni dizi farlkli ise diziler farkli diziler.
        int dizi1[] = {27,47,33,2};
        int dizi2[] = {27,47,33,2};
        System.out.println(Arrays.hashCode(dizi1));
        System.out.println(Arrays.hashCode(dizi2));



//CONSOLE
1774070
1774070


ikiside ayni code donderdigi icin ayni oldugu anlasiliyor. Aslinda tum karsilastirma islemleri arka planda bu olayi kullaniyor.

 - toString : Dizinin String tipindeki degerini dondurur.


 - System.arraycopy : Bir diziyi digerine kopyalamak ici kullanilir. Bu methotun 5 tane parametresi var
  1. Kopyalanacak dizi
  2. Kopyasi alinacak dizi nereden basliyarak kopyasi alinsin.
  3. Kopyasi alinacak dizi
  4. Basladigi yerden ilk nereden kopyalamaya baslasin
  5. Kopyasi alinacak dizi nereye kadar kopyasi alinsin
Multi Array (Cok Boyutlu Diziler)

Çok boyutlu dizi, dizilerden olusan bir dizi demektir. Her elemani baska bir dizi olan dizi.Yani öyle bir dizi tanimlayacagiz ki elemanlari baska diziler olsun.
         String dizi[][] = new String[4][3];
        dizi[0][0]="1";
        dizi[0][1]="Abdulkadir";
        dizi[0][2]="Selcukoglu";
        dizi[1][0]="2";
        dizi[1][1]="Ertugrul";
        dizi[1][2]="Aslan";
        dizi[2][0]="3";
        dizi[2][1]="Nazim";
        dizi[2][2]="Memedov";
        dizi[3][0]="4";
        dizi[3][1]="Rasim";
        dizi[3][2]="Imanov";

        for (int i = 0; i < dizi.length; i++) {
            String[] strings = dizi[i];
            for (int j = 0; j < strings.length; j++) {
                String string = strings[j];
                System.out.print(string +" - ");
            }
            System.out.println();
        }
//CONSOLE
1 - Abdulkadir - Selcukoglu -
2 - Ertugrul - Aslan -
3 - Nazim - Memedov -
4 - Rasim - Imanov - 







Thursday, July 22, 2010

Object

 Nesne yonelimli programlamayi anlamak icin oncelikle  nesne kavramini cok iyi bilmeliyiz ve nesne kavrami gunluk hayatimizda bildigimiz anlami ile uygulamaliyiz java programinda misal icin kopek , masa , televizyon , bisiklet...
Gercek dunyadaki nesnelerin iki ozeligi vardir
  • Nesnelerin sahip oldugu ozelik ve durum 
  • Nesnenin davranisi
Ornek vermek gerekirse bir kopegi ele alalim.
 -  ilk mademize bu kopekteki ozelik ve durum :   rengi , adi , cinsiyeti , cinsi...
 -  ikici madede ise : kosmek , yakalamk , kuyruk salamak , havlamak...
Simdi gelin gercek dunyada dusundugumuz bu ornekleri nesne tabanli bir programlar icin dusunelim.
  -  Sahip oldugu ozelikler deyince field(degiskenler)
  -  Davranis deyincede methotlar

*  Object icerisinde veri ve fonksiyon barindiran yapidir. Veri tutan birimler 'Property' belli bir islevi goren birimler ise 'Method' adlandirirlir.
*  Bir insanin boyu bir 'Prorperty' ve yurume islemi ise 'Method' tur.
*  Bir nesnenin ne gibi 'Property' ve 'Method' lari olacagini belirleyen yapiya 'Class' denir
*  Bu 'Class' uygun olarak olsturan nesneyede 'Instance' denir 
Web sitesi bir 'Class' dir. www.selcukoglu.blogspot.com ise bunun bir 'Instance' dir
Insan bir 'Class' tir Abdulkadir bunun bir 'Instance' sidir.
 * Javada herseye nesne gibi davranabilirirz. hersey nesne olmasina ragmen nesneleri yonetmek icin 'Referans' lar kullanilir. 
Diyelimki ellimizde bir  kumandali araba olsun (Arabayi nesne olarak dusunelim) birde bu arabaya ait bir tane kumanda olsun (Kumanda burada 'Referens' olarak dusunelim) bu arabayi hareket ettirmek saga sola cevirmek iler geri gelmesinisaglamak icin kumanda cihazindan yararlaniyoruz. Burada dikkat edilmesi gereken kumanda cihazindan cikan emirleri araba tarafindan uyguluyor olunmasidir.
Elimizdeki uzaktan kumandanin (Referans) olmasi arabanin (Nesne) oldugu anlamina gelmez. Uzaktan kumanda tek basina hayatini surdurur.
String kumanda;
Bu suanda herhangi bir nesneye baglidegil. Bir 'Referans' a bir sey gondermek istiyorsak onu bir nesneye baglamamiz gerekir 
String kumanda = new String();
Bu konuyu daha iyi anlamk icin bir ornek gelistirelim

public class Araba {
    public String marka;
    public String renk;
    public String modeli;

    public Araba() {
    }

    public Araba(String marka, String renk, String modeli) {
        this.marka = marka;
        this.renk = renk;
        this.modeli = modeli;
       
    }

    public void arabaminOzeligi(){
        System.out.println("Markasi : "+marka+"  Rengi : "+renk+" Modeli : "+modeli);
    }

    public void ileri(){
        System.out.println(  "Araba ileriye dogru hareket ediyor ---> ");
    }

    public void geri(){
        System.out.println("Araba geriye dogru hareket ediyor <--- ");
    }

     public void sag(){
        System.out.println("Araba saga dogru hareket ediyor...");
    }

     public void sol(){
        System.out.println("Araba sola dogru hareket ediyor...");
     }

    public void hizlan(){
        System.out.println("Araba hizlaniyor :) ");
    }

    public void dur(){
        System.out.println("Araba durdu :( ");
    }
}



public class ArabaMain {
    public static void main(String args[]) {

        Araba kumanda = new Araba("Opel","Kirmizi","2009");
        kumanda.arabaminOzeligi();
        kumanda.ileri();
        kumanda.sag();
        kumanda.sol();
        kumanda.geri();
        kumanda.hizlan();
        kumanda.dur();
     
    }
}

 

//CONSOLE
Markasi : Opel  Rengi : Kirmizi Modeli : 2009
Araba ileriye dogru hareket ediyor --->
Araba saga dogru hareket ediyor...
Araba sola dogru hareket ediyor...
Araba geriye dogru hareket ediyor <---
Araba hizlaniyor :)
Araba durdu :( 

Wednesday, July 21, 2010

Primitives Type(Ilkel Veri Tipleri)

 Deyiskenler programda kullanilacak verilere verilen adlardir.Veriler buyuklukleri ve uzerinde yapilan islemler acisindan farkli tiplere ayrilir. Degisken bildiriminde veri tipi belirtilir. Boylece derleyici o degiskene ve o veri tipineyetecek buyuklukte bellekte yer ayrilir.
Javada veri tipler iki gruba ayrilir
  • Primitive type(Ilkel veri tipleri)
  • Java Siniflar
Biz bu bolumde Primitive type(Ilkel veri tipleri) inceliyecez
Primitive type(Ilkel veri tipleri)
 int : Bu deyisken –2,147,483,648 to 2,147,483,647 araliginda deger alir. Default olarak SIFIR olur. Bir int hafizada 32 bit yer kaplar
         int deyer1 = 0;
        System.out.println(deyer1);
        deyer1 = 3;
        System.out.println(deyer1);
        int deyer2 = deyer1;
        System.out.println(deyer2);
        int deyer3 = 5 + deyer1;
        System.out.println(deyer3);


 // CONSOLE
 0
3
3
8


float : Bu deyiskenin araligi asagidaki resimde yaziyor

 Default olarak 0.0f yada SIFIR' a essittir. bu degiskeni deklare ettikten sonra deger vermek icin 'f' yada 'F' kullanilir. Bu degisken hafizada 32 bir yer kaplar.
         float deyer1 = 0;
        System.out.println(deyer1);
        deyer1=0.2f;
        System.out.println(deyer1);
        float deyer2=45.2f;
        System.out.println(deyer2);
        float deyer3=2;
        System.out.println(deyer3);
        float deyer4=deyer1;
        System.out.println(deyer4);
        float deyer5=deyer1+3.2f;
        System.out.println(deyer5);
// CONSOLE
 0.0
0.2
45.2
2.0
0.2
3.4


boolean : Bu veri tipinin iki degeri vardir. true ve false. Default olarak false dir.Bu veri tipi hafizada 1 bit yer kaplar.
        boolean deyer1 = false;
        System.out.println(deyer1);
        boolean deyer2 = true;
        System.out.println(deyer2);
        boolean deyer3 = deyer1;
        System.out.println(deyer3);
//CONSOLE
 false
true
false

char : Bu veri tipi hafizada 16 bit yer kaplar. bu deri tipine ancak bir carekter atayabilirsiniz yada Unicode kodunu yazabilirsiniz Default olarak \n0000 veya SIFIR alir.
\n0000 = 0
\n0046 = F

        char deyer1 = 0;
        System.out.println(deyer1);
        char deyer2 = 'X';
        System.out.println(deyer2);
        char deyer3 = 'A';
        System.out.println(deyer3);
        char deyer4 ='\u0000';
        System.out.println(deyer4);
        char deyer5 ='\u0046';
        System.out.println(deyer5);
        char deyer6 ='\u0065';
        System.out.println(deyer6);
 
 //CONSOLE

X
A

 F
e

 Primitive tipler ve Onlarin Wrapper Class
Biz bu bolumde primitive tipleri kapsayan siniflari yani Wrapper class lari inceliyecez.
  • Integer(int)
  • Boolean(boolean)
  • Float(float)
  • Character(char)
  • Short(short)
  • Long(long)
  • Float(float)
  • Double(double)
Wrapper classlar buyuk harf ile baslar ama Primitive tipler kucuk harfler ile baslar. Primitive tip ile Wrapper classlar arasinda pek bir far yok ama ikisini birbirirnde ayiran bazi yanlar var. Programda kullanmak icin en iyi tip Primitive tiptir cunku bellekte daha az yer kaplar .J2SE 5.0 ile primitiv tiplerin Wrapper classlara yada Wrapper classlarin Primitive tipe cevirmeleri otomatik donustururcu sayesinde gerceklestirirliyor.  Burada dikkat edilmesi gereken bir sey Wrapper class icinde ki methodlari kullana biliyon yani bir sinif gibi hareket ediyor ama Primitive tiplerde ise sadece deger atamak icin kullaniliyor ve bundan dolayi bellekte az yer kapliyorlar.

Friday, July 16, 2010

Programming with Java Operators(Java Operatorlerii)

Fundamental Operators 
  1.   Assignment operators (Atama Operatorler)
  2.  Arithmetic operators (Aritmatik Operatorler)
  3. Relational operators (Iliskisel Operatorler)
  4. Logical operators (Mantiksal Operatorler)
1 .  Assignment Operators(Atama Operatorleri)
  • =
  • +=
  • -=
Degiskenelere degere atamak icin kullanilir.
boolean isA = true;
byte b = 20;
HelloWord  hw = new HelloWord();
 - Compound Assignment Operations(Birlesik Atama Operatoru) : 
  •   +=
  •   -=
a = a + 5 
a= a - 5 
  - Other Java Assigment Operators Such As : >>= , <<= , += , -= , *= , /= , %= , ^= , |= , &= , >>>=
 
2 .  Arithmetic operators (Aritmatik Operatorler) : 
- Basic Arithmetic Operators 
  • + addition (sum) operator
  • - subtraction (difference) operator
  • * multiplication (product) operator
  • / division (quotient) operator
  • % modulus (remainder) operator
int a = 50;
int b = 25;
int c;
c = a + b; //addition (sum) operator
c = a - b; //subtraction (difference) operator
c = a * b;// multiplication (product) operator
c = a / b;  /// division (quotient) operator
c = a % b; //   modulus (remainder) operator

 - Prefix Increment, Postfix Increment, Prefix Decrement, and Postfix Decrement Operators 
  • ++x prefix increment operator
  • --x prefix decrement operator
  • x++ postfix increment operator
  • x-- postfix decrement operator
int x = 10;
int y = ++x ;
System.out.println("x=" + x + ", y=" + y); // x= 11, y= 11


int x = 10;
int y = x++ ;
System.out.println("x=" + x + ", y=" + y); // x= 11, y= 10



int x = 10;
int y = --x ;
System.out.println("x=" + x + ", y=" + y); // x= 9, y= 9



int x = 10;
int y = x-- ;
System.out.println("x=" + x + ", y=" + y); // x= 9, y= 10
Relational Operators



3 .  Relational operators (Iliskisel Operator) : Bu operator geriye Boolean tipinde degerler dondurur bu operatorlar 4 kisimdan olusur.
  •  <  “less than” operator
  • <= “less than or equal to” operator
  • > “greater than” operator
  • >= “greater than or equal to” operator
- Equality Opertors : Esitlenebilecek primitif tipler number\ , character , boolean
  • ==
  • !=
==   operatoru sag ve solundaki veri tipleri ayni tipte ve birbirine esitse true diger durumda ise false dondurur.
!= operatoru sag ve so;undaki degerler esit degil ise true diger durumda false dondurur. 

int value = 12;
/* boolean comparison, prints true */
System.out.println(true == true);
/* char comparison, prints false */
System.out.println('a' != 'a');
/* byte comparison, prints true */
System.out.println((byte)value == (byte)value);
/* short comparison, prints false */
System.out.println((short)value != (short)value);
/* integer comparison, prints true */
System.out.println(value == value);
/* float comparison, prints true */
System.out.println(12F == 12f);
/* double comparison, prints false */
System.out.println(12D != 12d);


4 . Logical operators (Mantiksal Operatorler) : Bu operator geriye Boolean tipinde degerler dondurur 
  •  && logical AND (conditional-AND) operator
  • || logical OR (conditional-OR) operator 
&& = Ve 
/* Assigns true */
boolean and1 = true && true;
/* Assigns false */
boolean and2 = true && false;
/* Assigns false, right operand not evaluated */
boolean and3 = false && true;
/* Assigns false, right operand not evaluated */
boolean and4 = false && false; 




 || = Veya
/* Assigns true, right operand not evaluated */
boolean or1 = true || true;
/* Assigns true, right operand not evaluated */
boolean or2 = true || false;
/* Assigns true */
boolean or3 = false || true;
/* Assigns false */
boolean or4 = false || false; 


Bu konunun daha iyi anlasilmasi icin bir uygulama yapiyoz.
public class MainTest {
        public static void main(String[] args) {
               if ((isItSmall(3)) || (isItSmall(7))) {
                     System.out.println("Result is true");
               }
               if ((isItSmall(6)) || (isItSmall(9))) {
                      System.out.println("Result is true");
               }
        }

        public static boolean isItSmall(int i) {
               if (i < 5) {
                      System.out.println("i < 5");
                      return true;
               } else {
                     System.out.println("i >= 5");
                     return false;
               }
        }
}

 

//Console Output
 i < 5
Result is true
i >= 5
i >= 5


Aslinda bu uygulamadaki ciktiya baktigimizda cok acik olarak anlasiliyor || operator ilk ilce birinciyi kontrol eder eyer true ise diyerine hic gitmez bakmaz calistirmaz onun icin if ((isItSmall(3)) || (isItSmall(7)))  sart bakildiginda bu kisim (isItSmall(3)) tru dondugu icin ikincisi hic calistirilmiyor ama  
if ((isItSmall(6)) || (isItSmall(9)))  bu sarta birinci kontrol edilyor bakiyor false ise o zaman ikinci calistiriliyor

-Logical Negation Operator : ! bu operator degil demektir bir boolean degerin degilini olusturur. yani boolean a = true ; burada a true degeridir ama su sekilde olursa !a o zaman true olan degeri false olur. 

System.out.println(!false); // Prints true
System.out.println(!true); // Prints false
System.out.println(!!true); // Prints true
System.out.println(!!!true); // Prints false
System.out.println(!!!!true); // Prints true 


non-short-circuit logical operators : 
          ■ & non-short-circuit AND :

          ■ | non-short-circuit OR :Bu operatorde sartlarin ikiside kontrol ediliyor ama sadece birinin dogru olasi sarti true ediyor

public class MainTest {
       public static void main(String[] args) {
              int z = 5;
              System.out.println("Before z : "+z);
              if (++z > 5 | ++z > 6) {
                     z++;
                     System.out.println("After z  : "+z);
              }
       }
}

//Console Output 
Before z : 5
After z : 8
Gorulduyu gibi | operatorunde her ikiside konturol ediliyor yani birinci dogru oldugu halde ikinci sartta kontrol ediliyor. 

Thursday, July 15, 2010

Programming with Java Statements(Java Programlama Ifadeleri)

.
Iyi gunlar arkadaslar bugunku yazimda Javada sikca duyulan ve kullanilan bazi ifadeleri anlatmaya calisacam Ama konuya girmeden sunu hatirlatayim ingilizce verilen isimleri yazacam ve bu anahtar sozcuklarin turkcasini pek kullanamaiyacam bunu yapmamadaki sebeb bu dili ogreneceksek bu ifadeleri cok iyi bilmaliyiz diyer bir sebebide SCJA sinavina hazirlaniyorum ve sorular genel olarak bu ifadelerden geciyor sindi konumuza basliyabiliriz ilk ifademiz


assert : Java calisma zamaninda -ea ile calistirilmasi durumunda assert ile ozel ciktilar elde edebilirsiniz assert ozel bir exception firlatarak sonuc dondurmenizi saglar. Kullanimi asagidaki gibidir.
bu sayede -ea komutu ile calistirarak java programinin ozel debug mesajlari meydana getirmesini saglar simdi bu konu ile ilgili bir ornek yapalim.
oncelikle ben bilgisayarimin c bolumnde az diye bir dosya olusturdum ve az icindede risk diye bir dosya daha olusturdum riskin icindede yeni bir notepad olusturdum ve ismini HaftaninGunleri.java dedim


public class HaftaninGunleri{
  private int gun= 0;
  public static void main(String[] arg) {
    int d = Integer.parseInt(arg[0]);
    HaftaninGunleri o = new HaftaninGunleri(d);
    System.out.print("Bugun haftanin : "+o.getDayOfWeek());
  }


    public HaftaninGunleri(int d) {
           gun = d;


   }
    public String getDayOfWeek() {
    if (gun % 7 == 0) {
       return "Pazar";
    } else if (gun % 7 == 1) {
       return "Pazartesi";
    } else if (gun % 7 == 2) {
       return "Sali";
    } else if (gun % 7 == 3) {
       return "Carsamba";
    } else if (gun % 7 == 4) {
       return "Persembe";
    } else if (gun % 7 == 5) {
       return "Cuma";
    } else {
       assert gun % 7 == 6 : gun +"  Lutfen Pozitif Bir Sayi Giriniz..." ;
       return "Cumartesi";
    }
  }
}

Sindi gelini bu yazdiklarimizi derleyip calistiralim ve assert nasil calistigini gorelim (How to Compile and Run Java Programs with "assert" Statements?)
c:\az\risk>javac HaftaninGunleri.java
diyerek derliyecez

Simdi Yukaridaki resimde derleme islemi yapildi simdi calistiralim
c:\az\risk>java -ea HaftaninGunleri 13

Burada kodumuz su sekilde calisiyor gelen sayi 13 ise onu 7 ye boluyor kalan kac ise sartlar konturol ediliyor ve ona uygun bir cevap donuyor simdide eyer sartlar uygun degil ise bizin olustirdiginiz assert hata mesajini firlatalim bunu yapmak icin -ea ifadesini kullaniyoruz bu ifade su manaya geliyor eyer bir hata olusursa benim olusturdugum mesajlari kullan



break : Donguyu aniden sonlandirmak veya donguyu kirmak icin break komutu kullanilir dongunun bitisinin nerede olacagini bilmedigimiz bir donguyu ancak break komutuyla sonlandirabiliriz Sartlar saglandiginda break komutu devreye girer ve dongu sonlanir.


case :   Bu ifadeyi daha cok switch konusunda gorecegiz bu ifadenin anlami uygun olan sarti yoklamak icin kullanilir. uygun sarti bulunca yapilmasi gereken islem devreye girer.


continue : İşlem yapmadan döngüyü devam ettirmek için ise continue komutunu kullanırız.  

public class MainContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            if (i == 2) {
                continue;
            }

            System.out.println(i+" .  Sayi");
        }
    }

continue sayesinde i sayısı 2 ye eşit olmadığından kodun çıkışında 2 yi atlayıp döngüyü 3 e geçirip devam ettirir.Ama continue kullanılmamış olunsaydı 0(0 'da dahil) dan 5 e kadar olan bütün değerler kodun çıkışında çıkacaktır.



empty :  Tek basina kullanilan noktali virgül anlamina gelen bir ifadedir. Bir kodun sonlandigini bildir.

Bu konu hakinda guzel bir yazi bu linkten bakabilirsiniz http://hubpages.com/hub/Java-Debugging-Tip-The-Empty-Statement


public class MainEmpty{
    public static void main(String args[]){
        for(int i=0;i<5;i++);  // Bu dongu burada bittigini bildiriyor.
        {
            System.out.println("Hos Geldiniz...");
        }
    }
}




expression :  Tek degerdem ibaret kod parcasidir. Islemleri yapmak icin kullanilir. a+b, a-b,a=5, a*b ,++a, --a,a++,a-- vs.....

 labeled : iki nokta ust uste manasina gelir. Ornek olarak switch olustururken her bir case icin ":" isratei kullanilir.


synchronized :  Bu konu ile ilgili cok guzel bir yazi hazirlami  Şadi Evren ŞEKER hocam bu yazini ustune birseyler yazilmaz. Link : http://www.bilgisayarkavramlari.com/2009/10/09/eslemeli-metotlar-synchronized-methods/

Yazan : Şadi Evren ŞEKER

JAVA, C++ veya C# gibi nesne yönelimli programlama dillerinde kullanılan bir terimdir. Basitçe, aynı anda çalışan birden fazla lifin (thread) veya işlemin (process) sıralı olmasını ve birbiri ile iletişim halinde çalışmasını sağlar.

Nesne yönelimli programlama ortamında iki farklı kavram birbirine sıkça karışmaktadır. Aslında anlam olarak birbirine yakın olan synchronized methods (eşlemeli metotlar, synchronous method) ve synchronized statements (eşlemeli satırlar) kullanımda ufak farklılıklara sahiptir.

Bir metodun eşlemeli olması durumunda metottaki bütün işlemler, bu metodu çağıran lifler (threads) tarafından sırayla yapılır. Yani bir lif (thread) bu metodu çalıştırırken bir diğeri beklemek zorundadır.

Benzer şekilde eşlemeli satırlarda ise kritik alan (critical section) ismi verilen bir veya daha fazla satırdan oluşan bir blok olur. Bu blok eşlemeli metotlarda olduğu gibi liflerin (threads) sırayla buradaki komutları çalıştırmasını gerektirir.

Öncelikle JAVA dilinde metotların nasıl eşlemli (synchronized) yapıldığına bakalım:
public class Sayac {
    private int c = 0;
    public void arttir() {
        c++;
    }
    public void azalt() {
        c--;
    }
    public int deger() {
        return c;
    }
}

Yukarıdaki kodda bir sınıf tanımlanmış ve c isminde bir int değişken bu sınıf (class) içerisinde bir sınıf değişkeni (class variable) olarak tanımlanmıştır. Yukarıdaki bu sınıfı kullanan bütün lifler (threads) bu değişkene erişme ve değiştirme hakkına sahiptir. Örneğin iki farklı lif (thread) aynı anda arttir() metodunu çağırırsa ve c değişkeninin ilk değeri 0 ise, değişken iki kere arttırılarak 2 olabilir veya iki lif (thread) tarafından da birer kere arttırılarak 1 olabilir.

Yani iki lif (thread) de aynı anda değişkenin değerini aldılar (0 olarak) arttırdılar (1 oldu) ve aynı anda değişkenin içine yazdılar. Dolayısıyla değişken iki farklı lif (thread) tarafından arttırılmasına rağmen 1 değerine sahip olmuş olabilir. Bu problem bilgisayar bilimlerinde sıkça karşılaşılan get and set (alma ve koyma) problemidir ve bu iki işlemin bölünemez (atomic) olmamasından kaynaklanır.

Bu yazı şadi evren şeker tarafından yazılmış ve bilgisayarkavramlari.com sitesinde yayınlanmıştır. Bu içeriğin kopyalanması veya farklı bir sitede yayınlanması hırsızlıktır ve telif hakları yasası gereği suçtur.

Yukarıdaki bu klasik problemin çözümü fonksiyona bir lif (thread) erişirken başka birisinin erişmemesidir. Böylelikle fonksiyona erişen her lif (thread) mutlaka değeri bir arttıracak ve sonuç olarak c değişkeninin değeri tam olarak bilinebilecektir.

Yukarıdaki bu eşlemeli erişimi sağlamak için kodun aşağıdaki şekilde değiştirilmesi gerekir:
public class synchronizedSayac {
    private int c = 0;
    public void synchronized arttir() {
        c++;
    }
    public void synchronized azalt() {
        c--;
    }
    public int deger() {
        return c;
    }
}

Yukarıdaki yeni kodda dikkat edileceği üzere metotlar synchronized kelimesi ile başlamakta ve dolayısıyla erişim anlık olarak tek life (thread) izin vermektedir.

Yukarıdaki kodda deger() fonkisyonu synchronized yapılmamıştır. İlk bakışta bu durum doğru gibi gelir. Genelde şu hatalı kanı yaygındır: Bunun sebebi bu fonksiyonun içeriğinde karışıklık sebebi olacak bir iş yapılmamasıdır. Yani anlık olarak değişkenin değerinin okunması mümkündür ve bu okuma işlemi diğer liflerde (threads) bir probleme yol açmaz.

Bu kanı doğrudur ve gerçektende diğer liflerde (threads) bir soruna yol açmaz ancak deger() metodunu çağıran lif(thread) için sorun vardır. Yani o anda bir lifin (thread) arttir() fonksiyonuna eriştiğini ve bizim de deger() fonksiyonuna eriştiğimizi düşünelim. Acaba deger() fonksiyonu arttırılmadan önceki değerimi arttırıldıktan sonraki değerimi döndürecek?

İşte bu yüzden bu fonksiyonu da eşlemeli yapmak gerekir ve kodun doğru hali aşağıdaki şekildedir:
public class synchronizedSayac {
    private int c = 0;
    public void synchronized arttir() {
        c++;
    }
    public void synchronized azalt() {
        c--;
    }
    public int synchronized deger() {
        return c;
    }
}

Yapıcılar (constructors) eşlemeli olamaz. Yani bir yapıcı fonksiyonunun (constructor) başına synchronized kelimesi yazılması hatadır. Bu gayet açıktır çünkü zaten bir yapıcıya (constructor) anlık olarak tek lif (thread) erişebilmektedir.

C# dilinde senkron metotlar için sadece yazılış farklılığı vardır. Örneğin yukarıdaki JAVA koduyla aynı işi yapan csharp kodu aşağıdaki şekildedir:
using    System;
using    System.Runtime.CompilerServices;
public class synchronizedSayac {
    private int c = 0;
[MethodImpl(MethodImplOptions.Synchronized)]
 public void arttir() {
        c++;
    }
[MethodImpl(MethodImplOptions.Synchronized)]
 public void azalt() {
        c--;
    }
[MethodImpl(MethodImplOptions.Synchronized)]
 public int deger() {
        return c;
    }
}

Görüldüğü üzere metodun başındaki synchronized terimi yerine [MethodImpl(MethodImplOptions.Synchronized)] gelmekte ve ilave olarak System.Runtime.CompilerServices paketi programa dahil edilmelidir.

Eşlemeli satırlar

Programlama dillerinde bazen bir metodun tamamına değil de sadece bir veya birkaç satırı içeren bir bloğa anlık olarak tek bir lifin (thread) girmesi istenebilir. Bu durumda ilgili bu satırların eşlemeli (synchronized) yapılması yeterlidir. Bunun için JAVA dilinde, aşağıdakine benzer bir kodlama gerekir:
public void isimEkle(String isim) {
    synchronized(this) {
          sayac++;
    }
    isimListesi.add(isim);
}

Yukarıdaki kodda görüldüğü üzere isimListesi isimli bir listeye yada vektöre (vector) isim eklenmektedir. Bu işlemin sıralı olması gerekmez. Yani listeye her lif(thread) değişik zamanlarda ekleme yapabilir. Ancak eklenen isimlerin sayısının doğru tutulması açısından sayacın arttırılma işlemine erişen liflerin (thread) aynı anda değiştirme yapmaması gerekir. Bunun için sadece bu satırı eşlemeli (synchronized) yapan kod eklenmiştir.

Aynı kod C# için aşağıdaki şekilde yazılabilir:
public void isimEkle(String isim) {
    lock(this) {
          sayac++;
    }
    isimListesi.add(isim);
}

Görüldüğü üzere iki dil arasındaki tek fark, synchronized terimi yerine lock teriminin kullanılmasıdır.



 
 Understanding Fundamental Statements(Temel Ifadeler)
  1.  Assignment
  2. Conditional
  3. Iteration  
1 .  Assignment Statement : Assignment statements genel kullanimi   
                                 variable = value;

int variableName; // Declaration of an integer
variableName = 100; // Assignment expression statement


int fishInTank = 100; int fishInCooler = 50;
int totalFish = fishInTank + fishInCooler;

 1 .  Conditional Statement :  


 1 .  Iteration  Statement :