22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Java Class Yapısı & Paket Düzeni Şu Ana Kadar, Hep Tek Bir Class’ta Çalıştık. Değişkenleri, Methodları Tek Bir Class’ta Yazdık, main Methodunu Aynı Class’ta yazdık, Uygulamayı Tek Class Olarak Çalıştırdık. Projenizi, Farklı Class’lara Bölüp, Bu Class’lardaki Değişkenleri Ve Methodları, Diğer Class’lardan Çağırıp Kullanabilirsiniz. Örneğin, Çeşitli Şekillerin Alan Ve Çevrelerini Hesaplayan Methodları, Sekiller Diye Bir Class’ta Yazalım. Uygulamamızıda (main Methodunu & İçeriğini) Test Diye Başka Bir Class’ta Yazalım. Test Class’ının İçinden, Sekiller Class’ındaki Methodlara Erişip Kullanalım. Birlikte Kullanılacak Classlar Projenizde Aynı Klasör İçindeyse, Direkt Olarak Kullanabilirsiniz. Eğer Projenizde Farklı Bir Klasör İçindeyse, (Ki Bu Klasörlere Paket Deniyor) Kodunuza İlgili import’u Eklemeniz Gerekmektedir. Paketler; Aynı İş İçin Kullanılan Yada Aynı Amaca Hizmet Etmek İçin Bir Bütün Oluşturan Birden Çok Java Sınıfının Bir Arada Kullanılmasına Denir. Örneğin, Hem Arayüz (GUI), Hem MySQL DB Emir Civaş – i.am@live.jp Sayfa 1 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 (Veritabanı), Hem Network, Hemde Dosya İşlemleri Yaptığınız Bir Proje Geliştiriyorsunuz. Atıyorum, Uygulamanızın Arayüzünü Oluşturmak İçin 6, DB İşlemleri İçin 2, Network İşlemleri İçin 4, Dosya İşlemleri İçin 3 Class Yazdınız. Bir Proje İçin 15 Class Belki Çok Fazla Gelmeyebilir. Ama Sonuçta Ortaya Düzensiz Bir Görünüm Çıkar, Class Sayısı Arttıkça Kod Düzensiz Hale Gelir (Heleki Bazen Farklı Amaçlara Hizmet Eden Farklı Classların İsimleri Aynı Olabiliyor!) İşte Bu Durumda Paket Kullanmaktan Çekinmeyin Derim. Sonuçta Java Bu Şekilde Yazılmış JDK’daki Classlar Bu Şekilde Düzenlenmiş. Düzeni Devam Ettirin Paketler, Kısaca Java Kodlarını Yazdığınız src Klasöründeki Farklı Klasörlerdir. Dolayısıyla, Yukarıdaki Örneğe Göre, DB, Network, Dosya ve GUI İşlemleri İçin Farklı Klasörler Oluşturup, Java Dosyalarınızı Bu Klasörlerde Toplamanız İyi Olacaktır. Paketler Komple Küçük Harfle Yazılmalı, İsimlerinde Türkçe Karakter Yada Boşluk İçermemelidir. Bir Class’ı Bir Paketin İçine Aldığınızda, O Class’ın En Üst Satırına, Paket İsmini Belirtmeniz Gerekir. Örneğin Yukardıraki Şekiller Class’ını matematik Diye Bir Paket Oluşturup İçine Taşıyalım. Eğer Bu Class’ı Başka Bir Paket İçinde Bulunan Başka Bir Class’tan Kullanacaksanız, Bu Class’ı Import Etmeniz Gerekmekte. Eğer İç İçe Paketler Oluşturacaksınız Bunları “.” İle Ayırıyorsunuz. Örneğin : matematik > geometri > Sekiller.Java Şeklinde Bir Klasör Yapısı İçin Kullanılacak Paket Adı : matematik.geometri dir. Kullanılacak import ise : import matematik.geometri.Sekiller; ‘dir. Eğer Bir Paketteki Bütün Class’ları Import Edecekseniz : import matematik.geometri.*; Emir Civaş – i.am@live.jp Sayfa 2 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Method Overloading Method Overloading Bir Class’ta Bulunan Bir Methodun, Aynı İsimde Tekrar Tanıtılıp, Farklı Parametreler İle Aynı Yada Farklı Bir (Yada Aynı İşi Farklı Bir Şekilde) İşi Yapmasıdır. Misal Math Classındaki Methodlara Baktığınızda, Bir Sürü Method, Tekrar Tekrar Farklı Parametreler İçin Yazar. Aşağıdaki Resimde max ve min Methodlarının Tekrar Tekrar Tanımlandığını Görebilirsiniz. Bunun Sebebi, Değişken Tipi Farklı Olmasına Rağmen, Aynı Methodun Kullanılıp (Aynı Method Adının) Aynı İşlemin Yapılmasının, Karışıklıkları Önleyecek Olmasıdır. Misal, Bu Methodların Overload İle Tanımlanması Yerine, findMaxDoubleNumber, findMaxDoubleFloatNumber, findMaxIntegerNumber, findMaxLongNumber Olduğunu Düşünün.. Aynı Şeyi, Sizde Kendi Yazdığınız Methodlarda Yapabilirsiniz. Misal Sekillerdeki Alan & Çevre Methodlarına Bakın. kareCevreHesapla, dikdortgenCevreHesapla, kareAlanHesapla, dikdortgenAlanHesapla. Madem Karenin 4 Kenarı Eşit, Dikdortgeninde Iki Kenar’ı Farklı; Biz Bir Tane Alan, Bir Tane Çevre Methodu Yazıp (Her Biri İçin Tek Parametre, İki Parametre Alan) İşlemlerimizi Overload İle Halledebiliriz. Kare İle İlgili İşlem Yapacaksak, Tek Parametreli, Dikdörtgen İle İlgili İşlem Yapacaksak İki Parametreli Methodları Kullanırız. Sekiller Methodları Sekiller Methodlarının Kullanımı Önemli : İçinde Yaptığınız İş Farklı Olsada Aynı Tipte & Aynı Sayıda Parametre Alan 2. Bir Method Tanımlayamazsınız Emir Civaş – i.am@live.jp Sayfa 3 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 List Küllanımı, Collections Bugüne Kadar Aynı Tipteki Değişkenleri Grup Olarak Tutup, Üzerinde İşlemler Yapmak İçin Array’leri Kullandık. Arrayler, Bir Değişken Adı Verilerek Oluşturulan, Belirli Bir Boyutu Olan Yapılardır. Bir Komidin & İçindeki Çekmeceler Gibi. Bir Index Yardımıyla İçindeki Değerlere Ulaşıp, Bu Değerlerle İşlemler Yapabiliyorduk. Arraylerin Boyutu Baştan Belirleniyordu. Sonradan Değiştirilemiyordu. Ve Arraylerin Sınırları Dışındaki Indexleri Kullanamıyorduk. Boyutu n Olan Bir Arrayin İlk Eleman Index i 0, Son Eleman Index’i İse n-1 Oluyordu. Java’da Farklı Değerleri Grup Olarak Tutabileceğiniz List Diye Bir Yapı Daha Var. List’ler Arraylerden Çok Daha Farklı Ve Kullanışlıdır. Size Kullanabileceğiniz Bir Sürü Method Sunarlar. Dinamiktirler, Boyutları Başlangıçta 0, Siz Değer Ekledikçe Artar, Siz Değer Sildikçe Azalırlar. Java’da List Class’ından Türetilen Farklı List Implementasyonları Vardır. (Örn : LinkedList, ArrayList, Stack, Vector ... ) Bir List’i Oluştururken, İçine Hangi Tipte Değer Tutulacaksa, O Belirtilmelidir. Ve Bu Tip Bir Obje Olmalıdır, int, long, short vb.. İlkel Değişkenleri List’te Tutamazsınız. Bunların Obje Versionlarını Kullanabilirsiniz. Eğer Tip Belirtmezseniz, Listeye Eklediğiniz Herşeyi Object Olarak Tutar, Bu Değerleri Listeden Çektiğinizde, Kendiniz Cast İşlemlerini Yapmak Durumunda Kalırsınız. Emir Civaş – i.am@live.jp Sayfa 4 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Collections Sınıfı, Listler Üzerinde İşlemler Yapmanızı Sağlayan Bir Sınıftır. Bazı Örnek İşlemler : Bugüne Kadar Gördüğümüz Döngüler Dışında, Listleri Dolaşmak İçin For Each Denen Yapıyıda Kullanabilirsiniz. (Muhtemelen, ArrayList Olan Her Kod’ta Ben Bu Döngüyü Kullanacam ) Emir Civaş – i.am@live.jp Sayfa 5 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 OOP – Object Oriented Programming Bence Java’nın Asıl Başladığı Nokta Bu. OOP – Object Oriented Programming – Nesne Yönelimli Programlama, Bir Programlama Tekniğidir. Gerçek Hayattaki Senaryoların Koda Implement Edilmesini Büyük Ölçüde Kolaylaştırır. Bunu Elinizdeki Problemi (Yapacağınız Uygulamayı) Parçalara Bölerek, Her Parçanın Kendi İşleyişi, Diğer Parçalarla İletişime Geçme Mekanizmasını Kullanarak Yapabilirsiniz. Çok Basit 4 Kuralı Var. (Aslında 5-6 Ama Şu Anlık 4 Kural İşimizi Görüyor) 1 – Kendi Başına Birşeyler Yapabilen, Yada Başkalarının Birşeyler Yapmasını Sağlayan Herşey Bir Nesnedir. 2 – Nesneler Kendi Değerlerine & Methodlarına Sahiptirler 3 – Nesneler, Diğer Nesnelerle Değerler & Methodlar Aracılığıyla İletişime Geçer 4 – Nesneleri Kullanmak İçin Kopyalara (Instance’lara ) İhtiyaç Vardır. Bir Kart Oyunu Düşünün. Örneğin Pişti, Poker, Solitaire.. - Oyun Kartlarla Oynanıyor, Her Kartın Kendine Ait Bir Sembolü, Değeri, Ön & Arka Yüz Resmi Mevcut Oyun Kartları Deste Denen Bir Yapıda Tutuluyor, Destede Kartlar Karıştırılıyor, Dağıtılıyor, Toplanıyor Oyuncu Oyunu Oynuyor, Desteden Gelen Kağıtlarla Seçimler Yapıyor Oyunun Belli Kuralları Var. Bu Kurallar Neticesinde Oyuncunun Seçimleri Gerçekleştiriliyor. Yukarıdaki 4 Maddeye Bakarsanız Eğer, Her Biri Kendi Başına, Veya Başka Maddelerle Birlikte Birşeyler Yapıyor. Daha Yukarıdaki 4 Maddeye Bakarsanızda, Aslında Oyunun Bu Parçaları, 4 Maddeyede Uyuyor. Oyun Problemimiz, Bu 4 Parçaya Bölünüp, Kolay Bir Şekilde Implement Edilebiliyor. Haliyle, Bu Yaklaşımada Nesneye Yönelik Programlama Deniyor. Java’da Nesneler Class’larda Tanımlanırlar. Her Class Bir Nesne Class’ı Olmayabilir. Ama Her Nesne Bilin ki Bir Class’a Sahiptir. Bir Class’ın Nesne Class’ı Olması İçin, O Class’a Constructor Denen Özel Bir Method Tanımlanması Gerekmektedir. Constructor, Class’ın Adıyla Aynı Ada Sahip, Dönüş Türü Olmayan Bir Method’tur. Constructor Bir Class’ın Bir Nesne (Obje Diyecem Bundan Sonra)’ye Ait Olduğunu Gösterir En Basit Haliyle. Constructor Kelime Anlamıyla Yapıcı Method Demektir. Bir Objenin Constructor’ının Çağrılması O Objenin Bellekte Bir Kopyasını Oluşturur. Siz, Daha Sonra Bu Kopyayı Kullanırsınız. Bu Kopyaya Instance Denir. ÖNEMLİ : Constructor Methodu Kullanarak Yaratılmayan Bir Instance’in Ozellikleri KULLANILAMAZ ! Uygulama NULLPOINTEREXCEPTION Fırlatır ! Yukarıdaki Örnekte, Kisi Obje, k Instance’tir. Emir Civaş – i.am@live.jp Sayfa 6 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Constructor’lar En Nihayetinde Birer Method Oldukları İçin, İçlerinde İstenilen İşlemleride Yapabilirler. Aynı Zamanda Bir Obje Class’ında Birden Fazla Constructor Yaratılabilir. (Method Overloading’teki Kısıtlamalar Geçerlidir) Örneğin, Hem Instance Yaratan, Hemde Instance’ın Özelliklerini Değiştiren Bir Constructor : Obje Class’ındaki Değişkenler, Her Instance İçin Ayrı Ayrı Yaratılır. Dolayısıyla Her Instance’a Verilen Değerler Farklılık Gösterir. Bu Örnekte, Farklı Değerlere Sahip 2 Kisi Instance’i Yaratiliyor. Ve Özellikleri Ekrana Bastırılıyor. Misal Tek Tek Her Instance Icin Ekrana Basma Isini Yazacagimize Class’a Bir Method Olusturup, Instance’ların Her Birinden Bu Methodu Çağırabiliriz. İlk Senaryomuza Dönecek Olursak, (Kart Oyunu) Başlangıçta İki Objeye İhtiyacımız Var. Kart Ve Deste. Kart Objesi Bir Oyun Kartını Temsil Edecek. Her Kartın Bir Sembolü, Bir Değeri, Bir Önyüz, Arkayüz Resmi, Kartın Açık Yada Kapalı Olma Durumu Olmalı. Deste İse, İçinde Belirli Bir Sayıda Kart Bulundurmalı. Bu Kartları Oluşturup, Oyunu Oynamak İçin Karıştırmalı, İstenildiği Zaman, (Oyunculara Verilmek İçin Yada Masaya Koymak İçin) Desteden Kart Çekilebilmeli. Emir Civaş – i.am@live.jp Sayfa 7 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Bu Class’larla Oyun Problemimizin 2 Parçasını Tamamladık Aslında. Hem Kart, Hem Deste Kendi Başına Bir Takım Değerler Tutup, İşler Yapabiliyorlar. Deste, Kart Instance’ları Oluşturup Kullanıyor. Emir Civaş – i.am@live.jp Sayfa 8 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Inheritance – Kalıtım Kalıtım, Nesneye Yönelik Programlamada Önemli Bir Konudur. Kalıtım, Bir Class’ın Başka Bir Class’ın Özelliklerine & Methodlarına Sahip Olması Kavramıdır. Başka Bir Class’a Kendi Özelliklerini Veren Class’a SuperClass, Başka Bir Class’tan Özellikler Alan Class’a SubClass Denir. SubClass, SuperClass’tan Özellikler Alabildiği Gibi, Kendi İçindede Özellikler Tanımlayabilir. ÖNEMLİ : Bir SuperClass Oluşturacağınız Zaman Null Constructor’ı Kullanmasanızda Implement Etmek Zorundasınız! Örneğin 2 Class’ımız Var. Canlı Ve İnsan. Canlıda Belirli Özellikler & Methodlar Oluşturup, Bunu Inheritance İle Insan Class’ına Aktarıcaz. (Interitance İçin Kullanılan Anahtar Kelime extends) ÖNEMLİ : Bir Class Sadece Bir Class’ı Extend Edebilir, 2.yi Edemez! Yukarıdaki Snippet’ta i Instance’i Oluşturulduğunda Once Canli Instance’i Oluşturulur, Sonra Insan Instance’i Constructor’ı Çağrılır. Standart Olarak Super Class’ın Null Constructor’ı Çağrılır. Eğer Extends Ettiğiniz Class’ın Null Constructor’ını Değil, (Tanımlanmışsa) Başka Bir Constructor’ını Çağırmak İstiyorsanız, SubClass’ın Constructor’ında (Ilk Statement Olarak!) super(...) Statement’ını Kullanabilirsiniz. Inheritance Konusunda Derinlik Sınırı Yoktur. (Her Ne Kadar 5 Seviye Üstü Tavsiye Edilmesede) Örneğin : A extends B, B extends C, C extends B İse C Hem A’nın, Hem’de B’nin Özelliklerini Taşır. C’nin Super Class’ı B, B’nin Sub Class’ı C, B’nin Super Class’ı A, A’nın Sub Class’ı B’dir. Inheritance’da Classlar Super Clas Tipinde Parametre Olarak Verilebilir. Gerçekte Ne Class’ı Olduğunu Anlayabilmek İçin instance of İle Koşul Kullanılabilir. Emir Civaş – i.am@live.jp Sayfa 9 22.06.2013 – Wissen Akademie Java / Android Ders Notları #3 Polymorphism – Çok Şekillilik En Baştaki Method Overloading Konusunu Hatırlayın. Bir Class’taki Methodun Tekrar Tanımlanmasına Method Overloading Deniyordu. Eğer 2 Class Arasında Bir Inheritance Söz Konusu İse, Ve Super Class’ta Implement Edilen Bir Method, Sub Class’ta Tekrar Tanımlandıysa (Ki Buna Method Overloading Değil, Method Overriding Deniyor) Bu Bir Polymorphism – Çok Şekillilik Örneğidir. Aynı Methodun, Birbirine Bağlı 2 Class’ta Farklı İşler Yapması Durumu. Kalıtım Konusundaki Canlı – Insan Class Orneklerinde, Insan Class’ında yemekYe() Methodu Tekrar Implement Edilseydi, Ve Başka Şekilde Çalışsaydı; Bu Bir Polymorphism Olacaktı. Veya Canli Class’ını Extends Eden Bir Bitki Class’ı Daha Olduğunu Düşünün. Bitkiler (^o^) Şeklinde Beslenemeyecekleri İçin, Doğal Olarak YemekYe Methodunu Bu Class’ta Override Etmemiz Gerekirdi. ÖNEMLİ : Her Inheritance Durumunda, Polymorphism Olacak Diye Bir Kaide Yok Ama İşin İçinde Polymorphism Varsa Mutlaka Interitance’da Vardır. Eğer Zaten Inheritance Yoksa O Polymorphism Değildir. Tek Class’ta Yapılan Methodların Tekrar Tanımlanma İşine Method Overloading Inheritance’in Söz Konusu Olduğu Classlarda Methodların Tekrar Tanımlanma İşine Method Overriding Denir Objeler’de “this” Küllanımı Ve Statik Alanlar Dedik ki; Bir Obje Class’ında Tanımlanan Değişkenler, Her Instance İçin Ayrı Ayrı Oluşturulmaktadır. Ama Bazı Durumlarda Her Instance İçin Ortak Kullanılan Değişkenlere İhtiyacımız Olabilir (Örneğin Yaratılan Instance Sayısını Takip Etmek İstersek). Bunun İçin Obje Class’ına static bir Özellik Ekleriz. Bu Özellik Bir Kere Oluşturulur Ve Her Instance Bu Değişkeni Ortak Olarak Kullanır. this kelimesi Bir Objenin O An Çalışan Instance’ını İfade Etmek İçin Kullanılır. Access Modifiers – Erişim Denetleyicileri Bir Class’taki Değişkenlerin & Methodların, Başka Classlar Tarafından Erişilip Erişilemeyeceğini Belirten Kelimelerdir : public Değişken Yada Method Herkese Açıktır private Değişken Yada Method Sadece O Class İçinde Kullanılır protected Değişken Yada Method Sadece O Paket İçinde Kullanılır Emir Civaş – i.am@live.jp Sayfa 10