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]ilenotlar[2]'nin aynı öğrenciye ait olduğunu sen takip ediyorsunYeni ö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:
Özellikleri (attributes/fields) — renk, boyut, marka
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ı ilgilendirmezBu 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 nesnePrimitive 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:
Scannerbir sınıf,scbir nesnesc.nextInt()bir metot çağrısıSystem.outbir 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:
| Terim | Açı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 |
| Instantiation | Sınıftan nesne oluşturma (new) |
| Constructor | Nesne oluşturulurken çağrılan özel metot |
| Encapsulation | Veri gizleme ve kontrollü erişim |
| Inheritance | Sınıflar arası miras |
| Polymorphism | Çok biçimlilik |
| Abstraction | Soyutlama |
💡 İ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.outgibi yapılar zaten OOPSonraki derslerde sınıf tanımlama, constructor, encapsulation gibi konulara dalacağız
AI Asistan
Sorularını yanıtlamaya hazır