Skip to main content
8 min read

OOP: Nesne Yönelimli Programlama: Sınıf, Nesne, Özellik ve Metodlar

Mustafa Kürşad BaşerMustafa Kürşad BAŞER
OOP: Nesne Yönelimli Programlama: Sınıf, Nesne, Özellik ve Metodlar

Nesne Yönelimli Programlama (OOP), adını sık duyduğumuz ama tanımı çoğu zaman havada kalan bir yaklaşım. Temel fikri şu: yazılımı bir işlem adımları listesi olarak değil, birbiriyle konuşan nesneler topluluğu olarak kurmak. Karmaşık bir sistemi tek parça halinde tutmak yerine, her biri kendi verisini ve davranışını taşıyan parçalara bölersiniz.

Bu bölmenin asıl değeri, verinin ve o veriyi işleyen kodun bir arada durması. Müşterinin adı bir yerde, o adı doğrulayan kod bambaşka bir dosyada durmaz; ikisi de aynı nesnenin içindedir. Bir değişiklik geldiğinde nereye bakacağınız böylece belli olur.

Örneklerle gidelim. Bir araba, bir müşteri, bir kitap. Her biri bir sınıfın örneği olabilir. Sınıf, o nesnelerin neye sahip olduğunu (arabanın markası, müşterinin adı) ve ne yapabildiğini (arabanın çalışması, müşterinin sipariş vermesi) tarif eder.

Burada büyük resmi kaçırmamak gerekiyor. Terimi ortaya atan Dr. Alan Kay, işin asıl odağının nesneler değil mesajlaşma olduğunu söyler. Kendisi OOP’yi sonradan üç şeye indirgemişti: mesajlaşma, durumun yerel olarak saklanıp korunması ve her şeyin olabildiğince geç bağlanması. Yani sınıf ve kalıtım sözdiziminden önce gelen soru başka. Bir kod, başka bir kodla nasıl konuşuyor?

Nesne Yönelimli Programlama (OOP) Kavramları Nelerdir?

  • Sınıflar (Class)
  • Nesneler (Object)
  • Kalıtım (Inheritance)
  • Kapsülleme (Encapsulation)
  • Polimorfizm (Polymorphism)
  • Soyutlama (Abstraction)

Note

Bu konuyu beş bölüme ayırdım. Sınıf, nesne, özellik (attribute) ve metodlara bu yazımda değiniyorum. Serinin diğer yazıları: Inheritance (Kalıtım), Encapsulation (Kapsülleme), Polymorphism (Çok Biçimlilik) ve Abstraction (Soyutlama).

1. Sınıf (Class)

Araba örneği

Sınıf, nesnelerin kalıbıdır. İçinde nesnenin sahip olacağı alanlar ve çağırabileceği metodlar durur. Bir "Araba" sınıfı marka, model, renk alanlarını ve çalıştırma, durdurma davranışlarını taşıyabilir. Şunu aklınızda tutun: sınıfın kendisi bellekte bir araba değildir, arabanın nasıl olacağını anlatan tariftir.

1. Sınıfların Tanımlanması

Java gibi birçok programlama dilinde, sınıflar "class" anahtar kelimesiyle tanımlanır. Bir sınıfın yapısı şu şekildedir:

java
public class Araba {    // Alanlar (Özellikler)    String marka;    String model;    String renk;     // Metodlar    public void calis() {      System.out.println("Araba çalıştırıldı.");    }  }

Yukarıda üç alanı ve tek metodu olan bir Araba sınıfı var. Henüz ortada bir araba yok, yalnızca tarif var.

Alanların burada erişim belirteci olmadan yazıldığını not edin. Java’da bu, aynı pakete açık oldukları anlamına gelir. Gerçek projelerde alanlar private yapılır ve erişim metotlar üzerinden verilir. Sebebini serinin Encapsulation (Kapsülleme) yazısında ele aldım.

2. Nesne (Object)

Nesne, sınıftan üretilmiş somut örnektir. Tarif sınıfsa, mutfaktan çıkan yemek nesnedir. Aynı Araba sınıfından yüzlerce nesne üretebilirsiniz; hepsi aynı alanlara sahiptir ama her birinin değerleri kendine aittir. Biri kırmızı bir Corolla, diğeri bej bir T10X.

1. Nesnelerin Oluşturulması

new anahtar kelimesi tam olarak şunu yapar: bellekte sınıfın tarif ettiği kadar yer ayırır ve size oraya bir referans verir. Referans elinizdeyken alanlara ve metotlara nokta operatörüyle ulaşırsınız.

java
public class Main {    public static void main(String[] args) {      Araba araba1 = new Araba();      araba1.marka = "Toyota";      araba1.model = "Corolla";      araba1.renk = "Kırmızı";       araba1.calis();    }  }

araba1 artık bellekte yaşayan bir nesne. Alanlarına değer verdik, ardından calis() metodunu çağırdık. İkinci bir new Araba() çağrısı bambaşka bir nesne üretirdi ve araba1 içindeki değerlerden hiç etkilenmezdi.

2. Nesnelerin Özellikleri ve Metodları

İki kavramı ayırmakta fayda var: alanlar nesnenin ne olduğunu, metotlar ne yapabildiğini anlatır. Birincisi durum, ikincisi davranış.

java
public class Araba {    String marka;    String model;    String renk;     public void calis() {      System.out.println("Araba çalışıyor.");    }  }

Yukarıdaki sınıfta üçü durum, biri davranış: marka, model ve renk alanları ile calis() metodu.

Bir ayrıntı: aynı sınıftan üretilen iki nesne birbirinden bağımsızdır, ama ikisi de aynı metot kodunu paylaşır. Nesne başına kopyalanan şey durumdur, davranış değil.

3. Özellik (Attribute)

Özellikler, nesnenin o anki durumunu tutan verilerdir. Tanımı sınıfın içinde yapılır, değeri ise her nesnede ayrı yaşar. Araba sınıfının markası, modeli ve rengi bu türdendir.

1. Özelliklerin Tanımlanması

Java tarafında bunlar sınıf gövdesine yazılan değişkenlerdir. Değer atamazsanız derleyici varsayılanını koyar: sayısal türlerde 0, nesne referanslarında null. Bu ayrıntı, ileride beklenmedik bir NullPointerException avlarken işinize yarayacak.

java
public class Araba {    String marka;    String model;    String renk;  }

Yukarıda Araba sınıfı üç alana indirgenmiş halde duruyor. Metodu yok, sadece durumu var. Bu da gayet geçerli bir sınıftır.

1. Özelliklere Erişim

Alanlara nesne üzerinden nokta operatörüyle ulaşılır. Hem okuyabilir hem de değer atayabilirsiniz:

java
public class Main {    public static void main(String[] args) {      Araba araba1 = new Araba();      araba1.marka = "TOGG";  // :)      araba1.model = "T10X";      araba1.renk = "Bej | Kapadokya";       System.out.println("Araba markası: " + araba1.marka);      System.out.println("Araba modeli: " + araba1.model);      System.out.println("Araba rengi: " + araba1.renk);    }  }

Burada alanlara doğrudan dışarıdan değer atadık. Öğrenirken sorun değil, ama gerçek kodda bu, nesnenin kendi durumu üzerindeki denetimini kaybetmesi anlamına gelir. Şu anda hiçbir şey renk alanına boş metin yazılmasını engellemiyor.

Doğrusu, alanı private yapıp değişikliği bir metoda bağlamaktır. O metot da kuralı kendi içinde denetler; örneğin renk alanına boş metin yazılmasını reddeder. Bu yaklaşımın adı kapsülleme.

4. Metodlar (Methods)

Metodlar, nesnenin yapabildiği şeylerdir. Araba sınıfında çalıştırma ve durdurma olabilir; bir Sepet sınıfında ürün ekleme ve toplam hesaplama olurdu.

1. Metodların Tanımlanması

Bir metot imzası üç parçadan oluşur: dönüş tipi, ad ve parametre listesi. Parametre almayabilir, değer döndürmeyebilir, ya da ikisini birden yapabilir.

java
public class Araba {    public void calis() {      System.out.println("Araba çalışıyor.");    }  }

Yukarıdaki calis() metodu parametre almıyor ve geriye değer döndürmüyor. Yaptığı tek iş ekrana bir satır basmak.

2. Metodların Parametrelerle Kullanımı

Metotlar dışarıdan veri alabilir. Parametreler, metodun işini yapabilmesi için ihtiyaç duyduğu bilgilerdir ve metot gövdesinde yerel değişken gibi davranırlar.

java
public class HesapMakinesi {    public int topla(int sayi1, int sayi2) {      return sayi1 + sayi2;    }  }

Araba örneğinin dışına çıkalım. topla() metodu iki int alıyor, toplamı hesaplıyor ve sonucu return ile geri veriyor. Dönüş tipinin int olması tam da bu yüzden.

Metot ile sıradan bir fonksiyon arasındaki fark da tam burada: metot her zaman bir nesneye ya da sınıfa aittir ve o nesnenin durumuna doğrudan erişebilir.

Fark ettiniz mi: void nedir?

Bir soru soralım. topla() metodu int döndürüyor, çünkü ortada bir sonuç var. Aynı metot String ya da başka bir tip de döndürebilirdi. Peki metot geriye hiçbir şey vermiyorsa dönüş tipine ne yazacağız?

Cevap void. Java, C, C++ ve C# gibi dillerde bu anahtar kelime, metodun geriye değer döndürmediğini bildirir. Ekrana yazdırma, dosyaya kayıt ya da nesnenin bir alanını değiştirme gibi işler bu gruba girer: iş yapılır, ortada döndürülecek bir sonuç olmaz.

Birkaç dilde örneklendirelim (sadece bu dillerle sınırlı değildir)

java
public void selamVer() {    System.out.println("Merhaba, dünya!");  }
c
void selamVer() {    printf("Merhaba, dünya!");  }
csharp
public void selamVer() {    Console.WriteLine("Merhaba, dünya!");  }

Üç dilde de aynı şey yazıyor: parametre almayan, değer döndürmeyen, ekrana tek satır basan bir metot. Sözdizimi değişiyor, fikir aynı kalıyor.

Kısa toparlama:

void, metodun geriye değer döndürmediğini söyler. Böyle bir metodun içinde return yazabilirsiniz ama yanına bir değer koyamazsınız; oradaki return yalnızca metottan erken çıkmaya yarar.

Diğer bütün dönüş tipleri ise metodun ne vereceğine dair bir taahhüttür: int, double, String ya da kendi yazdığınız bir sınıf. Derleyici bu taahhüdü denetler, int deyip String döndüremezsiniz.

Sonuç

Sonuç olarak, Nesne Yönelimli Programlama (OOP), modern yazılım geliştirme süreçlerinin vazgeçilmez bir yaklaşımıdır. Nesne, sınıf, özellik ve metodlar gibi temel kavramlar, yazılımın modüler, esnek ve sürdürülebilir olmasını sağlarken, gerçek dünyadaki nesneleri modelleyerek kodun daha anlaşılır ve yönetilebilir hale gelmesine olanak tanır. Bir sınıfın, nesnelerin şablonlarını belirlemesi, özelliklerin nesnelerin durumunu yansıtması ve metodların bu nesnelerin davranışlarını yönetmesi, OOP’nin sağladığı güçlü yapı taşlarını oluşturur.

Yazılım dünyasında daha sağlam, tekrar kullanılabilir ve kolayca bakım yapılabilir projeler geliştirmenin temel yolu, bu kavramları doğru anlamaktan ve kullanmaktan geçer. Nesne yönelimli programlamanın sunduğu bu güçlü mesajlaşma altyapısı, karmaşık projeleri yönetilebilir hale getirir.

Girişte de belirttiğim gibi nesne yönelimli programlamayı beş bölüme ayırdım. Buradan sonrası sırasıyla şöyle ilerliyor: Inheritance (Kalıtım) ile sınıflar arasında ilişki kurmayı, Encapsulation (Kapsülleme) ile nesnenin kendi kurallarını korumasını, Polymorphism (Çok Biçimlilik) ile aynı çağrının farklı davranmasını ve son olarak Abstraction (Soyutlama) ile detayı gizlemeyi ele aldım.

Referanslar

Mclaughlin, B. D. E. A. (2006). Head first object-oriented analysis and design. https://ci.nii.ac.jp/ncid/BA83362170

Dr. Alan Kay on the meaning of “object-oriented programming”

Share this post

Link copied!
Mustafa Kürşad Başer
Author

Mustafa Kürşad Başer

Senior Software Engineer

A passionate software engineer who enjoys creating elegant solutions to complex problems. Beyond coding, I am deeply interested in exploring the intersections of technology, art, and human consciousness.