← Kursa Dön
📄 Text · 12 min

OOP Nedir? Neden OOP?

Giriş

Şimdiye kadar yazdığın kodlar prosedürel (procedural) tarzdaydı. Bir main metodu, birkaç değişken, birkaç döngü, birkaç metot — yukarıdan aşağıya çalışan kod. Küçük programlar için bu yeterli. Ama program büyüdükçe bu yaklaşım dağılmaya başlar.

Düşün: 50.000 satırlık bir programda tüm kodun tek bir dosyada, metotlar arası değişkenler paylaşılıyor, her şey birbirine bağımlı... Bir yeri değiştirdiğinde 10 yer bozuluyor. Kabus.

Nesne Yönelimli Programlama (OOP — Object Oriented Programming), bu sorunu çözmek için geliştirilmiş bir programlama yaklaşımıdır. Kodu "nesneler" etrafında organize eder.

Prosedürel vs OOP

Prosedürel Yaklaşım

// Öğrenci verilerini ayrı ayrı dizilerde tutuyoruz
String[] isimler = {"Ali", "Ayse", "Mehmet"};
int[] yaslar = {20, 22, 21};
double[] notOrtalamasi = {3.5, 3.8, 2.9};

// Her işlem için ayrı fonksiyon
static void yazdir(String[] isimler, int[] yaslar, double[] notlar) {
    for (int i = 0; i < isimler.length; i++) {
        System.out.println(isimler[i] + " - " + yaslar[i] + " - " + notlar[i]);
    }
}

Sorunlar:

  • Veriler dağınık — bir öğrencinin tüm bilgilerini bulmak için 3 farklı diziye bakıyorsun

  • İndeksler senkronize olmalı — isimler[2] ile notlar[2]'nin aynı öğrenciye ait olduğunu sen takip ediyorsun

  • Yeni özellik eklenmesi zor — "telefon numarası" eklemek istersen yeni dizi aç, tüm fonksiyonları güncelle

OOP Yaklaşımı

class Ogrenci {
    String isim;
    int yas;
    double notOrtalamasi;

    void yazdir() {
        System.out.println(isim + " - " + yas + " - " + notOrtalamasi);
    }
}

// Kullanım
Ogrenci ali = new Ogrenci();
ali.isim = "Ali";
ali.yas = 20;
ali.notOrtalamasi = 3.5;
ali.yazdir();

Burada bir öğrencinin tüm bilgileri tek bir yerde. Yeni özellik eklemek kolay. Veriler ve onlar üzerinde çalışan metotlar bir arada.

Gerçek Dünya Analojisi

OOP'u anlamanın en iyi yolu gerçek dünyaya bakmak. Çünkü OOP, gerçek dünyayı modellemeye çalışır.

Etrafına bak. Ne görüyorsun? Nesneler: telefon, masa, sandalye, araba, insan...

Her nesnenin iki şeyi var:

  1. Özellikleri (attributes/fields) — renk, boyut, marka

  2. Davranışları (behaviors/methods) — çalışmak, durmak, ses çıkarmak

Bir araba düşün:

  • Özellikleri: renk, marka, model, hız, yakıt seviyesi

  • Davranışları: çalıştır, dur, hızlan, yavaşla

Programlamada da aynısını yapıyoruz:

class Araba {
    // Özellikler (fields)
    String marka;
    String renk;
    int hiz;

    // Davranışlar (methods)
    void hizlan() {
        hiz += 10;
    }

    void yavasla() {
        hiz -= 10;
    }

    void bilgiGoster() {
        System.out.println(marka + " " + renk + " - Hız: " + hiz);
    }
}

Sınıf (Class) ve Nesne (Object)

OOP'un iki temel kavramı:

Sınıf (Class) = Şablon, kalıp, blueprint Nesne (Object) = O şablondan üretilen somut şey

Bunu bir kurabiye kalıbı gibi düşün. Kalıp (class) tek, ama ondan istediğin kadar kurabiye (object) basabilirsin. Her kurabiye aynı şekle sahip ama farklı süslemeleri (değerleri) olabilir.

// Sınıf (şablon) — bellekte yer kaplamaz
class Telefon {
    String marka;
    int batarya;
}

// Nesneler (somut örnekler) — bellekte yer kaplar
Telefon benim = new Telefon();
benim.marka = "Samsung";
benim.batarya = 85;

Telefon senin = new Telefon();
senin.marka = "Apple";
senin.batarya = 42;

benim ve senin iki farklı nesne. Aynı sınıftan (Telefon) türetildiler ama farklı değerlere sahipler.

OOP'un 4 Temel Prensibi

OOP 4 temel prensip üzerine kuruludur. Bu derste tanıtıyoruz, sonraki derslerde detaylı işleyeceğiz.

1. Encapsulation (Kapsülleme)

Verileri gizle, dışarıdan erişimi kontrol et.

Bir araba motoru düşün. Sen direksiyonu çeviriyorsun, gaza basıyorsun — ama motorun iç mekanizmasını bilmiyorsun ve bilmene gerek yok. Motor "kapsüllenmiş" durumda.

class BankaHesabi {
    private double bakiye;  // dışarıdan erişilemez

    public void paraYatir(double miktar) {
        if (miktar > 0) {
            bakiye += miktar;  // kontrollü erişim
        }
    }

    public double getBakiye() {
        return bakiye;  // sadece okuma izni
    }
}

Bakiyeyi private yaparak dışarıdan birinin direkt değiştirmesini engelliyoruz. Para yatırma işlemi metot üzerinden ve kontrollü yapılıyor.

2. Inheritance (Kalıtım)

Bir sınıf başka bir sınıfın özelliklerini miras alır.

Aile gibi düşün. Çocuk, ebeveyninin bazı özelliklerini miras alır (göz rengi, boy gibi) ama kendine has özellikleri de olabilir.

class Hayvan {
    String isim;
    void nefesAl() {
        System.out.println(isim + " nefes alıyor");
    }
}

class Kedi extends Hayvan {
    void miyavla() {
        System.out.println(isim + " miyavlıyor");
    }
}

Kedi, Hayvan'ın isim ve nefesAl() özelliklerini miras alıyor + kendi miyavla() metodunu ekliyor.

3. Polymorphism (Çok Biçimlilik)

Aynı isimli metot farklı sınıflarda farklı davranabilir.

Ses çıkarmak düşün. Kedi miyavlar, köpek havlar, kuş cıvıldar. Hepsi "ses çıkarıyor" ama her biri farklı şekilde.

class Hayvan {
    void sesCikar() {
        System.out.println("...");
    }
}

class Kedi extends Hayvan {
    void sesCikar() {
        System.out.println("Miyav!");
    }
}

class Kopek extends Hayvan {
    void sesCikar() {
        System.out.println("Hav hav!");
    }
}

4. Abstraction (Soyutlama)

Karmaşık detayları gizle, sadece gerekli olanı göster.

Televizyon kumandası düşün. Kanal değiştir, ses aç/kapa — basit. Arka planda sinyal işleme, frekans ayarı falan var ama sen bunları bilmiyorsun. Kumanda sana soyut bir arayüz sunuyor.

// Kullanıcı sadece bunu görür:
tv.kanalDegistir(5);
tv.sesAc();

// Arka planda ne olduğu kullanıcıyı ilgilendirmez

Bu 4 prensibi ilerleyen derslerde detaylıca işleyeceğiz. Şimdilik isimlerini ve temel mantıklarını bilmen yeterli.

OOP'un Avantajları

1. Modülerlik

Her sınıf bağımsız bir modül. Araba sınıfını değiştirmek Telefon sınıfını etkilemez.

2. Tekrar Kullanılabilirlik

Kalıtım sayesinde bir kez yazılan kod başka sınıflarda tekrar kullanılabilir.

3. Bakım Kolaylığı

Bir hatayı düzeltmek için sadece ilgili sınıfa gidersin. Tüm kodu aramana gerek yok.

4. Gerçek Dünya Modelleme

Kod, iş dünyasındaki kavramları doğrudan temsil eder: Musteri, Siparis, Urun...

5. Ekip Çalışması

Herkes farklı sınıflar üzerinde çalışabilir. Ali Araba sınıfını yazarken, Ayşe Motor sınıfını yazabilir.

OOP'un Dezavantajları

Hiçbir yaklaşım mükemmel değil:

  • Daha fazla kod: Basit işler için bile sınıf, constructor, getter/setter yazmak gerekebilir

  • Öğrenme eğrisi: Prosedürel programlamadan daha karmaşık kavramlar

  • Performans: Nesne oluşturma ve metot çağrıları ek maliyet getirir (çoğu durumda ihmal edilebilir)

Ama avantajları dezavantajlarını ezici çoğunlukla geçer. Bu yüzden Java, C#, Python gibi modern diller OOP'u temel alır.

Java ve OOP

Java nesne yönelimli bir dildir. Java'da her şey (neredeyse) bir nesnedir.

String s = "Merhaba";  // String bir nesne
int[] dizi = {1, 2, 3}; // dizi bir nesne
Scanner sc = new Scanner(System.in); // Scanner bir nesne

Primitive tipler (int, double, boolean, vs.) nesne değildir — bu Java'nın OOP'dan tek sapması.

Şimdiye kadar aslında OOP kullanıyordun, farkında değildin:

  • Scanner bir sınıf, sc bir nesne

  • sc.nextInt() bir metot çağrısı

  • System.out bir nesne, println() onun bir metodu

Basit Bir OOP Örneği

class Kitap {
    String baslik;
    String yazar;
    int sayfaSayisi;
    boolean okundu;

    void bilgiGoster() {
        System.out.println("\"" + baslik + "\" - " + yazar);
        System.out.println("Sayfa: " + sayfaSayisi);
        System.out.println("Okundu mu: " + (okundu ? "Evet" : "Hayır"));
    }

    void oku() {
        okundu = true;
        System.out.println(baslik + " okundu olarak işaretlendi.");
    }
}

public class Main {
    public static void main(String[] args) {
        Kitap k1 = new Kitap();
        k1.baslik = "Clean Code";
        k1.yazar = "Robert C. Martin";
        k1.sayfaSayisi = 464;

        Kitap k2 = new Kitap();
        k2.baslik = "Effective Java";
        k2.yazar = "Joshua Bloch";
        k2.sayfaSayisi = 416;

        k1.bilgiGoster();
        System.out.println();
        k2.bilgiGoster();

        k1.oku();
        k1.bilgiGoster();
    }
}

İki farklı Kitap nesnesi, farklı değerler, aynı davranışlar. OOP'un özü budur.

OOP Terminolojisi

İleriki dersler için bilmen gereken terimler:

TerimAçıklama
Class (Sınıf)Nesne şablonu, blueprint
Object (Nesne)Sınıftan oluşturulan somut örnek
Field (Alan)Nesnenin özelliği (değişken)
Method (Metot)Nesnenin davranışı (fonksiyon)
Instance (Örnek)Object ile aynı anlam
InstantiationSınıftan nesne oluşturma (new)
ConstructorNesne oluşturulurken çağrılan özel metot
EncapsulationVeri gizleme ve kontrollü erişim
InheritanceSınıflar arası miras
PolymorphismÇok biçimlilik
AbstractionSoyutlama

💡 İpucu: Bu terimleri Türkçe'sini de İngilizce'sini de bil. Türkçe kaynaklarda Türkçe, mülakatlarda ve dökümantasyonda İngilizce geçer.

Özet

  • OOP kodu nesneler etrafında organize eden bir programlama yaklaşımıdır

  • Sınıf şablondur (kurabiye kalıbı), nesne o şablondan üretilen somut örnektir (kurabiye)

  • OOP'un 4 prensibi: Encapsulation, Inheritance, Polymorphism, Abstraction

  • Prosedürel yaklaşıma göre daha modüler, bakımı kolay ve gerçek dünyayı modellemede doğal

  • Java nesne yönelimli bir dildir — Scanner, String, System.out gibi yapılar zaten OOP

  • Sonraki derslerde sınıf tanımlama, constructor, encapsulation gibi konulara dalacağız