Değişkenler, Veri Türleri ve Operatörler
Giriş
Öğrenme Çıktıları
Değişken tanımlamak, ilk değer vermek ve güncellemek.
İlkel türleri ve değer aralıklarını seçmek.
Atama, dönüşüm ve operatörleri doğru kullanmak.
Scanner ile girdi almak, printf ile biçimli çıktı üretmek.
Veri
Değişkenler
- Değişken, belirli türdeki bir değere bellekte ayrılmış adlı bir kutudur.
- Tanımlama tür ve adı; ilk değer atama başlangıç değerini belirtir.
- Tür, kutunun boyutunu ve içine konabilecek değerleri belirler.
- Yerel değişken kullanılmadan önce kesin olarak değer almış olmalıdır.
Veri
Temel Tür Grupları
| Grup | Örnek | Kullanım |
|---|---|---|
| Tam sayı | byte, short, int, long | Sayma ve ayrık değer |
| Ondalıklı | float, double | Ölçüm ve yaklaşık hesap |
| Karakter | char | Tek UTF-16 kod birimi |
| Mantıksal | boolean | true / false |
| Başvuru | String, dizi, sınıf | Nesneye başvuru |
Veri Türleri
İlkel Veri Türleri
| Tür | Yaklaşık kullanım | Örnek |
|---|---|---|
| byte / short | Küçük tam sayılar | byte seviye = 7; |
| int | Genel tam sayı | int adet = 42; |
| long | Büyük tam sayı | long nüfus = 8_000_000L; |
| float | Ondalıklı, düşük hassasiyet | float oran = 1.5F; |
| double | Genel ondalıklı sayı | double fiyat = 19.90; |
| char / boolean | Karakter ve mantık | char not='A'; |
Veri Türleri
Tür Boyutları (bit)
Vurgulu: varsayılan seçimler (int, double). 1 bayt = 8 bit; boyutlar her platformda aynıdır.
Veri Türleri
Tam Sayı Türü Seçimi
- int çoğu tam sayı hesabı için varsayılan seçimdir; long sabitleri L son ekiyle yazılır.
- Aralığı aşan tam sayı işlemi taşar: Java hata vermez, değer sessizce öbür uca sarar.
Integer.MAX_VALUE + 1→-2147483648.- Büyük değerler bekleniyorsa baştan long seçilir.
Veri Türleri
Ondalıklı Sayılar
- double çoğu yaklaşık hesap için varsayılan türdür; float sabiti F son eki ister.
- İkili kayan nokta bazı ondalık değerleri (0.1 gibi) tam temsil edemez.
- Para gibi kesin ondalık hesaplarda uygun sınıf (BigDecimal) ve yuvarlama kuralı seçilmelidir.
Veri Türleri
char ve boolean
- char tek tırnakla yazılır; bir UTF-16 kod birimini (sayı olarak) saklar: 'A' = 65.
- String çift tırnakla yazılan bir nesnedir; değişken nesneye başvuru tutar. char ile aynı tür değildir.
- boolean yalnızca true veya false değerini alır; 0/1 ile yer değiştirmez.
Değişkenler
Tanımlayıcı Kuralları
| Kural | Geçerli | Geçersiz |
|---|---|---|
| Harf, _ veya $ ile başlar | ogrenci1 | 1ogrenci |
| Boşluk içermez | toplamPuan | toplam puan |
| Anahtar kelime değildir | sinifNo | class |
| Tek alt çizgi ad olamaz | _değer | _ |
| Büyük-küçük harfe duyarlı | puan ve Puan | Aynı değişken sanmak |
Değişkenler
İsimlendirme
- Değişken ve metot adlarında lowerCamelCase kullanılır.
- Sınıf adları UpperCamelCase biçimindedir.
- Sabitler genellikle BÜYÜK_HARF_VE_ALT_ÇİZGİ ile adlandırılır.
- Ad, değerin rolünü açıklamalıdır: x yerine toplamPuan.
Değişkenler
Tanımlama ve İlk Değer
int yaş; // tanımlama yaş = 20; // atama double ortalama = 82.5; // birlikte final int MAKSIMUM = 100; // sabit
- Yerel değişken okunmadan önce değer almalıdır.
- final değişkene yalnızca bir kez atama yapılır.
Değişkenler · Kodu adım adım çalıştır
Değişkenler Bellekte Adım Adım
Tanımlama: int türünde yaş kutusu ayrılır ama değeri yok. Bu hâliyle okunursa derleyici hata verir.
İlk atama: sağdaki 20 değeri yaş kutusuna yazılır.
Önce sağ taraf hesaplanır: yaş + 1 → 20 + 1 → 21. Kutu henüz değişmedi.
Sonuç aynı kutuya yazılır: eski 20 silinir, yaş = 21.
double türünde ortalama tanımlanır ve aynı deyimde 82.5 atanır.
ortalama += 5, ortalama = ortalama + 5 demektir: 82.5 + 5 → 87.5.
Kutu güncellenir: ortalama = 87.5.
final sabit: 100 bir kez atanır. MAKSIMUM = 200; yazılsaydı derleme hatası olurdu.
yaş kutusu okunur ve 21 yazdırılır. Okuma değeri değiştirmez.
ortalama okunur: 87.5. Son durum: 3 kutu, 2 satır çıktı.
int yaş; // tanımlama yaş = 20; // ilk atama yaş = yaş + 1; // güncelleme double ortalama = 82.5; // tanımlama + atama ortalama += 5; // bileşik atama final int MAKSIMUM = 100; // sabit System.out.println(yaş); System.out.println(ortalama);
Veri
Atama ve Güncelleme
- Atama işleci
=önce sağ tarafı hesaplar, sonra değeri soldaki değişkene yazar. - Yeni değer değişkenin türüyle uyumlu olmalıdır.
- Bileşik atama mevcut değeri kullanarak günceller:
toplam += fiyat≡toplam = toplam + fiyat.
Başlangıç: toplam = 50, fiyat = 20.
Önce iki kutu okunur ve sağ taraf hesaplanır.
Sonuç soldaki kutuya yazılır: toplam = 70. fiyat değişmez.
Dönüşüm
Atama Uyumluluğu
- Dar türden geniş türe dönüşüm (genişletme) otomatik yapılır:
double d = 7; - Daraltma bilgi kaybı riski taşıdığı için açık dönüşüm (cast) ister.
- Dönüşüm kaynak değişkeni değiştirmez; yalnızca üretilen sonucu etkiler.
Dönüşüm
Tür Dönüşümü
int adet = 7; double geniş = adet; // 7.0 double oran = 9.8; int dar = (int) oran; // 9 int bölüm = 5 / 2; // 2 double doğru = 5.0 / 2; // 2.5
- double değerini int'e çevirmek kesir bölümünü atar.
- İşlemden sonra yapılan dönüşüm kaybolan kesri geri getirmez.
Dönüşüm · Kodu adım adım çalıştır
Tür Dönüşümü Adım Adım
adet: int kutusu (32 bit), değer 7.
Genişletme: int değer double kutuya otomatik dönüşür: 7 → 7.0. Bilgi kaybı yok.
oran: double kutusu (64 bit), değer 9.8.
Daraltma: (int) açıkça yazılmalı. Kesir atılır (yuvarlanmaz): 9.8 → 9. oran hâlâ 9.8.
5 ve 2 ikisi de int → tam sayı bölmesi: 5 / 2 = 2, kalan atılır.
5.0 double olduğu için 2 de 2.0'a genişler: 5.0 / 2.0 = 2.5.
int adet = 7; double geniş = adet; // 7.0 double oran = 9.8; int dar = (int) oran; // 9 int bölüm = 5 / 2; // 2 double doğru = 5.0 / 2; // 2.5
Dönüşüm · Kodu adım adım çalıştır
5 / 2 ile 5.0 / 2
İki işlenen de int → tam sayı bölmesi: bölüm alınır, kesir atılır.
Sonuç 2 (int) yazdırılır.
Bir işlenen double → diğeri de double'a yükseltilir (2 → 2.0). Ondalıklı bölme yapılır.
Sonuç 2.5 (double) yazdırılır.
Bir işlenen double → diğeri de double'a yükseltilir (5 → 5.0). Ondalıklı bölme yapılır.
Sonuç 2.5 (double) yazdırılır.
Tür dönüşümü /'dan önce gelir: (double) 5 → 5.0.
Bir işlenen double → diğeri de double'a yükseltilir (2 → 2.0). Ondalıklı bölme yapılır.
Sonuç 2.5 (double) yazdırılır.
Parantez içi önce: 5 / 2, ikisi de int → tam sayı bölmesi = 2. Kesir burada kaybolur.
Sonra (double) 2 → 2.0. Kaybolan .5 geri gelmez.
2.0 yazdırılır: işlemden sonra yapılan dönüşüm kesri kurtarmaz.
İki işlenen de int → kalan: 5 = 2·2 + 1.
Sonuç 1 (int) yazdırılır.
System.out.println(5 / 2); System.out.println(5.0 / 2); System.out.println(5 / 2.0); System.out.println((double) 5 / 2); System.out.println((double) (5 / 2)); System.out.println(5 % 2);
Operatörler
Aritmetik Operatörler
| İşleç | Anlam | Örnek |
|---|---|---|
| + - | Toplama / çıkarma | a + b |
| * / | Çarpma / bölme | a * b |
| % | Kalan | sayi % 2 |
| ++ -- | Bir artır / azalt | i++ |
| += -= | Bileşik atama | toplam += değer |
Operatörler
Karşılaştırma ve Mantık
| İşleç | Anlam | Örnek |
|---|---|---|
== != | Eşit / farklı | a == b |
< <= > >= | Sıra karşılaştırması | not >= 60 |
&& | İki koşul da doğru | yaş >= 18 && belgeVar |
|| | En az biri doğru | haftaSonu || tatil |
! | Mantıksal değil | !aktif |
| p | q | p && q | p || q |
|---|---|---|---|
| false | false | false | false |
| false | true | false | true |
| true | false | false | true |
| true | true | true | true |
Karşılaştırmanın sonucu her zaman boolean'dır.
Operatörler
İşlem Önceliği
- Parantez içi önce değerlendirilir; tekli
!ve tür dönüşümü de önce gelir. - Çarpma, bölme ve kalan; toplama ve çıkarmadan önce gelir.
- Karşılaştırmalar aritmetikten,
&&/||karşılaştırmadan sonra değerlendirilir. - Aynı düzeyde soldan sağa gidilir (atama hariç). Parantez niyeti görünür kılar.
Operatörler · Adım adım
İfade Ağacı: 2 + 3 * 4 > 10 && 7 % 2 == 1
Derleyici ifadeyi önceliğe göre bir ağaca dönüştürür: en alttaki işlem en önce, kök (&&) en son hesaplanır.
*, +'dan önce gelir: 3 * 4 = 12.
sonra toplama: 2 + 12 = 14.
Karşılaştırma: 14 > 10 → true (boolean). Sol taraf true: && sağ tarafa geçer.
sağ tarafta önce kalan: 7 % 2 = 1.
Karşılaştırma: 1 == 1 → true (boolean).
Kök: true && true → true. Sol taraf true olduğu için sağ taraf da hesaplanmak zorundaydı.
Operatörler
Kısa Devre Değerlendirme
if (metin != null && !metin.isEmpty()) {
System.out.println(metin.length());
}- && ilk koşul false ise ikinci koşulu çalıştırmaz.
- Bu davranış null değer üzerinde metot çağrısını önler.
Operatörler · Kodu adım adım çalıştır
Kısa Devre Adım Adım
metin hiçbir nesneyi göstermiyor: değeri null.
Sol koşul: metin != null → false.
Kısa devre: sol taraf false ise && sonucu kesin false; sağ taraf hiç çalışmaz. Böylece null üzerinde isEmpty() çağrılmaz (hata önlenir).
Koşul false → blok atlanır, hiçbir şey yazılmaz.
metin artık "Merhaba" nesnesini gösteriyor.
Sol koşul: metin != null → true. Sonuç henüz belli değil, sağ tarafa geçilir.
Sağ koşul: metin.isEmpty() → false, ! ile → true. true && true → true.
Bloğa girilir: metin.length() → 7 yazdırılır. Koşulların sırası ters olsaydı null durumunda program çökerdi.
String metin = null; if (metin != null && !metin.isEmpty()) { System.out.println(metin.length()); } metin = "Merhaba"; if (metin != null && !metin.isEmpty()) { System.out.println(metin.length()); }
Veri
Türler Farklı Davranır
System.out.println(2 + 3); // 5
System.out.println("2" + "3"); // 23
System.out.println("Sonuç: " + 2 + 3); // Sonuç: 23
System.out.println("Sonuç: " + (2 + 3)); // Sonuç: 5- İşleç davranışı operand türlerine bağlıdır.
- Parantez değerlendirme sırasını açıklaştırır.
Veri · Kodu adım adım çalıştır
"Sonuç: " + 2 + 3 Adım Adım
2 + 3: iki int → sayısal toplama.
Çıktı: 5.
"2" + "3": işlenenlerden biri String → birleştirme: 3 metne eklenir.
Çıktı: 23.
"Sonuç: " + 2: işlenenlerden biri String → birleştirme: 2 metne eklenir. + soldan sağa değerlendirilir: önce ilk ikisi.
"Sonuç: 2" + 3: işlenenlerden biri String → birleştirme: 3 metne eklenir.
Çıktı: Sonuç: 23. 3 de metne eklendi; 2 + 3 hiç toplanmadı.
Parantez önce: 2 + 3, iki int → toplama = 5.
Sonra "Sonuç: " + 5 → String varsa birleştirme → "Sonuç: 5".
Çıktı: Sonuç: 5. Parantez, toplamanın önce yapılmasını sağladı.
System.out.println(2 + 3); System.out.println("2" + "3"); System.out.println("Sonuç: " + 2 + 3); System.out.println("Sonuç: " + (2 + 3));
Girdi
Scanner ile Girdi
Scanner klavye = new Scanner(System.in);
System.out.print("Yaş: ");
int yaş = klavye.nextInt();
klavye.nextLine(); // satır sonunu tüket
System.out.print("Ad: ");
String ad = klavye.nextLine();- Dosyanın başında
import java.util.Scanner;gerekir. - nextInt sayıyı, nextLine tüm satırı okur.
- Farklı okuma metotları birlikte kullanılırken kalan satır sonuna dikkat edilir.
Girdi · Kodu adım adım çalıştır
Scanner Girdi Akışı Adım Adım
Scanner nesnesi klavyeye (System.in) bağlanır. Tampon boş.
print istemi yazar; satır sonu yok, imleç "Yaş: " arkasında.
nextInt() tampon boş olduğu için bekler. Kullanıcı 20 yazıp Enter'a basar: tampona "20⏎" girer.
nextInt yalnızca sayıyı (20) okur; ⏎ tamponda kalır.
nextLine() ⏎'e kadar okur: boş metin ("") döner ve ⏎ tüketilir. Tampon temizlendi.
İstem "Ad: " yazılır.
nextLine tampon boş olduğu için bekler; kullanıcı Ada Yılmaz yazar ve Enter'a basar.
nextLine tüm satırı (boşluk dahil) okur: ad = "Ada Yılmaz". ⏎ tüketilir, satıra dahil edilmez.
Scanner klavye = new Scanner(System.in); System.out.print("Yaş: "); int yaş = klavye.nextInt(); klavye.nextLine(); // satır sonunu tüket System.out.print("Ad: "); String ad = klavye.nextLine();
Girdi · Kodu adım adım çalıştır
Satır Sonu Tüketilmezse
Scanner nesnesi klavyeye (System.in) bağlanır. Tampon boş.
print istemi yazar; satır sonu yok, imleç "Yaş: " arkasında.
nextInt() tampon boş olduğu için bekler. Kullanıcı 20 yazıp Enter'a basar: tampona "20⏎" girer.
nextInt yalnızca sayıyı (20) okur; ⏎ tamponda kalır.
İstem "Ad: " yazılır.
Tamponda hâlâ ⏎ var: nextLine beklemeden boş metin döner. ad = "". Kullanıcıya ad sorulamadı!
Çıktı []: ad boş. Çözüm: nextInt'ten sonra bir klavye.nextLine(); ile ⏎'i tüketmek.
Scanner klavye = new Scanner(System.in); System.out.print("Yaş: "); int yaş = klavye.nextInt(); System.out.print("Ad: "); String ad = klavye.nextLine(); System.out.println("[" + ad + "]");
Girdi
Girdi Doğrulama
- Kullanıcının her zaman beklenen türde değer gireceği varsayılmamalıdır.
- Aralık ve iş kuralı doğrulaması tür kontrolünden sonra yapılır.
- Hata iletisi beklenen biçimi açıkça söylemeli ve yeniden deneme yolu sunmalıdır.
Çıktı
Biçimli Çıktı: printf
String ad = "Ada"; double ortalama = 87.456; System.out.printf("%-10s %6.2f%n", ad, ortalama);
%s metin · %d tam sayı · %f ondalıklı · %n platforma uygun satır sonu
Hata Ayıklama
Yaygın Hatalar
| Hata | Örnek | Ne olur? |
|---|---|---|
| = ile == karışır | if (x = 5) | Derleme hatası: int, boolean değil |
| Tam sayı bölmesi | double o = 7 / 2; | o = 3.0, 3.5 değil |
| Kapsam dışı kullanım | { int k = 1; } k++; | k blok dışında tanımsız |
| Yanlış noktalı virgül | if (x > 0); | Boş deyim: koşul hiçbir şeyi kontrol etmez |
| String ve == | s1 == s2 | İçeriği değil, başvuruyu karşılaştırır → s1.equals(s2) |
Özet
Bölüm Özeti
- Değişken, belirli türdeki bir değere anlamlı bir ad verir ve okunmadan önce değer almalıdır.
- İlkel türler farklı değer kümeleri ve bellek gereksinimleri taşır.
- Genişletme otomatik yapılır; daraltma açık dönüşüm ister ve bilgi kaybettirebilir.
- Operatör önceliği ve operand türleri ifadenin sonucunu doğrudan belirler.
- Kullanıcı girdisi hem tür hem iş kuralı açısından doğrulanmalıdır.
Özet
Kontrol Soruları
- int ve double bölmesi nasıl farklı sonuç verir?
- Daraltıcı dönüşüm neden açıkça yazılır?
- "Sonuç: " + 2 + 3 ifadesi neden Sonuç: 23 yazdırır?
- && işleci kısa devreyi nasıl kullanır?
- nextInt sonrasında nextLine kullanırken neye dikkat edilir?
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt