Mutlu Tekin
Mutlu Tekin
← Yazılar

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

3 dk okuma #dart

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