25 Ağustos 2012 Cumartesi

İlkel Veri Tipleri



Merhaba.

Önceki yazıda println, print ve printf kullanımlarını açıklayacağımı söylemiştim. Bir paragrafta açıklamaya çalışayım.

println() ve print() arasında tek fark var; println satır atlıyor, print ise imlecin aynı satırda kalmasını sağlıyor. printf() ise özel bir yöntem. Formatlı bir şekilde çıktı yazabiliyorsunuz. Bir örnek vereyim; diyelim ki kullanıcıdan ismini ve yaşını alıp ona bir selam vermek istiyorsunuz. Yaş için integer tipinde bir yas değişkeni ve isim için de String tipinde bir ad değişkeni oluşturdunuz ve isim ve yaşı kullanıcıdan aldınız. Bunu yazdırmak için aşağıdaki kodu yazabilirsiniz. Burada, %s bir string, %d ise bir integer arıyor.
System.out.printf("Selam %s, yaşın %d.",ad,yas);
İsterseniz bununla ilgili ayrıntıları konuda ilerledikçe verelim ve asıl konumuza dönelim.

Java'da birazdan bahsedeceğimiz ilkel veri tipleri dışında neredeyse her şey sınıf ve nesnelerden oluşuyor. Bu bahsedeceğimiz tiplerin bu şekilde bırakılmalarının sebebi ise performansmış. Bu arada, ilkel veri tiplerinden primitif tipler olarak bahsedildiğini de göreceksiniz. (Primitive = İlkel)

Normalde bir tablo halinde bunların maksimum ve minimum değerlerini vermem gerekirdi ama daha pratik bir yol buldum. Bu şekilde, kendimize bu tipler için bir referans programı yazabileceğiz. Birer cümle ile hepsine göz atıp ardından referans programımızın kodlarını yazalım.

int
İlkel veri tipleri arasında belki de en çok kullanacağımız tiptir. 32 bitlik bir tiptir. İşaretlidir, yani artı ve eksi değerleri vardır.

short
16 bitlik, işaretli bir tiptir. Hafızayı korumak adına kullanılabilir aslında ama günümüz bilgisayarları için bu pek de gerekli değil diye düşünüyorum.

byte
8 bitlik, işaretli bir tiptir.

long
64 bitlik işaretli bir tiptir.

float
32 bit, işaretli bir tiptir. Virgüllü sayılar için kullanabiliriz. Ama bu onun kesinlik gerektiren verileri tanımlamak için kullanılması gerektiği anlamına gelmiyor. Onun için daha sonra göreceğimiz math sınıfının BigDecimal öğesini kullanmamız gerekecek.

double
Bu da 64 bit, işaretli bir tiptir ve virgüllü sayılar için kullanılır.

Burada tanımlara kısa bir ara verip bir noktaya değinmek istiyorum. float ve double tipinde değişken tanımlarken, double için değerin sonuna d, float için de f koymamız gerekir. Yani,
float sayi = 21.4f;
şeklinde tanımlamalıyız.

boolean
Programcılıkla az buçuk ilgilendiyseniz, bunun sadece true ve false değeri döndüren ve çok yararlı bir tip olduğunu bilirsiniz.

char
Karakter için bir ilkel tip. 16 bit Unicode bir tiptir. Karakter değişkeni tanımlarken de, tırnak işareti kullanmalıyız. Yani,
char karakter = 'a';
şeklinde bir tanımlama yapmalıyız.

Yukarıdakilerin dışında bir de String vardır. Bu, Java'daki özel durumlardan bir tanesidir. İlkel veri tipi gibi kullanılabilen ama aslında bir sınıf (ve dolayısıyla nesne) olan değişkendir. char dizilerini String'e çevirebiliriz.
String biraz geniş bir konudur. Şimdilik, Stringleri bir defa tanımladığımızda bir daha değişmediklerini bilmemiz yeterlidir. Bu, tanımladığımız String'i değiştiremeyeceğimiz anlamına gelmiyor. Sadece JVM'nin String değiştirmek için fazla hafıza kullandığı anlamına geliyor.

String ve char arasındaki farklar belli, ama yine de belirtmekte fayda var;

  • String ile istediğimiz uzunlukta karakteri atayabiliyoruz. Ama char ile sadece bir karakter atanıyor. char karakter = 'ui'; yazıp kendiniz görün.
  • String tanımlarken değerinin etrafını çift tırnak ile, char'da ise tek tırnak ile tanımlarız.


Şimdiye kadar şunu da fark etmiş olmamız gerekiyor: Bir değişken tanımlarken söz dizimimiz şu şekilde;
degiskenTipi degiskenAdi = deger;
Yani, int tipinde bir değişken tanımlamak için int sayi = 45; deriz.

Gelelim bunların maksimum ve minimum değerlerini bize daha sonra zahmetsizce verecek olan programımızın kodlarına.

Tabi ki basit bir program olacak. Yeni bir proje açın ve main metot içeren bir sınıf yaratın:


 public static void main(String[] args) {
  char c = '\u00ED';
  System.out.println("Tip: " + Integer.TYPE+ " Boyut: " + Integer.SIZE + " bit " + " Maksimum değer: " + Integer.MAX_VALUE +" Minimum değer: "+ Integer.MIN_VALUE);
  System.out.println("Tip: " + Byte.TYPE+ " Boyut: "+  Byte.SIZE + " bit " + " Maksimum değer: " + Byte.MAX_VALUE +" Minimum değer: "+ Byte.MIN_VALUE);
  System.out.println("Tip: " + Short.TYPE+ " Boyut: "+ Short.SIZE + " bit " +  " Maksimum değer: " + Short.MAX_VALUE +" Minimum değer: "+ Short.MIN_VALUE);
  System.out.println("Tip: " + Long.TYPE+ " Boyut: "+ Long.SIZE + " bit " + " Maksimum değer: " + Long.MAX_VALUE +" Minimum değer: "+ Long.MIN_VALUE);
  System.out.println("Tip: " + Float.TYPE+ " Boyut: "+ Float.SIZE + " bit " + " Maksimum değer: " + Float.MAX_VALUE +" Minimum değer: "+ Float.MIN_VALUE);
  System.out.println("Tip: " + Double.TYPE+ " Boyut: "+ Double.SIZE + " bit " + " Maksimum değer: " + Double.MAX_VALUE +" Minimum değer: "+ Double.MIN_VALUE);
  System.out.println("Tip: " + Character.TYPE+ " Boyut: "+ Character.SIZE + " bit " + " Maksimum değer: " + Character.MAX_VALUE +" Minimum değer: "+ Character.MIN_VALUE);
  System.out.println("Char tipinin maksimum ve minimumu önemli değil tabi ki. Yalnız, Unicode ile değer verebileceğimizi unutmayalım. Yani; \n char c = '\\u00ED'; ile verdiğimiz değer aslında şudur: "+ c);
  System.out.println("Tip: " + Boolean.TYPE+ " " +" Yanlış: " + Boolean.FALSE +" Doğru: "+ Boolean.TRUE);
   }
 
Bu programda dikkat çekecek birkaç şeyi de yeri gelmişken anlamaya çalışalım. İşte örnekler yapmanın güzel tarafı da bu, bazen bildiklerimizle bir şeyler yapmaya çalışırken yeni şeyler de öğrenebiliyoruz. Şimdi benim aklıma gelen yerleri buraya yazayım:

  1. int ve diğer primitif tiplerin değerlerini vs. döndürürken int veya short değil de, Integer ve Short gibi, büyük harfle başlayan ifadeler kullandık. Bunlar, Java'daki ilkel tiplerin nesne gibi kullanılmak istendiği anda dönüştürüleceği nesneleri yaratan sınıflardır. Wrapping Classes yani sarmalayıcı sınıflardır.
  2. Sarmalayıcı sınıfların yanında büyük harflerle yazılan ifadeler kullandık. Bunlar, o sınıfların içindeki sabitlerdir. Java'daki isimlendirme geleneğine göre sabitler büyük harflerle yazılırlar. Tanıdık başka bir sabit için, Math.PI değerini yazdırmayı deneyin.
  3. char tipinde bir değişken tanımlarken değer olark  '\u00ED' verdik. Bu değer karşılığında çıkan karakterin Unicode değeridir. \u, Unicode girildiğini derleyiciye bildirir.
  4. '\u00ED' girmemize rağmen System.out.prinln() içinde '\\u00ED' yani iki tane \ işareti kullandık. Çünkü \u bir anlam ifade eder ve ekrana normal bir şekilde yazdıramazsınız. Bunun için kaçış karakteri olan \ karakterini başına eklersiniz. Derleyici için anlam ifade eden karakterlerin başına \ eklemezsek sorun çıkar. Mesela dosya yolu belirtirken de C:\Program Files değil, C:\\Program Files veya C:/Program Files şeklinde belirtmemiz gerekir.
  5. Kodda char ile ilgili açıklama olan yerde \n ifadesini kullandık ama programı çalıştırınca bunu göremedik. Çünkü \n ifadesi bir alt satıra geçmek için kullanılır. 
Son maddeyi okurken aklınıza print() ve println() gelmiş olabilir. Hatırlarsanız, print() çıktıyı verdikten sonra aynı satırda kalırken, println() bir alt satıra atlıyordu. Demek ki, print() ifadesinde, içindeki yazının sonuna \n eklersek, elimizde bir nevi println() olmuş olacak.

Şimdilik bu kadar. Sormak istediğiniz soru olursa yorumlarınızı bekliyorum. Sonraki yazıda Java'daki operatörleri anlamaya çalışacağız. Böylece biraz da olsa eğlenceli şeyler yazabilecek hale geleceğiz.

2 yorum:

  1. Bir önceki ders tamam fakat bu sanki 10 sayfa ileriye bakıyor gibi hissettim :(

    YanıtlaSil
  2. Emek için teşekkürler.

    YanıtlaSil