November 15, 2025 (4mo ago) — last updated January 22, 2026 (2mo ago)

Sınıflar mı Yapılar mı? Ne Zaman Hangisi?

Değer ve referans tiplerini karşılaştırın; bellek, performans ve tasarım için sınıf mı struct mı seçileceğini pratik kurallarla öğrenin.

← Back to blog
Cover Image for Sınıflar mı Yapılar mı? Ne Zaman Hangisi?

Sınıflar ile yapılar arasında karar vermek sözdiziminden çok anlamsal bir tercihtir. Temel soru şu: veriyi kopyalamaya mı (değer semantiği) yoksa paylaşılmış kimliğe mi (referans semantiği) ihtiyacınız var? Bu seçim bellek kullanımı, performans ve mimari üzerinde doğrudan etki yapar. Bu rehberde farkları, performans sonuçlarını ve pratik kuralları bulacaksınız.

Sınıflar ve Yapılar: Her Birini Ne Zaman Kullanmalı?

Özet: Sınıflar ve yapıları karşılaştırın—değer vs referans, bellek, performans ve verimli kod için doğru tipi seçmeye yönelik tasarım rehberliği.

Giriş

Sınıflar ile yapılar arasında karar vermek sözdiziminden çok anlamsal bir tercihtir. Temel soru şu: veriyi kopyalamaya mı (değer semantiği) yoksa paylaşılmış kimliğe mi (referans semantiği) ihtiyacınız var? Bu seçim bellek kullanımı, performans, değiştirilebilirlik ve mimari üzerinde doğrudan etki yapar. Bu rehberde bu farkları, performans sonuçlarını ve pratik kuralları bulacaksınız.

Temel ayrım: değer vs referans semantiği

Büyük ekranda sınıflar ve yapıların kod bloklarını karşılaştıran bir programcı.

Sözdizimini kaldırınca mesele değer tipleri ile referans tipleri arasındaki davranış farkına iner. Yapıları birinin kopyasını verdiğiniz not defteri gibi düşünün: alan kişi kendi kopyası üzerinde değişiklik yapar, orijinal etkilenmez. Bu değer semantiğidir. Sınıflar ise paylaşılan bir belge gibidir: bir bağlantı yollarsınız ve herkes aynı canlı nesneyi düzenler. Bu referans semantiğidir.

Hızlı farklar

ÖzellikYapılar (Değer Tipleri)Sınıflar (Referans Tipleri)
Veri iletimiGeçirildiğinde veri kopyalanırReferans (işaretçi) geçirilir
Bellek tahsisiGenellikle satır içi veya yığında depolanırHeap üzerinde tahsis edilir
Yaşam döngüsüKısa ömürlü, geçici kopyalarUzun ömürlü, paylaşılan örnekler
KimlikVeri eşitliğiyle tanımlanırNesnenin ayrı kimliği vardır
KalıtımGenelde kalıtım yokturKalıtım ve çok biçimlilik desteklenir
Birincil kullanımKüçük, kendi içinde değerlerDavranışa sahip karmaşık varlıklar

Bu ilkeler gecikme, bellek kullanımı ve doğruluk üzerinde pratik sonuçlara sahiptir. Bilinçli seçim yapmak kodu daha öngörülebilir ve bakımı daha kolay hale getirir.

Bellek tahsisi performansı nasıl etkiler

Yığın ve heap bellek tahsisi arasındaki farkı gösteren bir diyagram.

Yığın (stack) ve heap, bu kararın performans etkilerinin büyük kısmının kaynağıdır.

Yığın: hızlı ve öngörülebilir

Yığın, fonksiyon-yerel verilerin itildiği ve çıkarıldığı LIFO bölgesidir. Yığında tahsis etmek çok ucuzdur çünkü yalnızca işaretçi aritmetiğidir. Küçük değer tipleri için tahsis ve serbest bırakma neredeyse bedavadır.

Heap: esnek ama daha maliyetli

Heap, nesnelere fonksiyon çağrılarının ötesinde yaşam sağlarken, tahsis daha yavaştır ve çöp toplama veya manuel serbest bırakma tetiklenebilir. Referans tipleri ekstra dolayılığa yol açar: yığında bir işaretçi heap verisine işaret eder. Tekrarlanan heap tahsisleri çöp toplama baskısını artırabilir ve yönetilen çalışma zamanlarında duraklamalara yol açabilir1.

C# örneği

// Value Type - lives inline (often on the stack)
public struct PointStruct {
    public int X;
    public int Y;
}

// Reference Type - object lives on the heap
public class PointClass {
    public int X;
    public int Y;
}

public void ProcessPoints() {
    PointStruct p1 = new PointStruct { X = 10, Y = 20 };
    PointClass p2 = new PointClass { X = 10, Y = 20 };
}

Sıkı döngülerde, küçük nesneler için binlerce heap tahsisi çöp toplama etkinliğini artırabilir; dizilerdeki yapılar genellikle daha iyi önbellek yerelliği ve daha düşük GC baskısı sağlar2.

Diller sınıfları ve yapıları nasıl ele alır

Farklı programlama dillerinden kod snippet'lerini gösteren bölünmüş ekran; sınıfları ve yapılarını tasvir ediyor.

Farklı diller farklı varsayılanları ve idyomları vurgular. En iyi seçim sadece performansa değil, dilin beklentilerine de bağlıdır.

C++: kelime farkı küçük ama kullanım farklı

C++’ta struct ve class teknik olarak çok benzerdir; temel fark varsayılan erişim düzeyidir (struct için public, class için private). Düz veri kümeleri için struct, kapsüllenmiş tipler ve karmaşık davranış için class kullanmak yaygındır3.

C#: açık değer/referans ayrımı

C#’ta struct gerçek bir değer tipidir ve class referans tipidir. Küçük, değiştirilemez değerler (koordinatlar, renkler) için struct’ları; kimliği ve paylaşılan değiştirilebilir durumu olan varlıklar için sınıfları tercih edin.

Swift: değer tiplerini öne çıkarır

Swift, değer-öncelikli bir yaklaşımı teşvik eder. Apple’ın rehberliği ve Swift topluluğu varsayılan olarak struct kullanmayı destekler; class ise paylaşılan değiştirilebilir durum veya Objective-C etkileşimleri için saklanır4.

Rust: sahiplik ve derleme zamanı güvenliği

Rust, çöp toplayıcı olmadan bellek güvenliği sağlamak için sahiplik ve ödünç alma modelini struct ile birleştirir. Davranışlar impl bloklarıyla iliştirilir ve derleyici sahiplik kurallarını derleme zamanında zorunlu kılar; bu sayede birçok paylaşım hatası çalışma zamanında ortaya çıkmadan engellenir5.

struct Player {
    username: String,
    level: u32,
    is_active: bool,
}

impl Player {
    fn level_up(&mut self) {
        self.level += 1;
    }
}

Rust’ın yaklaşımı doğrudan bellek kontrolünü derleme zamanı güvenlik garantileriyle birleştirir.

Ne zaman yapı (struct) seçilmeli

Tip küçük, kendi içinde ve bir kimlikten çok değer gibi ele alınıyorsa yapı seçin. Tipik adaylar:

  • Geometrik noktalar (Point2D)
  • Renk değerleri (RGB/RGBA)
  • Küçük yapılandırma verileri
  • Hafif hesaplama girdileri

Avantajları arasında daha az heap tahsisi, geliştirilmiş önbellek yerelliği ve yönetilen çalışma zamanlarında daha az GC baskısı bulunur. Geniş veri setlerinde önbellek yerelliği CPU için büyük kazançlar sağlayabilir2.

Ne zaman sınıf seçilmeli

Bir nesnenin sabit bir kimliği veya paylaşılan değiştirilebilir durumu varsa ya da kalıtım ve karmaşık yaşam döngüsü yönetimi gerekiyorsa sınıf seçin. Tipik adaylar:

  • Kullanıcı profilleri veya alan varlıkları
  • Veritabanı veya ağ bağlantı nesneleri
  • Durumu koordine eden servisler ve yöneticiler

Sınıflar, kalıtım ve çok biçimliliği kullanarak karmaşık ilişkileri modellemeyi kolaylaştırır.

Karar kontrol listesi: struct vs class

Dikkate alınacakStruct kullan (değer)Class kullan (referans)
KimlikVeri kimliktirNesnenin benzersiz kimliği vardır
DeğiştirilebilirlikDeğiştirilemez veya küçük, izole durumPaylaşılan, değiştirilebilir durum
DavranışVeriye bağlı basit mantıkKarmaşık etkileşimler ve davranış
Yaşam döngüsüKısa ömürlü, yerel kapsamUzun ömürlü, uygulama çapında
PaylaşmaKopyalamak güvenliReferansla paylaşılmalı

Yaygın sorular

Bir yapı metoda sahip olabilir mi?

Evet. Modern diller yapıların metodlara, başlatıcılara ve protokol veya arayüz uyumuna sahip olmasına izin verir. Temel fark hâlâ kopyalanma ve iletilme biçimidir.

Yapılar her zaman daha mı hızlıdır?

Hayır. Küçük yapılar genellikle heap üzerindeki nesnelerden daha iyi performans verir, ancak büyük yapılar kopyalanırken pahalı olabilir. Her zaman profil yapın ve gerçek iş yüküyle ölçün.

Yapılar kalıtımı destekliyor mu?

Genellikle hayır. Yapılar nadiren kalıtımı destekler, ancak birçok dil arayüzler veya protokoller aracılığıyla bileşime izin verir; bu da kalıtım yerine esnek kompozisyon sağlar.

Pratik Soru-Cevap (özet)

S: Ne zaman bir sınıfı yapı haline refactor etmeliyim?

A: Tip küçük, değiştirilemez bir değer ve benzersiz kimliği yoksa; bellek kullanımını azaltmak ve değer semantiği kazanmak için refactor düşünün.

S: Yönetilen dillerde GC duraklamalarını nasıl azaltırım?

A: Küçük değerler için struct’ları tercih ederek, nesneleri yeniden kullanarak ve nesne havuzları kullanarak kısa ömürlü heap tahsislerini azaltın; yük altında GC davranışını ölçün1.

S: En kolay başparmak kuralı nedir?

A: Nesne “bir değer”i temsil ediyorsa struct; “kimliği olan bir şey”i temsil ediyorsa class kullanın.


Hızlı referanslar ve iç bağlantılar

Clean Code Guy’da ekiplerin ölçeklenebilirlik ve sürdürülebilirlik için refactor yapmasına yardımcı oluyoruz. Daha fazla bilgi için https://cleancodeguy.com adresini ziyaret edin.

1.
Microsoft Docs. “Garbage collection performance and tuning.” https://learn.microsoft.com/dotnet/standard/garbage-collection/
2.
Ulrich Drepper. “What Every Programmer Should Know About Memory.” https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
3.
cppreference.com. “class vs struct.” https://en.cppreference.com/w/cpp/language/class
4.
Apple. “Structures and Classes” (Swift Programming Language). https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
5.
The Rust Programming Language. “Ownership.” https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html
← Back to blog
🙋🏻‍♂️

AI kod yazar.
Siz onu uzun süre dayanır hale getirirsiniz.

AI hızlanması çağında, temiz kod sadece iyi bir uygulama değil — ölçeklenen sistemlerle kendi ağırlığı altında çöken kod tabanları arasındaki farktır.