🧩 OOP, Veri Yapıları, Algoritmalar ve Tasarım Kalıpları

Mülakatlarda en çok sorulan konuların başında OOP, SOLID, DTO, veri yapıları, algoritmalar ve tasarım kalıpları gelir. Bu rehber detaylı açıklamalar, tablolar ve kod örnekleriyle hazırlanmıştır.

☕ OOP Prensipleri

🎯 Temel Kavramlar

OOP (Object-Oriented Programming), yazılım geliştirmeyi nesneler ve onların etkileşimleri üzerinden kurgulayan bir paradigmadır. Java, C#, C++ gibi diller OOP temelli dillerdir.

  • Encapsulation (Kapsülleme): Veriyi gizleme ve kontrollü erişim
  • Inheritance (Kalıtım): Ortak davranışların tekrar kullanılabilir hale getirilmesi
  • Polymorphism (Çok Biçimlilik): Farklı nesnelerin aynı metod imzasına farklı davranış göstermesi
  • Abstraction (Soyutlama): Gereksiz detayları gizleyerek önemli olanın gösterilmesi

💻 Kod Örnekleri


// Encapsulation
public class BankAccount {
    private double balance; 

    public void deposit(double amount) {
        if (amount > 0) balance += amount;
    }
    public double getBalance() { return balance; }
}

// Inheritance
class Vehicle {
    void move() { System.out.println("Araç hareket ediyor"); }
}
class Car extends Vehicle {
    void honk() { System.out.println("Korna çal!"); }
}

// Polymorphism
class Animal { void sound() { System.out.println("Ses çıkarır"); } }
class Dog extends Animal { @Override void sound() { System.out.println("Hav hav"); } }
class Cat extends Animal { @Override void sound() { System.out.println("Miyav"); } }

// Abstraction
abstract class Shape {
    abstract double area();
}
class Circle extends Shape {
    double radius;
    Circle(double r) { radius = r; }
    double area() { return Math.PI * radius * radius; }
}

📊 Abstract Class vs Interface

ÖzellikAbstract ClassInterface
MirasTek class extend edilebilirBirden fazla implement edilebilir
FieldField içerebilirStatic final alanlar
MethodHem gövdeli hem gövdesizGövdesiz (Java 8 ile default method geldi)
Kullanım“is-a” ilişkisiDavranış bildirimi

🧱 SOLID Prensipleri

📐 Açıklama

  • S: Single Responsibility → Her class tek sorumluluk
  • O: Open/Closed → Genişlemeye açık, değişime kapalı
  • L: Liskov Substitution → Alt sınıflar üst sınıfların yerine geçebilmeli
  • I: Interface Segregation → Küçük, odaklı interface’ler
  • D: Dependency Inversion → Detaya değil soyutlamaya bağımlılık

// Dependency Inversion Örneği
// Yanlış: Service direkt DB implementasyonuna bağlı
class UserService {
    private MySQLDatabase db = new MySQLDatabase();
}

// Doğru: Service soyut interface’e bağlı
interface Database { void save(User u); }
class MySQLDatabase implements Database { public void save(User u) { /*...*/ } }
class UserService {
    private Database db;
    public UserService(Database db) { this.db = db; }
}

📦 DTO (Data Transfer Object)

Entity vs DTO

ÖzellikEntityDTO
AmacıDB tablosunu temsil ederVeri transferi
AlanlarTüm sütunlarSadece gerekli alanlar
RiskHassas bilgi açığa çıkabilirGüvenli

// Entity
@Entity
class User {
  @Id private Long id;
  private String username;
  private String password;
  private String email;
}
// DTO
class UserDTO {
  private String username;
  private String email;
}
// Controller
@GetMapping("/users/{id}")
public UserDTO getUser(@PathVariable Long id) {
  User user = userService.findById(id);
  return new UserDTO(user.getUsername(), user.getEmail());
}

📊 Veri Yapıları

Array vs ArrayList vs LinkedList

ÖzellikArrayArrayListLinkedList
BoyutSabitDinamikDinamik
ErişimO(1)O(1)O(n)
EklemeZorOrtaO(1) (head/tail)

HashMap vs TreeMap vs HashTable

ÖzellikHashMapTreeMapHashtable
Null Key1 adetYokYok
SıralamaYokDoğal sıraYok
Thread-safeHayırHayırEvet

🧮 Algoritmalar

Big-O Karmaşıklıkları

AlgoritmaOrtalamaKötü Durum
Linear SearchO(n)O(n)
Binary SearchO(log n)O(log n)
QuickSortO(n log n)O(n^2)
MergeSortO(n log n)O(n log n)
BFS/DFSO(V+E)O(V+E)

🎨 Tasarım Kalıpları

Singleton


class Singleton {
  private static Singleton instance;
  private Singleton() {}
  public static Singleton getInstance() {
    if (instance == null) instance = new Singleton();
    return instance;
  }
}

Factory Method


interface Shape { void draw(); }
class Circle implements Shape { public void draw(){ System.out.println("Circle"); } }
class ShapeFactory {
  public Shape getShape(String type) {
    if(type.equals("circle")) return new Circle();
    return null;
  }
}

❓ Mülakat Soruları ve Cevapları

1. OOP’nin 4 temel prensibi nedir?

Encapsulation: Verilerin gizlenmesi.
Inheritance: Üst sınıftan alt sınıfa özellik aktarımı.
Polymorphism: Aynı metodun farklı davranması.
Abstraction: Gereksiz detayları gizleyip önemli olanı sunma.

2. Abstract Class ile Interface farkları nelerdir?

  • Abstract class field barındırabilir, interface sadece static final.
  • Abstract class tek miras alınabilir, interface çoklu implement edilir.
  • Abstract class gövdeli/gövdesiz metod içerir, interface metodları default olarak gövdesizdir (Java 8’de default geldi).
  • Interface davranış bildirimi, abstract class temel davranış sağlamak için kullanılır.

3. DTO nedir, neden kullanılır?

DTO: Entity’yi doğrudan dış dünyaya açmak yerine sadece gerekli alanları taşıyan nesnedir.
Avantaj: Güvenlik, performans, API kontratlarının netliği.

4. HashMap nasıl çalışır?

Key’in hashCode() değeri alınır → bucket index hesaplanır → veri buraya kaydedilir.
Collision durumunda Java 7’de linked list chaining, Java 8+’da çok collision olursa red-black tree kullanılır.

5. ArrayList ile LinkedList farkları nelerdir?

  • ArrayList: Rastgele erişim hızlı (O(1)), ekleme/silme yavaş (O(n)).
  • LinkedList: Rastgele erişim yavaş (O(n)), ekleme/silme hızlı (O(1)).

6. Stack ile Queue farkı nedir?

Stack: LIFO (Last In First Out).
Queue: FIFO (First In First Out).

7. Binary Search karmaşıklığı nedir?

Ortalama: O(log n), Kötü durum: O(log n). Ön koşul: Dizi sıralı olmalı.

8. Merge Sort ve Quick Sort farkları?

  • Merge Sort: Kararlı sıralama, her durumda O(n log n).
  • Quick Sort: Ortalama O(n log n), kötü durumda O(n²). Ama pratikte daha hızlıdır.

9. Singleton pattern nedir, dezavantajları nelerdir?

Tanım: Sınıfın tek instance’ı olmasını sağlar.
Dezavantaj: Testi zorlaştırır, global state oluşturur, thread-safe uygulanmazsa concurrency problemleri çıkar.

10. Observer pattern gerçek hayatta nerede kullanılır?

Örn: GUI event listener (butona tıklama olayını dinleyenler).
Java’da Observer interface, addObserver() kullanılır.

11. BFS ile DFS farkı nedir?

  • BFS: Katman katman dolaşır, Queue kullanır, en kısa yol bulmada tercih edilir.
  • DFS: Derinlemesine dolaşır, Stack/Recursion kullanır, tüm olasılıkları keşfetmek için kullanılır.

12. SOLID’den Dependency Inversion nedir?

Yüksek seviyeli sınıflar düşük seviyeli implementasyona değil, abstract/interface’lere bağımlı olmalı.

13. Immutable class nasıl oluşturulur?


public final class Person {
  private final String name;
  public Person(String name) { this.name = name; }
  public String getName() { return name; }
}

Class final, alanlar private final, setter yok.