Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`
Dizi · 6/64 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ş)
- Bölüm 3 — Konu 10: Aritmetik, Atama, Karşılaştırma, Mantıksal Operatörler
- Bölüm 3 — Konu 11: `if / else if / else`
- Bölüm 3 — Konu 12: `switch` / `switch expression` (Modern Dart)
- Bölüm 3 — Konu 13: Ternary Operatör, `??`, `??=`, `?.`
- Bölüm 3 — Konu 14: `for`, `while`, `do-while` Döngüleri
- Bölüm 4 — Konu 16: `List` — Oluşturma, Erişim, Temel Metodlar
- Bölüm 4 — Konu 17: `Set` — Benzersiz Eleman Mantığı
- Bölüm 4 — Konu 18: `Map` — Key-Value Yapılar
- Bölüm 4 — Konu 19: Koleksiyon Üzerinde `for-in`, `forEach`
- Bölüm 4 — Konu 20: Spread Operatörü (`...`, `...?`) ve Collection If/For
- Bölüm 5 — Konu 21: Fonksiyon Tanımlama, Parametreler (Positional, Named, Optional)
- Bölüm 5 — Konu 22: Varsayılan Parametre Değerleri (Derinlemesine)
- Bölüm 5 — Konu 23: Arrow Function (`=>`) Sözdizimi
- Bölüm 5 — Konu 24: Fonksiyonlar Birinci Sınıf Vatandaş — Değişkene Atama, Parametre Olarak Geçme
- Bölüm 5 — Konu 25: Anonim Fonksiyonlar ve Closure Kavramı (Derinlemesine)
- Bölüm 5 — Konu 26: Recursion (Özyineleme)
- Bölüm 6 — Konu 27: Class Tanımlama, Constructor (Varsayılan, Named, Factory)
- Bölüm 6 — Konu 28: Alanlar (Fields), Metodlar, `this` Kullanımı (Derinlemesine)
- Bölüm 6 — Konu 29: Initializer List, Constructor Kısayolları (Derinlemesine)
- Bölüm 6 — Konu 30: Getter / Setter
- Bölüm 6 — Konu 31: Statik Üyeler (`static`)
- Bölüm 7 — Konu 32: Kalıtım (`extends`), `super` Kullanımı
- Bölüm 7 — Konu 33: Metod Override Etme, `@override`
- Bölüm 7 — Konu 34: Soyut Sınıflar (`abstract class`)
- Bölüm 7 — Konu 35: Interface Mantığı (`implements`)
- Bölüm 7 — Konu 36: Mixin (`with`)
- Bölüm 7 — Konu 37: `enum` — Basit ve Gelişmiş (Metotlu Enum'lar)
- Bölüm 8 — Konu 38: `try / catch / finally`, `throw`
- Bölüm 8 — Konu 39: Özel Exception Sınıfları Yazma
- Bölüm 8 — Konu 40: Sound Null Safety Derinlemesine — `late`, `required`, Non-Nullable Varsayılan Davranış
- Bölüm 8 — Konu 41: `assert` ile Geliştirme Zamanı Kontrolleri
- Bölüm 9 — Konu 42: Generic Sınıflar ve Fonksiyonlar
- Bölüm 9 — Konu 43: Generic Sınırlamalar (`<T extends ...>`)
- Bölüm 9 — Konu 44: Dart'ın Built-in Generic Koleksiyonları Nasıl Çalışır
- Bölüm 10 — Konu 45: `Future` Kavramı, `async`/`await`
- Bölüm 10 — Konu 46: `Future.then`, Hata Yönetimi (`catchError`)
- Bölüm 10 — Konu 47: `Stream` Temelleri, `async*`, `yield`
- Bölüm 10 — Konu 48: `StreamController`, Broadcast Stream
- Bölüm 11 — Konu 49: `map`, `where`, `reduce`, `fold`
- Bölüm 11 — Konu 50: `sort`, Custom Comparator ile Sıralama
- Bölüm 11 — Konu 51: Iterable Kavramı Derinlemesine (Lazy Evaluation)
- Bölüm 11 — Konu 52: Cascade Notasyonu (`..`)
- Bölüm 12 — Konu 53: `pubspec.yaml`, pub.dev'den Paket Ekleme
- Bölüm 12 — Konu 54: Kütüphane Oluşturma, `import`/`export`, `part`/`part of`
- Bölüm 12 — Konu 55: Dart'ta Test Yazımı (`test` Paketi, Unit Test Mantığı)
- Bölüm 12 — Konu 56: Extension Methods
- Bölüm 12 — Konu 57: Dart'ın Derleme Modelleri (JIT vs AOT) ve Bunun Flutter'a Etkisi
- Bölüm 13 — Konu 59: Dart 3 Pattern Matching — Records, Destructuring, Sealed Classes, Exhaustive Switch
- Bölüm 13 — Konu 60: `Never` Tipi, `covariant` ve Generic Variance Detayları
- Bölüm 13 — Konu 61: Event Loop Derinlemesine — Microtask Queue vs Event Queue
- Bölüm 13 — Konu 62: Memory Model & Performans — Garbage Collection, `const` Nesnelerin Bellek Avantajı
- Bölüm 13 — Konu 63: Isolate'ler Arası Mesajlaşmanın Maliyeti ve `compute()`'un İç İşleyişi
- Bölüm 13 — Konu 64: FFI (Foreign Function Interface) — C Koduna Erişim
- Bölüm 13 — Konu 65: Sunucu Tarafında Dart — `dart:io`, `shelf` Paketiyle Basit Bir Backend/CLI Aracı Yazma
- Bölüm 13 — Konu 66: Derleyici & Analiz Araçları — `dart analyze`, Custom Lint Kuralları, `build_runner` Mimarisi
İçindekiler 8 başlık
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