↑↓ seç · Enter aç · Esc kapat

Mutlu Tekin
Mutlu Tekin
← Yazılar

Bölüm 2 — Konu 6: Temel Tipler — `int`, `double`, `String`, `bool`

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

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:

dart
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

dart
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ı:

dart
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

dart
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:

dart
void main() {
  int a = 5;
  double b = 2.0;
  print(a + b); // 7.0 — double döner
}

double'ın da faydalı metodları var:

dart
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:

dart
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

dart
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:

dart
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:

dart
void main() {
  String mesaj = """
  Bu birden fazla
  satıra yayılan
  bir string.
  """;
  print(mesaj);
}

Faydalı String metodları:

dart
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

dart
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:

dart
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:

dart
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:

dart
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):

dart
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:

dart
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 tipi num.
  • ~/ tam sayı bölmesi yapar, / her zaman double döner.
  • String interpolation: basit değişken için $degisken, ifade için ${ifade}.
  • bool sadece true/false alı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.
  • [ ] is operatö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