Java Jenerik Listeler
Java meraklısı yazılım sevelerlere tekrar merhabalar :)
Java ile nesne yönelimli programlamayı önceki makale dizimizde öğrendikten sonra örneklerimizin soyut kalmaması adında bundan sonraki makalelerimizde daha aktif örneklerle yolumuza devam edeceğiz.Tabi konuya balıklama dalmadan önce Java'da önemli yeri olan jenerikleri (Generic) ve jenerik listeleri (Generic Lists) öğreneceğiz.
Jenerikleri kabaca tanımlamak gerekirse, kendisine parametre gibi bir tip tanımlanan sınıf içindeki üyelerin o tipe göre hareket etmesi anlamına gelmektedir.
Yukarıdaki satırı yalnızca jenerik kavramını özet olarak bilin diye anlattım çünkü çok özel ve kapsamlı bir konu olan jenerikleri öğrenmekten ziyade jenerik listeleri öğreneceğiz.
Generik Lists; kendisine tanımlanan bir tipin öğelerini barındıran bir listeleme şeklidir.Nasıl ki daha önce diziler makalemizde dizinin içine int
gibi sayıları ve string gibi düze metinleri koyarak veri tiplerini depolıyorsak jenerik listelerde daha kapsamlı halde depolama yapabiliyoruz.
Jenerik listeler int,String,byte gibi ilkel tipleri depolayabildiği gibi kendi özel sınıflarımızdan türettiğimiz nesneleri de depolayabilmektedir.
Örnek olarak içeriğinde int tipinde sayıları barındıracak bir jenerik sınıf tanımlayalım:
Şimdi de kendi sınıfımızdan instance aldığımız bir tipi barındıran generic list tanımlayalım:
Yukarıdaki jenerik liste tanımlamaları arasındaki farkı anlamışsınızdır umarım. :)
Anlamadığınız tek konu ArrayList olayı ise şöyle açıklayalım: jenerik liste dediğimiz yapı daha önce OOP makalelerimizin konusunda olan abstract (özet) yapıdadır ve abstract sınıftan new anahtar sözcüğüyle instance alamayız.Doğal olarak jenerik listelere en yakın dizi yapısı olan ArrayList sınıfı jenerik tipte olduğu için ArrayListi kullandık.
(Bu paragrafta çok detaya takılmanız yerine mantığı anlamanızı öneririm)
Jenerik listeler tıpkı basit diziler gibi davranırlar ancak yukarıdaki örnekte fark ettiğiniz gibi dizinin boyutuyla ilgili herhangi bir tanımlama yapmadık.Ancak klasik dizilerde hatırlarsanız şu şekilde bir boyut tanımlama yapıyorduk:
//En çok int tipinde sayı barındırabilen basit bir dizi
ve yine hatırlarsanız boyutu baştan tanımlanmış olan bir dizinin boyut sınırını aştığımızda programımız patlıyordu; bunun nedeni 5 sayı kapasiteli bir diziye 6. elemanı eklemeye çalıştığımızda 6. eleman bilgisayarımızın RAM belleğinde boş yer olmadığı içindi. (o dizi için tanımlanan bellek alanı)
Ancak jenerik listeler dinamik bir bellek yapısına sahip olduğu için içerisine eleman ekledikçe önceden eklenen verileri kaybetmeden kendi RAM alanını kendi genişletebiliyor.Bu sayede biz yazılımcılar için yemede yanında yat misali bir veri yönetimi şansı sunmaktadır.
Ayrıca; generic list yapısı büyük bellek gerektiren veriler için tasarlandığı için klasik dizilere göre daha hızlı performans göstermektedir.
Son olarak jenerik listler tip güvenli (type safe) yapıdadırlar.Bu ne demek derseniz şu demektir: Ogrenci sınıfının örneklerini (instance) barındıran biri jenerik sınıfa kalkıpta String bir veri ekleyemezsiniz.Bu sayede hata program çalışmaya başladığı anda (runtime) değil biz programı kodlarken birşeylerin yanlış gittiğini söylemektedir.
Oldukça uzun bir açıklamadan sonra nihayet örneklerimize başlayabiliriz. :)
Şimdi NetBeans IDE'mizi açarak yeni bir Java projesi oluşturalım ve JFrame'e yeni bir buton ekledikten sonra butonumuzun ActionPerformed eventine örneklerimizi yazalım:
Basitten kolaya doğru gidelim ve içerisinde düz metin olan String ifadeler içerecek bir jenerik liste kuralım:
Eğer projenizde ilk kez jenerik sınıf kullanacaksanız projenize kütüphaneyi eklemek zorundasınız demektir:
Bir jenerik sınıfa veri eklemek için Add (Ekle) metodunu kullanıyoruz:
Jenerik olarak oluşturulan bir sınıfın eleman sayısını Size() metodu ile yakalıyoruz:
Jenerik listenin içindeki bir elemana ulaşmak için Get() metodunu kullanırız,bu metot bizden parametre olarak dizinin kaçıncı elemanını istediğimizi sorar.Örneğin 3 elemanlı bir dizinin ikinci elemanını istiyorsak;
dizi.Get(1); //1.index
şeklinde bir kod satırı kullanırız,ancak bu örneğimizde bütün elemanları listeleyelim ve bunun için dizideki tüm elemanlara for döngüsü yardımıyla ulaşıyoruz.
For döngüsü sayesinde bir dizideki elemanlara sırasıyla indeks değeri vererek ulaşırız:
Buraya kadar jenerik listeleme yapısını öğrendik ama işin asıl güzelliği bundan sonra başlıyor çünkü jenerik liste ile tip dizisini öğreneceğiz.
Öncelikle belirtmek isterim ki tip dediğimiz kavram List ifadesindeki T harfine denk gelmektedir ve bu tip String,int olabildiği gibi kendi yazacağımız bir sınıfta olabilir.Evet doğru okudunuz daha önce öğrendiğimiz sınıfları artık listeleyebiliyoruz,pek nasıl?
Bilgisayar adında bir sınıfımız olsun:
Butonumuzun actionperformed olayına geri dönelim ve bu bilgisayar class'ından yeni bir instance alalım ve sınıf
üyeleri olan propertylere değerler verelim:
Ardından bu sınıfı depolayacak bir jenerik liste oluşturalım:
Oluşturduğumuz listeye bilgisayar sınıfının örneğini Add() metodu ile ekleyelim:
Gördüğünüz gibi bir sınıfın örnek kopyasını dinamik bir diziye atmayı öğrendik,işte tam bu esnada nesne yönelimli programlamanın nimetlerine şahit oldunuz demektir.
Örneğimize devam edelim ve jenerik listemize bir bilgisayar daha ekleyelim:
Son olarak nesne yönelimli programlamanın güzel bir noktasına daha değineceğiz; jenerik listedeki bir eleman bilgisayar sınıfından türemiş bir örneğe sahipse diyoruz ki jenerik listenin ikinci elemanının işlemci markasını ver:
Buradaki mantık polymorphism ve encaptulation mantığına dayanmaktadır ve şöyle açıklanabilir: madem jenerik bir listeye bir sınıfı T tipinde tanımlayabiliyorsak o halde o listenin içindeki her eleman Bilgisayar sınıfının Islemci property'sine de sahip olabilmektedir.
Yani ilkokuldan beri matematik dersinde gördüğümüz kümeler konusunun tümleyen tümlenen kapsayan artık her neyse o konuya benzetebiliriz :)
Java Generic List konusunu öğrendiğimize göre bir sonraki makalemizde görüşmek üzere hoşçakalın esen kalın :)
Java ile nesne yönelimli programlamayı önceki makale dizimizde öğrendikten sonra örneklerimizin soyut kalmaması adında bundan sonraki makalelerimizde daha aktif örneklerle yolumuza devam edeceğiz.Tabi konuya balıklama dalmadan önce Java'da önemli yeri olan jenerikleri (Generic) ve jenerik listeleri (Generic Lists) öğreneceğiz.
Jenerikleri kabaca tanımlamak gerekirse, kendisine parametre gibi bir tip tanımlanan sınıf içindeki üyelerin o tipe göre hareket etmesi anlamına gelmektedir.
Yukarıdaki satırı yalnızca jenerik kavramını özet olarak bilin diye anlattım çünkü çok özel ve kapsamlı bir konu olan jenerikleri öğrenmekten ziyade jenerik listeleri öğreneceğiz.
Generik Lists; kendisine tanımlanan bir tipin öğelerini barındıran bir listeleme şeklidir.Nasıl ki daha önce diziler makalemizde dizinin içine int
gibi sayıları ve string gibi düze metinleri koyarak veri tiplerini depolıyorsak jenerik listelerde daha kapsamlı halde depolama yapabiliyoruz.
Jenerik listeler int,String,byte gibi ilkel tipleri depolayabildiği gibi kendi özel sınıflarımızdan türettiğimiz nesneleri de depolayabilmektedir.
Örnek olarak içeriğinde int tipinde sayıları barındıracak bir jenerik sınıf tanımlayalım:
Şimdi de kendi sınıfımızdan instance aldığımız bir tipi barındıran generic list tanımlayalım:
Yukarıdaki jenerik liste tanımlamaları arasındaki farkı anlamışsınızdır umarım. :)
Anlamadığınız tek konu ArrayList olayı ise şöyle açıklayalım: jenerik liste dediğimiz yapı daha önce OOP makalelerimizin konusunda olan abstract (özet) yapıdadır ve abstract sınıftan new anahtar sözcüğüyle instance alamayız.Doğal olarak jenerik listelere en yakın dizi yapısı olan ArrayList sınıfı jenerik tipte olduğu için ArrayListi kullandık.
(Bu paragrafta çok detaya takılmanız yerine mantığı anlamanızı öneririm)
Jenerik listeler tıpkı basit diziler gibi davranırlar ancak yukarıdaki örnekte fark ettiğiniz gibi dizinin boyutuyla ilgili herhangi bir tanımlama yapmadık.Ancak klasik dizilerde hatırlarsanız şu şekilde bir boyut tanımlama yapıyorduk:
//En çok int tipinde sayı barındırabilen basit bir dizi
ve yine hatırlarsanız boyutu baştan tanımlanmış olan bir dizinin boyut sınırını aştığımızda programımız patlıyordu; bunun nedeni 5 sayı kapasiteli bir diziye 6. elemanı eklemeye çalıştığımızda 6. eleman bilgisayarımızın RAM belleğinde boş yer olmadığı içindi. (o dizi için tanımlanan bellek alanı)
Ancak jenerik listeler dinamik bir bellek yapısına sahip olduğu için içerisine eleman ekledikçe önceden eklenen verileri kaybetmeden kendi RAM alanını kendi genişletebiliyor.Bu sayede biz yazılımcılar için yemede yanında yat misali bir veri yönetimi şansı sunmaktadır.
Ayrıca; generic list yapısı büyük bellek gerektiren veriler için tasarlandığı için klasik dizilere göre daha hızlı performans göstermektedir.
Son olarak jenerik listler tip güvenli (type safe) yapıdadırlar.Bu ne demek derseniz şu demektir: Ogrenci sınıfının örneklerini (instance) barındıran biri jenerik sınıfa kalkıpta String bir veri ekleyemezsiniz.Bu sayede hata program çalışmaya başladığı anda (runtime) değil biz programı kodlarken birşeylerin yanlış gittiğini söylemektedir.
Oldukça uzun bir açıklamadan sonra nihayet örneklerimize başlayabiliriz. :)
Şimdi NetBeans IDE'mizi açarak yeni bir Java projesi oluşturalım ve JFrame'e yeni bir buton ekledikten sonra butonumuzun ActionPerformed eventine örneklerimizi yazalım:
Basitten kolaya doğru gidelim ve içerisinde düz metin olan String ifadeler içerecek bir jenerik liste kuralım:
Eğer projenizde ilk kez jenerik sınıf kullanacaksanız projenize kütüphaneyi eklemek zorundasınız demektir:
Bir jenerik sınıfa veri eklemek için Add (Ekle) metodunu kullanıyoruz:
Jenerik olarak oluşturulan bir sınıfın eleman sayısını Size() metodu ile yakalıyoruz:
Jenerik listenin içindeki bir elemana ulaşmak için Get() metodunu kullanırız,bu metot bizden parametre olarak dizinin kaçıncı elemanını istediğimizi sorar.Örneğin 3 elemanlı bir dizinin ikinci elemanını istiyorsak;
dizi.Get(1); //1.index
şeklinde bir kod satırı kullanırız,ancak bu örneğimizde bütün elemanları listeleyelim ve bunun için dizideki tüm elemanlara for döngüsü yardımıyla ulaşıyoruz.
For döngüsü sayesinde bir dizideki elemanlara sırasıyla indeks değeri vererek ulaşırız:
Buraya kadar jenerik listeleme yapısını öğrendik ama işin asıl güzelliği bundan sonra başlıyor çünkü jenerik liste ile tip dizisini öğreneceğiz.
Öncelikle belirtmek isterim ki tip dediğimiz kavram List
Bilgisayar adında bir sınıfımız olsun:
Butonumuzun actionperformed olayına geri dönelim ve bu bilgisayar class'ından yeni bir instance alalım ve sınıf
üyeleri olan propertylere değerler verelim:
Ardından bu sınıfı depolayacak bir jenerik liste oluşturalım:
Oluşturduğumuz listeye bilgisayar sınıfının örneğini Add() metodu ile ekleyelim:
Gördüğünüz gibi bir sınıfın örnek kopyasını dinamik bir diziye atmayı öğrendik,işte tam bu esnada nesne yönelimli programlamanın nimetlerine şahit oldunuz demektir.
Örneğimize devam edelim ve jenerik listemize bir bilgisayar daha ekleyelim:
Son olarak nesne yönelimli programlamanın güzel bir noktasına daha değineceğiz; jenerik listedeki bir eleman bilgisayar sınıfından türemiş bir örneğe sahipse diyoruz ki jenerik listenin ikinci elemanının işlemci markasını ver:
Buradaki mantık polymorphism ve encaptulation mantığına dayanmaktadır ve şöyle açıklanabilir: madem jenerik bir listeye bir sınıfı T tipinde tanımlayabiliyorsak o halde o listenin içindeki her eleman Bilgisayar sınıfının Islemci property'sine de sahip olabilmektedir.
Yani ilkokuldan beri matematik dersinde gördüğümüz kümeler konusunun tümleyen tümlenen kapsayan artık her neyse o konuya benzetebiliriz :)
Java Generic List konusunu öğrendiğimize göre bir sonraki makalemizde görüşmek üzere hoşçakalın esen kalın :)