Eğitim Portalı/Java/Java vs C++
Java01-java/83-java-vs-cpp

Java vs C++

Java, 1990'larda büyük ölçüde C++'ın karmaşıklığına ve tehlikelerine bir yanıt olarak tasarlandı. C++'ın C-benzeri sözdizimini ve nesne yönelimli yapısını korurken; elle bellek yönetimi, işaretçiler ve çoklu kalıtım g…

Java vs C++

Java, 1990'larda büyük ölçüde C++'ın karmaşıklığına ve tehlikelerine bir yanıt olarak tasarlandı. C++'ın C-benzeri sözdizimini ve nesne yönelimli yapısını korurken; elle bellek yönetimi, işaretçiler ve çoklu kalıtım gibi "ayağına sıkma" risklerini ortadan kaldırdı. İki dili karşılaştırmak, Java'nın neden bu kadar yaygın (özellikle kurumsal/sunucu tarafı) olduğunu ve tasarım felsefesini anlamanı sağlar.

Temel felsefe farkı

  • C++: Maksimum kontrol ve performans. Donanıma yakın, elle bellek yönetimi, "sıfır maliyet soyutlamaları". Güçlü ama hata yapması kolay.
  • Java: Güvenlik, taşınabilirlik ve üretkenlik. Yönetilen (managed) çalışma zamanı (JVM), çöp toplayıcı, güçlü tip ve bellek güvenliği. "Bir kez yaz, her yerde çalıştır."

Bellek ve güvenlik

C++Java
Bellek yönetimiElle (new/delete, malloc/free)Otomatik (Garbage Collector)
İşaretçilerVar (işaretçi aritmetiği)Yok (yalnızca referanslar)
Dizi sınır denetimiYok (tanımsız davranış)Var (ArrayIndexOutOfBoundsException)
null erişimiÇökme/segfault olabilirKontrollü NullPointerException
Bellek sızıntısıKolay (unutulan delete)Nadir (GC), ama mümkün (tutulan referans)

Örnek 1 (./Ornek1.java) bu güvenlik özelliklerini çalışan kanıtla gösterir: dizi sınır denetimi exception atar, delete/free yoktur, null erişimi kontrollü hata verir (segfault değil).

Nesne modeli

C++Java
KalıtımÇoklu sınıf kalıtımı ("elmas problemi")Tek sınıf + çoklu interface
Operatör aşırı yüklemeVar (operator+)Yok (yalnızca + sayı/String)
Serbest fonksiyonVar (global)Yok (her şey sınıf içinde; statik metot)
Header/.cpp ayrımıVarYok (tek dosya, JVM derler/yükler)
Şablonlar/jeneriklerTemplate (derleme zamanı, güçlü)Generics (tip silme/erasure ile)

Örnek 2 (./Ornek2.java) tek kalıtım + çoklu interface'i, operatör aşırı yüklemenin yokluğunu (toplama için metot yazılır) ve "her şey sınıf içinde" ilkesini gösterir.

Performans

  • C++: Doğrudan makine koduna derlenir; dikkatli yazılırsa en yüksek ham performans ve öngörülebilir gecikme (gerçek zamanlı sistemler, oyun motorları, sürücüler).
  • Java: JIT derleyici sayesinde çoğu sunucu yükünde C++'a yakın performans verir; ama JVM başlangıç süresi ve GC duraklamaları vardır. Üretkenlik ve güvenlik avantajı çoğu uygulamada bu farkı önemsiz kılar.

Hangisi ne için?

  • C++: İşletim sistemleri, gömülü/gerçek-zamanlı sistemler, oyun motorları, yüksek frekanslı ticaret, donanıma yakın performans-kritik kod.
  • Java: Kurumsal/sunucu uygulamaları, web backend'leri (Spring), Android (tarihsel), büyük ekipli uzun ömürlü projeler, taşınabilirlik ve bakım kolaylığı önemli olan her yer.

Özet

Java'nın C++'a kıyasla güvenlik ve taşınabilirliği önceleyen tasarımını öğrendik: otomatik bellek (GC), işaretçi yokluğu, dizi sınır denetimi ve kontrollü null (Örnek 1); tek kalıtım + çoklu interface, operatör aşırı yüklemesinin olmayışı ve "her şey sınıf içinde" nesne modeli (Örnek 2); performans dengelerini ve kullanım alanlarını gördük. Sırada, Java'nın "her yerde çalış" sözünü mümkün kılan motor: JVM mimarisi.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Java'nın güvenlik modeli — C++'tan farklı davranan noktalar (çalışan kanıt).
2// Çalıştırma: java Ornek1.java
3public class Ornek1 {
4
5    public static void main(String[] args) {
6        // 1) DİZİ SINIR DENETİMİ: Java sınır aşımını YAKALAR (exception). C++'ta bu tanımsız davranıştır (UB).
7        int[] dizi = { 10, 20, 30 };
8        try {
9            int x = dizi[5]; // sınır dışı
10            System.out.println(x);
11        } catch (ArrayIndexOutOfBoundsException e) {
12            System.out.println("Dizi sınır denetimi: yakalandı -> " + e.getMessage());
13            System.out.println("  (C++'ta bu sessizce bozuk belleğe erişirdi - UB)");
14        }
15
16        // 2) OTOMATİK BELLEK: 'new' var ama 'delete/free' YOK. Çöp toplayıcı (GC) halleder.
17        for (int i = 0; i < 1000; i++) {
18            String gecici = new String("nesne-" + i); // serbest bırakmaya gerek yok
19        }
20        System.out.println("\nOtomatik bellek: 1000 nesne yaratıldı, delete/free YOK (GC toplar).");
21
22        // 3) REFERANSLAR, İŞARETÇİ DEĞİL: işaretçi aritmetiği yok; null güvenli kontrol edilir.
23        String s = null;
24        try {
25            s.length(); // null referansa erişim -> kontrollü exception (segfault değil)
26        } catch (NullPointerException e) {
27            System.out.println("\nnull erişimi: NullPointerException (C++'ta çökme/segfault olabilirdi)");
28        }
29
30        System.out.println("""
31
32                --- Java vs C++: güvenlik modeli ---
33                Java, C++'a kıyasla GÜVENLİĞİ önceler:
34                  - Dizi sınır denetimi: aşım exception atar (C++: tanımsız davranış/bozuk bellek).
35                  - Otomatik bellek (GC): new var, delete/free yok (C++: elle yönetim -> sızıntı/çökme riski).
36                  - Referanslar (işaretçi aritmetiği yok): bellek bozma ve segfault'lar engellenir.
37                Bedeli: C++ donanıma daha yakın ve (dikkatli yazılırsa) daha hızlı olabilir; Java taşınabilir ve güvenlidir.""");
38    }
39}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Java vs C++ — nesne modeli farkları (tek kalıtım + interface, operatör aşırı yükleme yok).
2// Çalıştırma: java Ornek2.java
3public class Ornek2 {
4
5    // Java: TEK sınıf kalıtımı, ama ÇOKLU interface uygulanabilir (C++ çoklu kalıtıma izin verir).
6    interface Yuzebilir { default String yuz() { return "yüzüyor"; } }
7    interface Ucabilir { default String uc() { return "uçuyor"; } }
8
9    static class Hayvan { String ad; Hayvan(String ad) { this.ad = ad; } }
10
11    // Bir üst sınıf + birden çok interface (C++ tarzı çoklu kalıtımın güvenli karşılığı)
12    static class Ordek extends Hayvan implements Yuzebilir, Ucabilir {
13        Ordek() { super("Ördek"); }
14    }
15
16    public static void main(String[] args) {
17        Ordek o = new Ordek();
18        System.out.println(o.ad + ": " + o.yuz() + ", " + o.uc());
19
20        // Java: operatör aşırı yükleme YOK. '+' yalnızca sayı ve String için (dilin sabiti).
21        // İki nesneyi toplamak istersen METOT yazarsın (C++'ta operator+ tanımlanabilir).
22        Para a = new Para(1050), b = new Para(500);
23        Para toplam = a.ekle(b);          // a + b DEĞİL; .ekle(b)
24        System.out.println("Para toplama (metotla): " + toplam);
25
26        // Java: serbest fonksiyon yok; HER ŞEY bir sınıfın içinde (statik metot). C++'ta global fonksiyon olabilir.
27        System.out.println("Statik yardımcı: " + topla(3, 4));
28
29        System.out.println("""
30
31                --- Java vs C++: nesne modeli ---
32                - Kalıtım: Java TEK sınıf kalıtımı + çoklu INTERFACE (C++ çoklu sınıf kalıtımı -> 'elmas problemi').
33                - Operatör aşırı yükleme: Java'da YOK (yalnızca + sayı/String). C++'ta operator+ vb. tanımlanabilir.
34                - Her şey sınıf içinde: Java'da serbest (global) fonksiyon yok; statik metotlar kullanılır.
35                - Header/cpp ayrımı yok, çoklu dosya derleme JVM'e bırakılmış; bellek modeli yönetilen (managed).
36                Felsefe: Java sadelik+güvenlik+taşınabilirlik; C++ esneklik+düşük seviye kontrol+ham performans.""");
37    }
38
39    record Para(long kurus) {
40        Para ekle(Para d) { return new Para(this.kurus + d.kurus); }
41        @Override public String toString() { return (kurus / 100.0) + " TL"; }
42    }
43    static int topla(int a, int b) { return a + b; }
44}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.