Merhabalar, bugün ki dersimizde, Java programlama dilinde veri tipi dönüşümlerinin nasıl olduğunu inceleyeceğiz. Çeşitli örneklerle bu konuyu pekiştireceğiz. Öncelikle derse başlamadan önce veri tipleri arasında dönüşümün nasıl yapıldığını düşünelim. Örneğin byte veri tipinden int veri tipine dönüşüm yaparken, Java programlama dili nasıl bir yol izleyerek bu işlemi tamamlıyor? Bu sorunun cevabını düşünmeye başlayabilirsiniz. Ya da ben cevaplayayım. Bir önceki dersimizde veri tiplerini tanımlarken, bellekte yer kapladığını ve kapladığı yerlerin boyutu hakkında bilgi vermiştik. Veri dönüşümleri yapılırken bellekte tutulan alanlar yer değiştirir. Fakat örneğin int veri tipi ile, byte veri tipini düşünelim. byte veri tipi, int veri tipine göre bellekte daha az yer kaplamakta. Bu ikisini dönüştürürken bir sıkıntı yaşayabiliriz. byte bir veriyi, int bir veri tipine dönüştürürken, az boyut kaplayandan çok boyut kaplayana geçeceği için mantıken bir sıkıntı çıkmaması gerekir. Evet, zaten bir sıkıntı çıkmazda. Fakat bu işlemin tam tersinde, bir sıkıntı çıkabilmektedir. Yani byte veri tipi aralığında olmayan bir int değişkeni tanımlandıysa ve byte veri tipine dönüştürülüyorsa bir hata oluşacaktır. Şimdi bu olayı örneklemek adına aşağıdaki komutları inceleyelim.
[java] public class VeriTipiDonusumleri {
byte byteSayisi; //short veri tipinde bir değişken tanımladık.
int intSayisi;
public static void main(String[] args) {
VeriTipiDonusumleri veriTipiDonusumleri = new VeriTipiDonusumleri();
veriTipiDonusumleri.byteSayisi = 128; // maksimum 127 olabilmekte. Fakat burada
//hata verir. Çünkü maksimum değerden yüksek bir değer verdik
veriTipiDonusumleri.intSayisi = veriTipiDonusumleri.byteSayisi;
}
}
[/java]
Üstteki komutları ve console çıktısını incelediğimiz zaman, verdiğimiz örnekteki problemi anlayabiliyoruz. Eğer bu durumun tam tersini yapsaydık yani byte olarak atadığımız değeri, int veri tipine dönüştürseydik hata almazdık. Ya da belirtilen alanlarda bir byte değeri atasaydık ve bunu int veri tipine dönüştürseydik yine hata almazdık. Şimdi üstte anlattığım bellek transferi olayını iyice kavrayabilmek için aşağıdaki komutları inceleyelim.
[java] public class VeriTipiDonusumleri {
byte byteSayisi; //short veri tipinde bir değişken tanımladık.
int intSayisi;
public static void main(String[] args) {
VeriTipiDonusumleri veriTipiDonusumleri = new VeriTipiDonusumleri();
veriTipiDonusumleri.byteSayisi = (byte) 128; // cast işlemi yapıyoruz.
// Cast işlemi, parantez içerisinde girilen veri tipine dönüştürür
System.out.println(veriTipiDonusumleri.byteSayisi);
}
}
[/java]
Üstteki örneği incelediğimizde, 128 değerini atadık fakat ekran çıktısında, -128 değerini verdi. Sizce neden olabilir? Çünkü byte veri tipinin maksimum alabileceği değer 127 idi. Biz 128 değerini verip bunu cast işlemine soktuğumuz zaman, bellekteki yer bittiğinden, bellekteki en baştaki adreste tutulan veriye geçiyor. Bu yüzden -128 değerini bize veriyor. Peki bu mantıkla 129 değerini byte veri tipi olarak atasaydık ve cast işlemi yapsaydık bunu ekrana yazdırdığımız zaman -127 değerini verecektir. Deneyin ve görün. Umarım bu mantığı anlamışsınızdır. Eğer anlamadıysanız kendiniz deneyerek bu dediklerimi rahatlıkla anlayabilirsiniz.
String – int ve int-String Çevrimi
[java] public class VeriTipiDonusumleri {
public static void main(String[] args) {
String stringSayisi = "10"; // String ataması yaptık
System.out.println("Integer.parseInt(stringSayisi) := "+Integer.parseInt(stringSayisi));
//üstteki komut, int türünde döndüğü için daha hızlı çalışır(temel veri tipi döndüğü için)
System.out.println("Integer.valueOf(stringSayisi) := "+Integer.valueOf(stringSayisi));
//üstteki komut Integer tipinde nesne döndüğü için parseInt metoduna göre yavaştır.
}
}
[/java]
Evet… Üstteki komutları incelediğimiz zaman, yaptığımız bu çevrimin metotlar aracılığı ile olduğunu görmüş olduk. parseInt metodunun valueOf metoduna göre daha hızlı çalışma sebebinin, döndürdüğü veri tipi olduğunu anlamış olduk. Şimdi ise bu çevrimin tam tersini yani int bir veri tipini, String e çevirmeyi inceleyelim.
[java] public class VeriTipiDonusumleri {
public static void main(String[] args) {
int intSayisi = 10; // int ataması yaptık
System.out.println("Integer.toString(intSayisi) := "+Integer.toString(intSayisi));
System.out.println("String.valueOf(intSayisi) := "+String.valueOf(intSayisi));
}
}
[/java]
Üstte göreceğiniz üzere, iki farkı metotla bu çevrimi gerçekleştirebiliyoruz. Java da tip dönüşümlerinin çok kolay olduğunu söyleyebiliriz.
double-int ve int-double Çevrimi
[java] public class VeriTipiDonusumleri {
public static void main(String[] args) {
// double-int çevrimi
double doubleSayisi = 5.6;
int intSayisi = (int) doubleSayisi; // cast işlemi yaptık.
// Fakat int veri tipi aralığında değil. Bu yüzden virgüllü kısmı atarak
// 5 çıktısını verecektir
System.out.println("intSayisi = " + intSayisi); // 5 çıktısını verir
// — double-int çevrimi
}
}
[/java]
Üstteki komutu izledikten sonra, bu işlemin tam tersi olan int-double çevrimini inceleyelim.
[java] public class VeriTipiDonusumleri {public static void main(String[] args) {
// int-double çevrimi
int intSayisi = 5;
double doubleSayisi = (double) intSayisi; // cast işlemi yaptık.
// double veri tipine uygun bir şekilde cast edeceği için 5.0 değerini yazar
System.out.println("intSayisi = " + doubleSayisi); // 5.0 çıktısını verir
// — int-double çevrimi
}
}
[/java]
Evet… Üstteki komutları inceledikten sonra, diğer tip dönüşümlerinin de aynı mantıkla yapılabileceğini söyleyebiliriz. Diğer tip dönüşümlerine örnek verme amacıyla aşağıdaki komutları inceleyebilirsiniz.
[java] public class VeriTipiDonusumleri {public static void main(String[] args) {
//float-int çevrimi
float f = 15.5f;
int i = (int)f;
//–float-int çevrimi
//String-float çevrimi
String s ="5";
f = Float.parseFloat(s); // tabiki bu daha hızlı. Sebebi primitif veri tipi döner. Yani int döner
f = Float.valueOf(f); // tabiki bu daha yavaş. Sebebi nesne döner. Yani Integer döner
//–String-float çevrimi
//float-long çevrimi
float floatSayi = 12.12f;
long longSayi = (long) floatSayi;
//–float-long çevrimi
//String-double çevrimi
String stringSayi = "12.12d";
double doubleSayi1 = Double.valueOf(stringSayi);
double doubleSayi2 = Double.parseDouble(stringSayi);
//–String-double çevrimi
}
}
[/java]
Umarım veri tipi çevrimlerini anlamışsınızdır. Eğer anlamadıysanız, yorum kısmına anlamadığınız noktaları belirtirseniz yardımcı olmaya çalışırım. Okuduğunuz için çok teşekkür ederim. Bir sonraki derste görüşmek üzere.
basarili bir yazi olmus
teşekkürler Furkan Bey