Mini OCP anlatımı ve Soru Çözümleri - Devam edecek



Tabii ki! Öncelikle, OCP (Oracle Certified Professional) Java sertifikası için konu başlıklarını aşağıda sıralıyorum. Bu sıralama, sertifikasyon sınavı için genel bir rehber niteliğinde olup, kesinlikle tamamlayıcı değildir. Ancak en yaygın konu başlıklarını içermektedir.


OCP Java Sertifikası İçindekiler:


Java Sınıf Tasarımı


Sınıf ve arayüz tasarımını ileri seviyede kullanma

Enum türlerini kullanma

Nested sınıflar

Annotation'lar

Gelişmiş Java Sınıf Tasarımı


Generics ve Collections ile ileri seviye çalışmalar

Lambda built-in functional interfaces

Java Stream API

Exceptions ve Assertions

Metod Tasarımı


Overloading ve overriding metodlar

Varargs, static ve final metodlar

Desen ve Modüller


Singleton desen, DAO desen vb.

Java'nın modül sistemi

Concurrency (Eşzamanlılık)


Concurrency API'nin temel bileşenleri

Eşzamanlılık problemlerini yönetme ve çözme

Fork/Join framework

Java I/O Fundamentals


I/O Streams

Reading ve writing data from console

Java File I/O (NIO.2)


Path class, file and directory operations

File attributes

Recursive access

Java Connectivity


JDBC API

Database transactions

Java Collections


List, Set, Queue ve Deque

Map, TreeMap, HashMap ve LinkedHashMap

Assertions ve Exceptions


Assertion mekanizması

Exception handling

Hangi başlığı daha detaylı incelemek istersiniz? Başlık verdikçe o konu üzerinde çalıştırabilirim ve soru çözebiliriz.



Sınıf ve arayüz tasarımını ileri seviyede kullanma


Sınıf ve arayüz tasarımında ileri seviye konular Java'da daha etkin, esnek ve bakımı kolay kod yazmanızı sağlar. İşte bazı ileri seviye konular:


1. Soyut Sınıflar ve Metodlar (Abstract Classes and Methods):

Soyut sınıflar, doğrudan örneklenemeyen sınıflardır. Genellikle alt sınıflar tarafından uygulanan soyut metodlara sahiptirler.


java

Copy code

abstract class Hayvan {

    abstract void sesCikar();

}

2. Final Sınıflar, Metodlar ve Değişkenler:

final anahtar kelimesi, bir sınıfın miras alınamayacağını, bir metodun geçersiz kılınmayacağını veya bir değişkenin değerinin değiştirilemeyeceğini belirtir.


java

Copy code

final class SabitSinif {}

3. Statik ve İnstance İlkleyiciler (Static and Instance Initializers):

Bu bloklar, sınıfın ya da nesnenin doğru şekilde başlatılmasını sağlar.


java

Copy code

class Ornek {

    static {

        // statik ilkleyici

    }


    {

        // instance ilkleyici

    }

}

4. Nested Sınıflar (Daha önce bahsettiğimiz gibi):

Statik iç sınıflar

İç sınıflar

Yerel iç sınıflar

Anonim iç sınıflar

5. Enum'lar:

Enum'lar, sabit değerler kümesini temsil eder. Metodlar, değişkenler ve yapıcılar da içerebilirler.


6. Annotations (Daha önce bahsettiğimiz gibi):

Kendi özel annotation'larınızı tanımlayabilir ve bu annotation'ları kullanarak metabilgi ekleyebilirsiniz.


7. Genel Prensipler:

Sıkı Kapsülleme (Tight Encapsulation): Sınıf üyelerinin erişilebilirliğini minimuma indirerek sınıfın iç yapısının dış etkilere kapalı olmasını sağlar.

Composition over Inheritance: Miras yerine bileşimi tercih etmek, sınıflar arası bağımlılığı azaltır ve esneklik sağlar.

Design Patterns (Tasarım Kalıpları): Özellikle Gang of Four (GoF) tarafından tanımlanan 23 tasarım kalıbı, yaygın programlama sorunları için çözüm sunar.

8. Interfaces:

Java 8 ile birlikte, arayüzlerde statik metodlar ve varsayılan metodlar tanımlamak mümkün hale geldi.


java

Copy code

interface OrnekArayuz {

    default void varsayilanMetod() {

        // ...

    }


    static void statikMetod() {

        // ...

    }

}

Soru:

Aşağıdaki Java kodu hangi tasarım ilkesini ihlal ediyor?


java

Copy code

class Motor {

    void calistir() {

        // ...

    }

}


class Araba extends Motor {

    void sur() {

        calistir();

        // ...

    }

}

A) Sıkı Kapsülleme

B) Composition over Inheritance

C) Singleton Tasarım Kalıbı

D) Liskov'un Yerine Geçme Prensibi


Cevap nedir?


User

B

Evet, doğru!


Seçenek B doğrudur. Araba sınıfı, Motor sınıfından türetilmiştir, bu da bir "Araba"nın bir "Motor" olduğu anlamına gelir. Ancak gerçekte bir "Araba", bir "Motor"a sahip olan bir şeydir. Bu nedenle, burada "Composition over Inheritance" (Miras yerine Bileşim) ilkesi ihlal edilmektedir. Araba ve Motor arasındaki ilişki "sahip olma" (composition) ilişkisi olmalıdır, "miras alma" (inheritance) ilişkisi değil.


Bu kodu daha uygun bir şekilde tasarlamak için Motor sınıfı, Araba sınıfının bir bileşeni olarak kullanılmalıdır.

Tabii ki! "Sınıf ve arayüz tasarımını ileri seviyede kullanma" başlığı altında, ileri Java sınıf ve arayüz tasarımının temel kavramlarını ele alalım:


1. Abstract Sınıflar ve Metodlar:

Java'da, bir sınıfın veya metodun tam olarak nasıl bir uygulamaya sahip olmadığını belirtmek için abstract anahtar kelimesini kullanırız.


Örnek:


java

Copy code

abstract class Hayvan {

    abstract void sesCikar();

}

2. İnterface'ler:

Java'da, bir sınıfın birden çok mirası alamaması sebebiyle, arayüzler kullanılır. Arayüzler, bir sınıfın hangi metotları uygulaması gerektiğini belirtir, ama nasıl uygulanması gerektiğini belirtmez.


Örnek:


java

Copy code

interface Yuklenebilir {

    void yukle();

}

3. Default ve Static Metodlar:

Java 8'den itibaren, interface'lerde default ve static metodlara izin verilmiştir. Bu, eski kodları kırma riski olmadan yeni metodlar eklememizi sağlar.


Örnek:


java

Copy code

interface Yazilabilir {

    default void selamVer() {

        System.out.println("Merhaba!");

    }

    

    static void bilgiVer() {

        System.out.println("Bu bir Yazilabilir arayüzüdür.");

    }

}

4. Private Metodlar (Java 9+):

Java 9 ile birlikte, interface'ler içinde private yardımcı metodlar tanımlamaya izin verilmeye başlandı.


Örnek:


java

Copy code

interface Okunabilir {

    default void aciklama() {

        yardimciMetod();

    }

    

    private void yardimciMetod() {

        System.out.println("Bu bir yardımcı metoddur.");

    }

}

Soru:

Aşağıdaki Java kodunda, hangi değişiklikler yapılmalıdır?


java

Copy code

interface Spor {

    void oyna();

    default void bilgiVer() {

        System.out.println("Spor arayüzüdür.");

    }

}


abstract class Takim implements Spor {

    abstract void oyuncuSayisi();

}

A) Takim sınıfı oyna metodunu uygulamalıdır.

B) bilgiVer metodunun tanımı Takim sınıfında yapılmalıdır.

C) oyuncuSayisi metodunun tanımı Spor arayüzünde yapılmalıdır.

D) Yukarıdaki kodda herhangi bir değişiklik yapılmasına gerek yoktur.


Cevap nedir?


User

A


Evet, doğru!


Seçenek A doğrudur. Takim sınıfı, Spor arayüzünü uyguladığı için oyna metodunu da uygulamalıdır. Aksi halde, bu bir hata oluşturur.


Bu yüzden Takim sınıfı şu şekilde değiştirilmelidir:


java

Copy code

abstract class Takim implements Spor {

    @Override

    public void oyna() {

        // Bu metodu alt sınıflar uygulayabilir veya

        // burada bir uygulama sağlanabilir.

    }


    abstract void oyuncuSayisi();

}


Enum türlerini kullanma


Tabii ki! enum (enumeration - sıralama) Java'da bir sabit kümesini ifade etmek için kullanılan bir veri tipidir. enum'lar sayesinde belirli bir küme içinde sınırlı sayıda sabit değerler tanımlayabiliriz.


enum'un Temel Özellikleri:

Bir enum tipi, Java'da özel bir sınıf türüdür.

enum'lar sadece son değerleri (sabitleri) içerir. Yani yeni bir değer eklenemez veya varolan bir değer değiştirilemez.

Basit Bir enum Örneği:

java

Copy code

enum Gunler {

    PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESI, PAZAR

}


public class TestEnum {

    public static void main(String[] args) {

        Gunler bugun = Gunler.CUMA;


        if(bugun == Gunler.CUMA) {

            System.out.println("Bugün Cuma!");

        }

    }

}

enum İçerisinde Metodlar ve Değişkenler:

enum'lar içinde değişkenler, metodlar ve yapılandırıcılar tanımlayabilirsiniz:


java

Copy code

enum Mevsim {

    ILKBAHAR("Mart"), YAZ("Haziran"), SONBAHAR("Eylül"), KIS("Aralık");


    private final String baslangicAy;


    Mevsim(String baslangicAy) {

        this.baslangicAy = baslangicAy;

    }


    public String getBaslangicAy() {

        return this.baslangicAy;

    }

}


public class TestMevsim {

    public static void main(String[] args) {

        for (Mevsim m : Mevsim.values()) {

            System.out.println(m + " mevsiminin başlangıç ayı: " + m.getBaslangicAy());

        }

    }

}

Soru:

Aşağıdaki enum tanımında hangi değişiklikler yapılmalıdır?


java

Copy code

enum Renkler {

    KIRMIZI("K"), MAVI("M"), YESIL, SARI("S");


    private final String kod;


    Renkler(String kod) {

        this.kod = kod;

    }


    public String getKod() {

        return kod;

    }

}

A) YESIL değeri için bir kod eklenmeli.

B) getKod metodu static olmalı.

C) enum içinde tanımlı yapılandırıcı private olmalı.

D) Yukarıdaki kodda herhangi bir değişiklik yapılmasına gerek yoktur.


Cevap nedir?


User

A


Evet, doğru!


Seçenek A doğrudur. YESIL değeri için bir kod eklenmeli. Diğer enum değerlerinin hepsinin bir kodu varken, YESIL'in bir kodu yok. Bu, bir derleme hatasına neden olur.


Bu yüzden enum tanımı şu şekilde düzenlenmelidir:


java

Copy code

enum Renkler {

    KIRMIZI("K"), MAVI("M"), YESIL("Y"), SARI("S");


    private final String kod;


    Renkler(String kod) {

        this.kod = kod;

    }


    public String getKod() {

        return kod;

    }

}

Bu değişiklikle YESIL için "Y" kodunu eklemiş olduk. İyi iş çıkardınız! Başka hangi konuyu incelemek istersiniz?


Nested sınıflar


Tabii ki! Java'da, bir sınıfın diğer bir sınıfın içerisinde tanımlandığını görebiliriz. Bu iç içe sınıflara "Nested Class" (İç içe Sınıflar) denir. Java'da dört tür iç içe sınıf bulunmaktadır:


Statik İç Sınıf (Static Nested Class)

İç Sınıf (Inner Class)

Yerel İç Sınıf (Local Inner Class)

Anonim İç Sınıf (Anonymous Inner Class)

1. Statik İç Sınıf:

Dış sınıfın statik bir üyesi olarak tanımlanır. Bu sınıfa dış sınıftan nesne oluşturmadan erişilebilir.


java

Copy code

class DisSinif {

    static class IcSinif {

        public void goster() {

            System.out.println("Bu bir statik iç sınıftır.");

        }

    }

}


// Kullanımı:

DisSinif.IcSinif icSinifNesnesi = new DisSinif.IcSinif();

icSinifNesnesi.goster();

2. İç Sınıf:

Dış sınıfın özel bir üyesidir ve dış sınıfın özelliklerine doğrudan erişebilir.


java

Copy code

class DisSinif {

    private int numara = 10;


    class IcSinif {

        public void goster() {

            System.out.println("Numara: " + numara);

        }

    }

}


// Kullanımı:

DisSinif dis = new DisSinif();

DisSinif.IcSinif ic = dis.new IcSinif();

ic.goster();

3. Yerel İç Sınıf:

Bir metot içerisinde tanımlanan sınıflardır.


java

Copy code

class DisSinif {

    void metod() {

        class YerelSinif {

            public void goster() {

                System.out.println("Bu bir yerel iç sınıftır.");

            }

        }

        

        YerelSinif yerel = new YerelSinif();

        yerel.goster();

    }

}

4. Anonim İç Sınıf:

İsmi olmayan sınıflardır. Genellikle GUI olay işleyicilerinde veya interface'lerin tek kullanımlık uygulamalarında kullanılır.


java

Copy code

interface Mesaj {

    void yaz();

}


public class Test {

    public static void main(String[] args) {

        Mesaj m = new Mesaj() {

            public void yaz() {

                System.out.println("Bu bir anonim iç sınıftır.");

            }

        };

        m.yaz();

    }

}

Soru:

Aşağıdaki Java kodunda, hangi değişiklikler yapılmalıdır?


java

Copy code

class UstSinif {

    private int deger = 7;


    static class AltSinif {

        public void ekranaBas() {

            System.out.println("Deger: " + deger);

        }

    }

}

A) AltSinif'ın ekranaBas metodu static olmalı.

B) deger değişkeni static olmalı.

C) AltSinif sınıfı static olmamalı.

D) deger değişkeninin erişim belirleyicisi public olmalı.


Cevap nedir?

User

B

Evet, doğru!


Statik iç sınıf, dış sınıfın statik olmayan üyelerine doğrudan erişemez. Bu yüzden eğer AltSinif statik bir iç sınıf olarak kalacaksa, bu sınıfın dış sınıfın deger isimli üyesine erişebilmesi için deger değişkeninin static olması gerekmektedir.


Bu yüzden doğru kod şu şekildedir:


java

Copy code

class UstSinif {

    private static int deger = 7;


    static class AltSinif {

        public void ekranaBas() {

            System.out.println("Deger: " + deger);

        }

    }

}


Annotation'lar


Tabii ki! Annotation'lar (Açıklamalar), Java 5 ile birlikte tanıtıldı ve kod hakkında meta bilgi sağlamak, kodun nasıl çalıştırılacağını etkilemek, ya da kod analizi ve kod üretimi yapmak için kullanılır.


Java'da birçok yerleşik annotation bulunmaktadır, ancak kendi özel annotation'larınızı da tanımlayabilirsiniz.


Java'nın Önemli Yerleşik Annotation'ları:

@Override: Bu annotation, bir metodun üst sınıftaki bir metodu geçersiz kıldığını belirtir.

@Deprecated: Bu annotation, bir metot veya sınıfın artık kullanılmaması gerektiğini belirtir.

@SuppressWarnings: Bu annotation, belirtilen türdeki uyarıları bastırmak için kullanılır.

@SafeVarargs: Java 7 ile birlikte tanıtıldı ve bir metot veya yapılandırıcının güvenli bir şekilde değişken sayıda argüman ile çalıştığını belirtir.

@FunctionalInterface: Java 8 ile birlikte tanıtıldı ve bir arayüzün fonksiyonel bir arayüz olduğunu belirtir.

Kendi Annotation'ınızı Tanımlama:

Kendi özel annotation'ınızı tanımlarken @interface anahtar kelimesini kullanmalısınız.


Örnek:


java

Copy code

public @interface Bilgi {

    String yazar();

    String tarih();

    int versiyon() default 1;

}

Annotation Kullanma:

Tanımlanan Bilgi annotation'ını bir sınıf üzerinde kullanalım:


java

Copy code

@Bilgi(yazar = "Ali", tarih = "27/08/2023", versiyon = 2)

public class OrnekSinif {

    // Sınıf kodu...

}

Soru:

Aşağıdaki Java kodunda hangi değişiklikler yapılmalıdır?


java

Copy code

@interface Ayarlar {

    String dil();

    String ulke() default "TR";

}


@Ayarlar(dil = "Türkçe")

public class Uygulama {

    // ...

}

A) Ayarlar annotation'ında ulke özelliği tanımlı değil.

B) Uygulama sınıfı için ulke özelliğini belirtmelisiniz.

C) Ayarlar annotation'ı için ulke özelliğinin varsayılan değeri belirtildiği için ekstra bir değişiklik yapılmasına gerek yoktur.

D) Ayarlar annotation'ı public olmalıdır.


Cevap nedir?

User

C


Evet, doğru!


Seçenek C doğrudur. Ayarlar annotation'ında ulke özelliği için varsayılan bir değer belirtilmiştir ("TR"). Bu nedenle, bu özelliği kullanırken ayrıca bir değer belirtmezseniz varsayılan değer alınır. Uygulama sınıfında Ayarlar annotation'ı dil özelliği için belirtilmişken ulke özelliği için belirtilmemiştir. Ancak bu sorun oluşturmaz, çünkü ulke için varsayılan bir değer mevcuttur.


Bu nedenle, kodda herhangi bir değişiklik yapılmasına gerek yoktur.


Hiç yorum yok

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo