Java - Operatörler

Java - Operatörler

Arkadaşlar merhaba,

Bugün java operatörlerden bahsedeceğiz.

Operatörler Nedir ?

Operatörler bir, iki ya da üç tane girdi (operand) alan üzerinde işlem yapıp bir sonuç üreten bir semboldür.

  • Tek işlenenlilere, tekli işlemci (unary operator)

  • İki işlenenlilere, ikili işlemci (binary operator)

  • Üç işlenenlilere de, üçlü işlemci (ternary operator) denir.

Atama (Assignment)

İki işlenen alır ve sağdaki işleneni soldaki işlenene atar.

//Değer ataması

int i = 1;
boolean a = false;

// Nesne Ataması

Person p = new Person();

İkili Aritmetik İşlemciler (binary arithmetic operators)

İkili aritmetik işlemciler 5 tanedir.

+ : Toplama (addition)

- : Çıkarma (subtraction)

* : Çarpma (multiplication)

/ : Bölme (division)

% : Kalan ya da mod (remainder

Ayrıca java'da bir işlemci olmadan sadece aritmetik işlem yapılamaz derleyici hata verir.

int i = 2;
int j = 1;
i + j;  //Derleyici hatası

Birleşik Atama (Compound Assignment)

Bir değişkenin değeri değiştirilip yine kendisine atanacaksa, bu birleşik atama (compound assignment) ile daha az kod yazarak yapılabilir.

+= Sağdaki değeri soldaki değişkene ekler ve toplamı değişkene atar.

-= Sağdaki değeri soldaki değişkenden çıkarır ve farkı değişkene atar.

*= Sağdaki değeri soldaki değişkenle çarpar ve çarpımı değişkene atar.

/= Soldaki değişkeni sağdaki değere böler ve bölümü değişkene atar

int i = 2;
i = i + 3; 
i+= 3 ;  // işimdi = 8
i -= 4;  // işimdi = 4
i /= 1;  // i şimdi =  4

Otomatik çevirim (cast), bileşik atama kullanılmazsa otomatik yapılmaz.

Bileşik operatörün sol tarafı yalnızca önceden tanımlanmış bir değişkene uygulanabilir ve yeni bir
değişken bildirmek için kullanılamaz. Bu örnekte, cat önceden tanımlanmamışsa, cat *= dog ifadesi derlenmez.

int cat = 2, dog = 3;
cat = cat * dog; // Tekli atama operatörü
cat *= dog; // Bileşik Atama operatörü
int i = 5;
double d = 1.3d;

i = i + d // Hata!

i = (int) (i + d); // (cast) gerekli
  • İki değere sahip farklı veri türleri varsa, Java, değerlerden birini otomatik olarak iki veri türünden daha büyük olanına terfi ettirecektir.
  • Değerlerden biri noktalı sayı ise, Java otomatik olarak tam değeri noktalı float , double gibi değerinin veri türüne yükseltir.

  • Daha küçük veri türleri, yani byte, short ve char, işlenenlerden hiçbiri int olmasa bile, bir Java ikili aritmetik işlemciyle kullanıldıklarında ilk olarak int'ye yükseltilir.

  • Yükseltilen değer aynı veri tipine sahip olacaktır.

  • İkili aritmetik işlemciler, yaptıkları işlem sonucunda en az int tipinde bir değer üretirler. Yani;

-En az bir işlenen double ise sonuç double,

-Değilse, en az bir işlenen float ise sonuç float,

-Değilse, en az bir işlenen long ise sonuç long,

-Aksi taktirde sonuç int tipinde olur. int'den daha büyük tip ne ise o üretilir , aksi taktirde int'den daha küçük bir tip üretilmez.

Yani, int‘den daha küçük tipteki işlenenlerle yapılan aritmetik işlemler daima int bir sonuç üretir.Buna yükseltme (promotion) denir.

Tekli Aritmetik İşlemciler (unary arithmetic operators)

Unary arithmetic operators 4 tanedir:

+: İşleneni etkilemez, örneğin negatifi pozitif yapmaz,

-: İşleneni negatif yapar.

++: Artım (increment) işlemcisi, sayısal değeri 1 arttırır.

--: Eksiltme (decrement) işlemcisi, sayısal değeri 1 eksiltir.

++ ve --, işlenenin öncesinde ya da sonrasında kullanılabilir.

++ ve -- işlenenin tipini korur ve yükseltme yapmaz.

++ ve -- tek başına kullanılabilir.

int i = 3;
++i;  // i 4 oldu
++;  // i 5 oldu
--i;  // i 4 oldu
--;  // i 3 oldu
  • Aritmetik işlemci öncesince ise, önce arttırma (pre-increment) ya da eksiltme (pre-decrement) yapılır, sonra işlenenin değeri belirlenir.

  • Sonra ise, önce işlenenin değeri belirlenir varsa atama yapılır sonra arttırma (post-increment) ya da eksiltme (post-decrement) yapılır.

  • Assigment operatörü ile sağdan başlar sola doğru gider.

  • Assigment olmadan toplama,çıkarma,çarpma,bölme soldan başlar sağa doğru gider. Bileşik atama işlemleride aynı şekilde çalışır.

  • pre-increment'ler post-increment'lerden daha az önceliğe sahiptir.

int example = 0;
System.out.println("EXAMPLE :" + example); // 0
System.out.println("EXAMPLE : " + ++example); // 1
System.out.println("EXAMPLE :" + example++); // 1
System.out.println("EXAMPLE :" + example); // 2
System.out.println("EXAMPLE :" + --example); // 1
System.out.println("EXAMPLE :" + example--); // 1
System.out.println("EXAMPLE :" + example); // 0

Ayrıca operatör öncelikleri için link'deki tabloyu inceleyebilirsiniz.

Operatör Önceliği

Kıyaslama İşlemcileri (relational operators)

İki işlenen alıp bir mantıksal değer üretir. Kıyaslama işlemcileri 6 tanedir.

  • ">" Büyük müdür? ve ">=" Büyük ya da eşit midir?

  • "<" Küçük müdür? ve "<=" Küçük ya da eşit midir?

int gibbonNumFeet = 2, wolfNumFeet = 4, ostrichNumFeet = 2;
System.out.println(gibbonNumFeet < wolfNumFeet); // true
System.out.println(gibbonNumFeet <= wolfNumFeet); // true
System.out.println(gibbonNumFeet >= ostrichNumFeet); // true
System.out.println(gibbonNumFeet > ostrichNumFeet); // false

bu 4 büyüklük kıyaslama işlemcisi tam ya da gerçek sayı işlenen alır ve boolean değer üretir.

Eşitlik kıyaslayan işlemciler ise iki tane sayısal, boolean ya da referans işlenen alır ve boolean bir sonuç üretirler.

Sayısal değerler farklı veri türlerindeyse, değerler otomatik olarak yükseltilir.

Örneğin, 5 == 5.00, sol taraf double'a yükseltildiğinden true değerini döndürür.

İki boole değeri, null ve String değerleri dahil olmak üzere iki nesneyi karşılaştırır.

  • == Eşit midir ?

== operatörü basit tiplerin değerlerini , referansların ise adreslerini kıyaslar.

“==” işlemcisi referanslara uygulandığında, adresleri kıyaslandığından,ancak ve ancak iki referans da aynı adresi yani aynı nesneyi gösteriyorsa true döndürür.

Çünkü “==” işlemcisi, referansların gösterdiği nesnelerin içeriklerinin aynı olup olmadığını kontrol etmez.

  • != Eşit değil midir?

char işlenenler ile kullanıldığında kıyaslama işlemcileri, işlenenlerin tamsayı değerlerini kıyaslar.

boolean person = true == 3; // DOES NOT COMPILE
boolean animal = false != "Grape"; // DOES NOT COMPILE
boolean gorilla = 10.2 == "Koko"; // DOES NOT COMPILE
boolean dog = false;
boolean tiger = (dog = true); // bear true yapılır o yüzden sonuç true
System.out.println(tiger); // true

Referans Eşitliği

File sunday = new File("schedule.txt");
File tuesday = new File("schedule.txt");
File wednesday = tuesday;

System.out.println(sunday == tuesday);  // false;
System.out.println(tuesday == wednesday);  // aynı nesneyi işaret ettikleri için true

Java'da durum böyle olmasa da, bazı dillerde null değerini başka herhangi bir değerle karşılaştırmak her zaman false'dur.

System.out.println(null == null); // true

instanceof Operator

instaceof operatörü bir nesnenin çalışma zamanında belirli bir sınıfın veya interface'in üyesi olup olmadığını belirlemek için kullanılır.

instanceOf kullanımında dikkat edilecek bir diğer husus , aralarında miras yani alt-üst tip ilişkisi(is-a) olmayan bir referans ve tip kullanıldığın da derleme zamanı hatası alınacağıdır.

Çünkü derleyici instanceof operatörünün sol tarafındaki referans ile sağ arafındaki tip arasında bir alt-üst tip ilişkisi olup olmadığını bilir.Böyle bir ilişki yoksa cast zaten imkansız demektir ve derleyici hata verir.

Bir nesneden daha dar bir tip'e cast yapmadan önce instanceof operatörünü kullanmak iyi bir kodlama uygulaması olarak kabul edilir.

// Integer Number'ın alt class'ı

public static void open(Number time) {
    if (time instanceof Integer)
           System.out.print((Integer) time + " : O'clock");
    else
       System.out.print(time);
}

Bu örnekte, Integer hem Number hem de Object'i devraldığı için bellekte oluşturulan yalnızca bir nesne vardır, ancak ona üç farklı referans vardır.

Bu referansların herhangi birinde üç farklı veri türüyle instanceof'u çağırabileceğiniz ve her biri için true döndüreceği anlamına gelir.

Integer time = Integer.valueOf(9);
Number number = time;
Object obj = time;

open(1);
instanceof null kullanımı

null bir referansın her zaman false döndürdüğünü bilmelisiniz.

Object noObjectHere = null;

System.out.print(noObjectHere instanceof String);

System.out.print(null instanceof null);  // DOES NOT COMPILE

Mantıksal Operatörler

& VE (AND) : Her iki tarafta true ise true'dir.Bir tanesi false ise sonuç false olur.

| VEYA (OR): Bir tarafın true olması yeterlidir.true döndürecektir.false döndürmesi için iki tarafında false olması gerekir.

^ (XOR) : Özel XOR, yalnızca bir değer true, diğeri false olduğunda true döndürür.

! DEĞİL (NOT) : true ifadeyi false , false ifadeyi ise true yapar.

Kısayollar;

&& : Yalnızca her iki değer de true ise true'dur. Sol taraf false ise, sağ taraf değerlendirilmeyecektir.

|| :Değerlerden en az biri true ise true'dur. Sol taraf true ise, sağ taraf değerlendirilmeyecektir.

int hour = 10;
boolean openDoor = false || (hour > 4);

System.out.println("openDoor : " + openDoor);
boolean eyesOpened = true;
boolean breathingSlowly = false;

boolean resting = eyesOpened && breathingSlowly; 
boolean asleep = eyesClosed || breathingSlowly;
boolean awake = eyesClosed ^ breathingSlowly;

System.out.println("resting :" +resting); // false
System.out.println("asleep :" + asleep); // true
System.out.println("awake :" + awake); // true

Ternary Operator

booleanExpression ? expression1 : expression2

int bird = 3 ;
int food = bird < 2 ? 3 : 4;   // 4
int height = 2;
System.out.println((height > 5) ? 21 : "Giraffe");

Üçlü işlemlerde ikinci ve üçüncü ifadelerin aynı veri türlerine sahip olması şartı yoktur, ancak atama(assignment) operatörü ile birleştirildiğinde devreye girmektedir.

int animal = (stripes < 9) ? 3 : "Horse";   // Does not compıle
int fly = 1;
int zzz = 1;

int sleep = zzz < 10 ? fly++ : zzz++;
System.out.println("fly and zzz : " + fly + " ," + zzz);   // 2,1

sol taraf true olduğu için zzz'yi arttırmadan print etti.

int sleep1 = fly >= 10 ? fly ++ : zzz++;
System.out.print(fly + "," + zzz);   // 1,2

. sol taraf false olduğu için sağ taraftaki zzz arttırdı.

Umarım faydalı olmuştur.

Görüşmek üzere... :)