🧩 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
| Özellik | Abstract Class | Interface |
|---|---|---|
| Miras | Tek class extend edilebilir | Birden fazla implement edilebilir |
| Field | Field içerebilir | Static final alanlar |
| Method | Hem gövdeli hem gövdesiz | Gövdesiz (Java 8 ile default method geldi) |
| Kullanım | “is-a” ilişkisi | Davranış 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
| Özellik | Entity | DTO |
|---|---|---|
| Amacı | DB tablosunu temsil eder | Veri transferi |
| Alanlar | Tüm sütunlar | Sadece gerekli alanlar |
| Risk | Hassas bilgi açığa çıkabilir | Gü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
| Özellik | Array | ArrayList | LinkedList |
|---|---|---|---|
| Boyut | Sabit | Dinamik | Dinamik |
| Erişim | O(1) | O(1) | O(n) |
| Ekleme | Zor | Orta | O(1) (head/tail) |
HashMap vs TreeMap vs HashTable
| Özellik | HashMap | TreeMap | Hashtable |
|---|---|---|---|
| Null Key | 1 adet | Yok | Yok |
| Sıralama | Yok | Doğal sıra | Yok |
| Thread-safe | Hayır | Hayır | Evet |
🧮 Algoritmalar
Big-O Karmaşıklıkları
| Algoritma | Ortalama | Kötü Durum |
|---|---|---|
| Linear Search | O(n) | O(n) |
| Binary Search | O(log n) | O(log n) |
| QuickSort | O(n log n) | O(n^2) |
| MergeSort | O(n log n) | O(n log n) |
| BFS/DFS | O(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
defaultgeldi). - 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.