Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
Dizi · 6/9 Dart Türkçe Tutorial
- Bölüm 1 — Konu 1: Dart Nedir, Nerede Kullanılır, Neden Flutter Bu Dili Seçti
- Bölüm 1 — Konu 2: Ortam Kurulumu (Dart SDK, DartPad, Terminal ile Çalıştırma)
- Bölüm 1 — Konu 3: İlk Program (`main()`, `print()`, Dosya Yapısı)
- Bölüm 1 — Konu 4: Yorum Satırları, Temel Sözdizimi Kuralları
- Bölüm 2 — Konu 5: Değişken Tanımlama — `var`, `final`, `const` Farkı
- Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
- Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme
- Bölüm 2 — Konu 8: `dynamic` ve `Object` — Ne Zaman Kullanılır, Ne Zaman Kaçınılır
- Bölüm 2 — Konu 9: Null Safety Temelleri (`?`, `!`, `late`'e Giriş)
Dart'ta Her Şey Bir Nesnedir
Konuya girmeden önemli bir felsefi noktayı belirtelim: Dart'ta sayılar, string'ler, fonksiyonlar, hatta null bile birer nesnedir (object). Java gibi dillerde int ilkel (primitive) bir tiptir, ama Dart'ta int de aslında Object'ten türeyen bir sınıftır. Bu, ileride "her şey widget'tır" (Flutter) mantığını anlamana da zemin hazırlayacak — Dart'ta zaten "her şey nesnedir" mantığı var.
Bu pratikte şu anlama geliyor: bir int değişkeninin üzerinde doğrudan metod çağırabilirsin:
void main() {
int sayi = -5;
print(sayi.abs()); // 5 — abs() metodu int sınıfının bir üyesi
}Şimdi dört temel tipi tek tek inceleyelim.
int — Tam Sayılar
void main() {
int yas = 25;
int negatifSayi = -10;
int buyukSayi = 1000000;
print(yas);
print(yas + 5); // 30
print(yas * 2); // 50
print(yas ~/ 2); // 12 — tam sayı bölmesi (integer division)
print(yas % 7); // 4 — mod (kalan)
}Dikkat: ~/ operatörü, normal / bölmesinden farklıdır — sonucu tam sayıya yuvarlayarak (küsuratı atarak) döndürür. 25 / 2 sonucu 12.5 (double) verirken, 25 ~/ 2 sonucu 12 (int) verir. Bunu bir sonraki derste operatörler konusunda daha detaylı göreceğiz.
int sınıfının bazı faydalı özellik ve metodları:
void main() {
int sayi = -7;
print(sayi.isNegative); // true
print(sayi.isEven); // false
print(sayi.abs()); // 7
print(sayi.toString()); // "-7" (String'e çevirir)
}double — Ondalıklı Sayılar
void main() {
double boy = 1.75;
double pi = 3.14159;
double negatif = -0.5;
print(boy);
print(boy + 0.25); // 2.0
}Önemli bir detay: int ve double işlemlerini karıştırdığında sonuç her zaman double olur:
void main() {
int a = 5;
double b = 2.0;
print(a + b); // 7.0 — double döner
}double'ın da faydalı metodları var:
void main() {
double sayi = 3.7;
print(sayi.round()); // 4 — en yakın tam sayıya yuvarlar
print(sayi.floor()); // 3 — aşağı yuvarlar
print(sayi.ceil()); // 4 — yukarı yuvarlar
print(sayi.toInt()); // 3 — küsuratı direkt atar
}num — İkisinin Ortak Üst Tipi
Dart'ta hem int hem double'ın ortak bir üst tipi (superclass) vardır: num. Eğer bir değişkenin tam sayı mı ondalıklı mı olacağı baştan belli değilse (ya da her ikisi de olabilecekse), num kullanılabilir:
void main() {
num deger = 10; // şu an int
deger = 10.5; // şimdi double — num buna izin verir
print(deger);
}Bunu sınıf hiyerarşisi (kalıtım) konusuna girdiğimizde (Bölüm 7) daha iyi anlayacaksın — şimdilik num'un "hem int hem double olabilir" anlamına geldiğini bil.
String — Metinler
void main() {
String tekTirnak = 'Merhaba';
String ciftTirnak = "Merhaba"; // ikisi de aynı, fark yok
print(tekTirnak);
}Dart'ta tek tırnak (') ve çift tırnak (") arasında fonksiyonel bir fark yoktur, ikisi de string tanımlamak için kullanılır. Genel pratikte tutarlı bir seçim yapıp onu kullanmak önerilir (topluluğun çoğu tek tırnağı tercih eder, ama bu tamamen stil tercihidir).
String interpolation (değişkeni string içine gömme) — Bölüm 1'de gördüğün gibi:
void main() {
String isim = "Zeynep";
int yas = 28;
print("Adım $isim, yaşım $yas"); // basit değişken
print("Yaşımın iki katı: ${yas * 2}"); // ifade (expression) için süslü parantez zorunlu
}Kural: Tek bir değişkeni yazdırırken $degisken yeterli, ama bir ifade (işlem, metod çağrısı vb.) yazdırmak istiyorsan ${ifade} şeklinde süslü parantez kullanmalısın.
Çok satırlı string'ler:
void main() {
String mesaj = """
Bu birden fazla
satıra yayılan
bir string.
""";
print(mesaj);
}Faydalı String metodları:
void main() {
String metin = " Merhaba Dünya ";
print(metin.trim()); // "Merhaba Dünya" — başta/sondaki boşlukları siler
print(metin.toUpperCase()); // " MERHABA DÜNYA "
print(metin.toLowerCase()); // " merhaba dünya "
print(metin.contains("Dünya")); // true
print(metin.replaceAll("Dünya", "Türkiye")); // " Merhaba Türkiye "
print(metin.trim().split(" ")); // [Merhaba, Dünya] — bir listeye böler
print(metin.trim().length); // 14 — karakter sayısı
}bool — Mantıksal Değerler
void main() {
bool ogrenciMi = true;
bool calisiyorMu = false;
print(ogrenciMi);
print(!ogrenciMi); // false — ! ile tersini alırsın
}bool sadece iki değer alabilir: true veya false. Genelde karşılaştırma işlemlerinin sonucu olarak karşımıza çıkar:
void main() {
int yas = 20;
bool reşitMi = yas >= 18;
print(reşitMi); // true
}Önemli: Dart'ta, C/JavaScript'in aksine, 0 veya boş string gibi değerler otomatik olarak false'a çevrilmez. Yani:
void main() {
int sayi = 0;
if (sayi) { // ❌ HATA! int, bool bekleyen yere konulamaz
print("Çalışmaz");
}
}Bu, Dart'ın güçlü tip sisteminin bir sonucu — if her zaman gerçek bir bool ifadesi bekler, "0 = false gibi davranır" gibi örtük (implicit) dönüşümlere izin vermez. Bu, birçok gizli hatayı (bug) baştan engeller.
Tip Kontrolü ve Dönüşümü
Bir değişkenin tipini kontrol etmek için is operatörü kullanılır:
void main() {
var deger = 42;
print(deger is int); // true
print(deger is String); // false
}Tipler arası dönüşüm için özel metodlar kullanılır (otomatik/örtük dönüşüm yoktur):
void main() {
String sayiMetni = "123";
int sayi = int.parse(sayiMetni); // String → int
print(sayi + 1); // 124
double ondalik = double.parse("3.14"); // String → double
print(ondalik);
int tamSayi = 99;
String metin = tamSayi.toString(); // int → String
print(metin);
}Dikkat: int.parse() geçersiz bir string ile çağrılırsa hata (FormatException) fırlatır:
void main() {
int sayi = int.parse("merhaba"); // ❌ FormatException fırlatır
}Bunu Bölüm 8'de hata yönetimi (try/catch) konusunda nasıl güvenli şekilde ele alacağımızı göreceğiz.
🎯 Bu Dersten Çıkarılması Gerekenler
- Dart'ta her şey (sayılar dahil) bir nesnedir, bu yüzden
int/doubleüzerinde doğrudan metod çağırabilirsin. int: tam sayı,double: ondalıklı sayı, ikisinin ortak üst tipinum.~/tam sayı bölmesi yapar,/her zamandoubledöner.Stringinterpolation: basit değişken için$degisken, ifade için${ifade}.boolsadecetrue/falsealır, Dart'ta örtük (implicit) bool dönüşümü yoktur.- Tip dönüşümleri açık (explicit) yapılır:
int.parse(),double.parse(),.toString().
📝 Ödevler
- [ ] Bir sayının hem normal bölmesini (
/) hem tam sayı bölmesini (~/) hem de modunu (%) hesaplayıp üçünün farkını yorumla. - [ ] Kullanıcıdan aldığını varsayacağın (elle yazacağın) bir string'i
int.parse()ile sayıya çevirip 10 ile çarp. - [ ] Bir cümledeki tüm kelimeleri büyük harfe çevirip, sonra
split(" ")ile kelimelere ayırıp kaç kelime olduğunu yazdır. - [ ]
isoperatörü ile 3 farklı değişkenin (int,String,bool) tipini kontrol eden bir program yaz. - [ ]
int.parse("abc")çağırıp ne tür bir hata aldığını gözlemle (henüz try/catch bilmiyoruz, sadece hatayı oku).
Sıradaki konu: Bölüm 2 — Konu 7: Tip Çıkarımı (Type Inference) ve Açık Tip Belirtme