Bölüm 3 - Java da Programlama Yapılarının Temelleri 2
Veri Tipleri
Java "strongly typed language" yani güçlü tiplenmiş dildir, mükemmel türkçe çevirimi yaptık. Bunun anlamı şudur yani Java'da her veri tipini bir declared type yani tipini belirtmemiz zorunludur. Java da 8 tane primitive tip vardır. Bunların 4'ü integer(tamsayı) tip; 2'si floating-point (noktalı sayılar); 1 tanesi character(karakter) tipi,ki bu Unicode encoding scheme'yı kullanır; 1 tanesi de boolean type yani doğruluk değerlerini belirtir (doğru mu yanlış mı)
Integer Tipler
Java'da 4 tane integer (tamsayı) tipi vardır.
Integer Tipler
| Type | Storage Requirement | Range (inclusive) |
|---|---|---|
| byte | 1 byte | -32.768 to 32.767 |
| short | 2 byte | -128 to 127 |
| int | 4 byte | -2.147.483.648 to 2.147.483.647 |
| long | 8 byte | -9.223.372.036 to 9.223.372.036.... |
Java da integer tipinin range'si yani aralığı değişmez yani her makinede aynıdır. C/C++ gibi dillerde ise bu böyle değildir ve developer için bir platformdan diğerini yollamak hakikaten programcının başını ağrıtır. Örneğin C'de yazdığımız bir integer tipi 32-bit processorde iyi çalışırken 16-bit sistemde overflow yani taşma yapabilir.
- Long tam sayıları ise suffix olarak L yada l ile gösterilir (Örnğein : 400000L yada 400000l)
- Hexadecimal sayılar ise 0x yada 0X prefixine sahiptir (Örneğin : 0xCAFE)
- Octal sayılar ise 0 ile gösterilir (Örneğin 010 -> değeri 8'dir).
- Binary sayılar ise 0b yada 0B prefixine sahiptir (Örneğin : 0b1001 -> değeri 9'dur.)
Eğer ki sayılar çok büyük ise okunaklı olabilmesi için _ (underscore) kullanabiliriz (Örneğin : 1_000_000 yada 0b1111_0100_0010 ) Java compiler bu underscorleri bizim için silecektir.
!! Java'da C/C++ gibi dillerde bulunan unsigned versiyonu yoktur.
Floating-Point Tipler
Noktalı olan sayılardır.
Floating-Point Tipler
| Type | Storage Requirement | Range (inclusive) |
|---|---|---|
| float | 4 byte | -+3.40282347*10^38 |
| double | 8 byte | -+1.797693*10^308 |
- Float sayılar suffix olarak (f yada F ile başlarlar örneğin : 3.14F yada 3.14f)
- Double sayılar da suffix olarak D yada d belirtebiliriz zorunlu değildir defaultta doubledır zaten (3.14D yada 3.14d)
- E yada e de decimal exponent olarak kullanılır yani 10'nun katları. örneğin (1.729E3 = 1729 aynıdır).
Hexadecimal notationda, biz exponent yani üssü göstermek için p'yi kullanırız e'yi değil. Bütün Floating-point hesaplamaları IEEE 754'ü specificationunu takip eder ve onverflow hatalarını denote etmek için 3 özel kural vardır.
- Positive infinity
- Negative infinity
- NaN (Not a Number)
Not : Double.POSITIVE, Double.NEGATIVE_INFINITY ve Double.NaN (tabi aynısı Float için de geçerlidir) bu sabitler bizim için özel değerlerdir ve pratikte yok denecek kadar az kullanılır. Örneğin biz testte bunu kullanamayız.
if (x == Double.NaN){ // is never true
}
if (Double.isNaN(x)){ /// x bir sayı mı dğeil mi kontrol eder
}
UYARI : Floating-point sayılar finansal hesaplamalar için uygun değildir çünkü roundoff hatalar meydana gelebilir ve bu hatalar tolere bile edilemez. Örneğin
System.out.println(2.0 - 1.1); // 0.899999
gibi bir çıktı verir ama halbuki sonuç 0.9 olmasını beklerdik :) Tabi eğer ki daha dikkatli bir sayısal hesaplama istersek Java'da BigDecimal classını kullanmalıyız.
Char Tipi
Tek bir karakteri göstermek için çıkartılmış bir tiptir. Artık, Unicode karakterleri sadece 1 char değeri ile değil, bazıları da 2 char değeri gerektiriyor.
char tipinin değerleri tek tırnak ile gösterilir yani şöyle 'A' ve değeri de 65'tir. Tabi istersek char tipinin değerlerini hexadecimal değerler ile de gösterebiliriz tabi bunun aralığı \u0000 \uFFFF. Örneğin \u2122 bir trademark sembolüdür ve pi'nin de gösterimi \u03C0'dır.
Java da bazı escape sequences (Kaçış Karakterleri) vardır, kaçış karakterlerini örneğin yeni bir satır, paragrafın başına gelmesi gibi süreçleri yapabiliriz.
Kaçış Karakterleri
| Escape Sequence | İsim | Unicode değeri |
|---|---|---|
| \b | Backspace | \u0008 |
| \t | Tab | \u0009 |
| \n | Line feed | \u000a |
| \r | Carriage return | \u000d |
| \f | Form feed | \u000c |
| \" | Double Quote | \u0022 |
| \' | Single Quote | \u0027 |
| \ | Backslash | \u005c |
| \s | Space. Used in text block to retain trailing white space | \u0020 |
| \newline | In text blocks only: Join this line with the next | -- |
boolean Tipi
Bu tip sadece false ve true değerleri içerir. Mantıksal şartları değerlendirmek için kullanılır.
boolean trueValue = true;
boolean falseValue = false;
Değişkenler (Variables) ve Sabitler (Constants)
Variables verileri depolamak için kullanılır. Sabitler de (constants) değişkenlerdir ama bunların değeri bir defa atandıktan sonra değiştirilemezler!
Variable Declaration
Java strongly typed dil olduğu için her değişkenin bir tipi vardır. Java'da önce değişkenin tipini belirtiriz sonra da değişkenin ismini yazarız.
// Declaration
double salary;
int vacationDays;
long earthPopulation;
boolean done;
Identifier yani değişken ismi harfler,rakamlar,para birimleri, noktalama bağlaçlarından oluşabilir. Ilk harfi kesinlikle rakam olamaz! Sembol olarak '+' '©' yada space ( ) boşluk değişken içerisinde kullanılamaz. Noktalama bağlaçları olarak ise kullanabiliriz. Pratiktek çoğu programcılar şöyle kullanırlar : A-Z,a-z,0-9 ve underscore ().
İpucu : Eğer ki hangi Unicode karakterleri identifiers içerisinde kullanılabilir bunu öğrenmek için : Character sınıfının isJavaIdentifierStart yada isJavaIdentifierPart methodları kullanılabilir.
boolean b = Character.isJavaIdentifierStart(4);
System.out.println("Sonuç : "+b); // false
b = Character.isJavaIdentifierPart(4);
System.out.println("Sonuç : "+b); // true
İpucu : Java'da para birimi olan ($) dolar da bir geçerli identifier karakteri olabilir ama bu kullanılması tavsiye edilmez çünkü Java compiler (javac) tarafından üretilen class'lar içerisinde $ işareti de olabilir.
Java 9 ile birlikte artık _ (underscore) bir reserved word olmuştur.

Tek satırda da variable declaration yapabiliriz.
int i,j; // ikisi de integer tiptir.
Initializing Variables
Eğer ki bir değişkeni declare ettikten yani tanımladıktan sonra bu değişkeni kullanmak istediğimizde başlatmamız gereklidir yani buna kesinlikle bir değerin atanması lazım. Uninitialized bir değişkeni kullanamayız.
int vacationDays;
System.out.println(vacationDays); // HATA : variable not initialized
örneğin biz vacationDays isimli değişkeni initialize etmediğimiz için bunu kullanamayız hata verir, eğer ki başlatırsak:
int vacationDays;
vacationDays = 12;
Görüldüğü üzere yukarıda declare ettik ve daha sonrasında ise initialize sürecini yaptık.
İstersek tek satırda da hem declaration hemde initialization yapabiliriz.
int vacationDays = 12;
Java 10 ile birlikte gelen özelliklerden birisi de inferred type özelliği yani biz bir local variable (method içerisindeki değişken) tanımlarsak bunun tipini belirtmeden "var" keywordünü kullanarak bunu yapabiliriz.
var vacationDays = 12;
var greeting = "Hello";
Dikkat edilmesi gereken husus ise; var keywordü ile declare ettiğimiz değişkeni initialize etmek zorundayız!
Constants
Java'da bir constant'ı belirtmek için final keywordünü kullanırız.
final double CM_PER_INCH = 2.54;
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters : "
+paperWidth*CM_PER_INCH+" by "+paperHeight*CM_PER_INCH);
final buda şunu gösterir burda değişkene bir defa değeri atarız ve artık bu değer hep aynı kalır. Muhtemelen Java'da, tek bir sınıf içindeki birden fazla metodun kullanabileceği bir sabit oluşturmak daha yaygındır. Bunlara genellikle class constants denir.
public class Constants {
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args) {
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters : "
+ paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH);
}
}
Class constant görüldüğü üzere main methodunun dışında tanımlandı. Böylece bu constant, class içerisindeki diğer bütün methodlar tarafından da kullanılabilir. Ayrıca, bu constant public olarak tanımlandığı için diğer classlar da bu sabiti (Constants.CM_PER_INCH) yazarak kullanabilirler.
Enumerated Types
Bazen biz bir değişkenin değerlerini kısıtlamak isteriz. Örneğin elbise yada pizza'ları 4 boyutta sattığımızı düşünelim: small,medium,large ve extra large.
Biz bu sıralı şekilde tanımladığımız tipleri enum sabitleri olarak tanımlayabiliriz Java'da kullanım örneği :
enum Size { SMALL,MEDIUM,LARGE,EXTRA_LARGE };
eğer ki bu declare edip kullanmak istersek :
Size s = Size.MEDIUM;
şeklinde kullanabiliriz. Size tipinin bir değişkeni sadece type declarationunda belirtildiği gibi SMALL,MEDIUM... gibi değerleri tek alabiliriz veya null tek tutabilir bunun dışında herhangi bir değer alamaz.