İLERİ PROGRAMLAMA - Ünite 5: Java’da Sarmalama, Kalıtım ve Çok Biçimlilik Özeti :
PAYLAŞ:Ünite 5: Java’da Sarmalama, Kalıtım ve Çok Biçimlilik
Giriş
Bu ünitedeki işleyeceğimiz konu başlıklarına geçmeden önce nesneye yönelik programlama ile ilgili temel kavramları bir hatırlayalım. Önceki ünitelerde edindiğimiz bilgilerin de ışığında nesneler ve sınıflar arasındaki bağlantıyı şu şekilde tarif edebiliriz. Nesne, bir sınıfın gerçek hayattaki bir örneğidir. Örneğin insan isminde bir sınıf tanımlamış olduğumuzu varsayalım. Kendimiz ve etrafımızda her bir birey bu sınıfın örnekleridir. Dolayısıyla kendimiz ve etrafımızdaki bireylerin insan sınıfı türünde bir nesne olduğumuzu söyleyebiliriz. Sınıf ve nesne kavramlarının üzerine bir takım bilgiler inşa edeceğimiz için önceki ünitelerdeki bahsedilen temel kavramları anımsadık. Hatırlanacağı üzere nesneye yönelik programlamanın sarmalama, kalıtım, çok biçimlilik ilkelerinden önceki ünitelerimizde bahsedilmişti. Bu ünitede bu kavramlardan üzerinde daha ayrıntılı duracağız. Ünitenin devamında ilk olarak sarmalama kavramını ayrıntılı örnekler ile öğreneceğiz.
Sarmalama, her bilgiye her kaynağın ulaşamaması amacıyla geliştirilmiş bir terminolojidir. Nesneye yönelik programlamadan bahsettiğimiz için burada kaynakların sınıflar ve bu sınıflar türündeki nesneler olduğunu söyleyebiliriz. Bu konudan bahsederken bu sınırlamanın belirli anahtar kelimeler kullanılarak gerçekleştirilebileceğini öğreneceğiz. Kalıtım, tıpkı biyolojik olarak canlıların sınıflandırılması gibi sınıfların da hiyerarşik bir şekilde ifade edilmesidir. Çok biçimlilik, kalıtım kavramı ile doğrudan ilgilidir ve temel olarak bir nesnenin davranış şekillerinin duruma göre değişebilmesidir. Kalıtım kavramı gereği, kedi ve köpeği hayvan isimli bir sınıfın altında hiyerarşik olarak ifade edebiliriz. Genel olarak hayvanlar için ses çıkar komutunun olduğunu ve bunların hayvan sınıfı içerisinde tanımlandığını düşünelim. Kedi ve köpek için bu komut verildiğinde çıkan ses gözlemlenebilecek fakat iki tür için de bu sesler farklı olacaktır. Bu durumu çok biçimlilik kavramına temel bir örnek olarak verebiliriz.
Sarmalama
Sarmalama, bir nesnenin özelliklerinin ve metotlarının erişimini sınırlandırmak amacını taşıyan bir kavramdır. Örneğin bir sürücü aracın kontak anahtarını çevirdiğinde çalıştığını veya çalışmadığını gözlemleyebilir. Ancak bu işlemin gerçekleştirilebilmesi için arka planda araç donanımlarının yaptığı eylemleri gözlemleyemez. Sonuç itibariyle bu eylemlerin ne şekilde gerçekleştirildiği sürücü için değil daha çok bir araç bakım teknisyeni için önemlidir. Bu sebeple bu eylemlerin gerçekleşmesi ile ilgili ayrıntılar araç sürücüsünden gizlenebilir. Nesneye yönelik programlama dillerinde özelliklerin ve metotların erişim yetkilendirmelerinin yapılması için erişim belirleyicileri kullanılır.
Bu erişim belirleyicilerinin sağladığı yetkilendirmelere göre bir sınıfın özellik ve metotlarına aynı sınıf içerisinden, aynı paket içerisindeki sınıflardan, diğer sınıflardan ve ilgili sınıftan kalıtım yoluyla türeyecek sınıflardan erişilebilmesi mümkün olmaktadır. Java programlama dilinde özelliklerin ve metotların tanımlarında yer alan dört erişim belirleyicisi vardır. Bunlar private, public, protected anahtar kelimeleri ve bu üç anahtar kelimesinin de olmadığı varsayılan (default) olarak adlandırılan durumdur.
Sarmalama kavramını anlatırken daha çok private ve public erişim belirleyicilerini kullanacağız. Katı bir şekilde bilgi gizleme durumu söz konusu olduğunda private erişim belirleyicisinin kullanılması uygun olacaktır. Bu anahtar kelimelerin kullanımını göstermek için aşağıdaki Java kodunu inceleyeceğiz. AnahtarKelimeKullanimi isimli Java sınıfı içerisinde ozellik1’in private, ozellik2’nin public, ozellik3’ün protected ve ozellik4’ün varsayılan erişim belirleyicileri ile tanımlandığını görmekteyiz. Bu dört özelliğin hepsinin türleri int olmakla birlikte erişim yetkilendirmeleri farklılıklar içermektedir.
/* AnahtarKelimeKullanimi.java */
public class AnahtarKelimeKullanimi {
private int ozellik1;
public int ozellik2;
protected int ozellik3;
int ozellik4;
}
Bu kavrama verebileceğimiz bir diğer örnekte aşağıda Java kodları verilmiş olan sınıflardır. Ogrenci isimli Java sınıfında ogrenciIsim özelliğinin private anahtar kelimesi ile tanımlandığını görmekteyiz. Bu durumda OgrenciUygulamasi isimli sınıf içerisinde tanımlanmış olan ogrenci1 nesnesinin bu özelliğe erişimi mümkün olmayacaktır. Ancak Ogrenci isimli sınıfta tanımladığımız isimAta ve isimGetir metotları vasıtasıyla bu özelliğinin değerine ulaşılabilmesi ve değiştirilmesi mümkün olacaktır. Örnekte de gördüğümüz üzere bahsedilen bu iki metot public anahtar kelimesi ile tanımlanmıştır.
/* Ogrenci.java */
public class Ogrenci {
private String ogrenciIsim; public void isimAta(String ad){
ogrenciIsim = ad;
}
public String isimGetir( ) {
return ogrenciIsim;
}
}
/* OgrenciUygulamasi.java */
public class OgrenciUygulamasi {
public static void main(String[] args) {
Ogrenci ogrenci1 = new Ogrenci();
ogrenci1.isimAta(“Ahmet”);
System.out.println(“Öğrencinin adı : “+ogrenci1.isimGetir());
}
}
Paket kavramı: Java programlarında kullanılan ve sınıfların hiyerarşik olarak kataloglanmasına imkân sağlayan bir kavramdır. Bu kavram sayesinde ilgili sınıflar aynı dizin içerisinde yer almış olurlar.
Private kavramı: Bu erişim belirleyicisi ile tanımlanan özelliklere ve metotlara sadece ilgili sınıf tarafından erişilebilir.
Public kavramı: Bu erişim belirleyicisi ile tanımlanan özelliklere ve metotlara bütün sınıflar erişilebilir.
Protected kavramı: Bu erişim belirleyicisi ile tanımlanan özelliklere ve metotlara ilgili sınıf, aynı paket içerisindeki diğer sınıflar ve bu sınıftan kalıtım yoluyla türeyecek sınıflar tarafından erişilebilir.
Varsayılan (Default) kavramı: Bu erişim belirleyicisi ile tanımlanan özelliklere ve metotlara sadece ilgili sınıf ve aynı paket içerisindeki diğer sınıflar tarafından erişilebilir.
Özetle, kitabın bu bölümünde nesneye yönelik programlamanın temel prensibleri olan sarmalama, kalıtım ve çok biçimlilik kavramları ayrıntılı bir şekilde ele alınmıştır. Sarmalama, belirli bir bilgiye farklı kaynakların ihtiyacı olduğu seviyede erişiminin sağlanması ve erişimin gerekli olmadığı bölümlerin gizlenmesidir. Nesneye yönelik programlamadan bahsettiğimiz için bilgi kavramı özellik ve metotları, kaynaklar ise sınıfları temsil etmektedir. Dolayısıyla belirli özellik ve metotlara farklı sınıfların erişim yetkileri sarmalama yoluyla kısıtlanabilmektedir. Bu konuya günlük hayatımızdan temel bir örnek olarak bir sürücünün arabayı çalıştırması eylemi verilmiştir. Bu örnekte bir sürücünün kontak anahtarını çevirdiğinde aracın çalıştığını veya çalışmadığını görebildiği ancak bu işlemin gerçekleştirilebilmesi için arka planda araç donanımlarının yaptığı eylemleri gözlemleyemediğinden bahsedilmiştir.
Kalıtım
Kalıtım, nesneye yönelik programlamanın temel kavramlarından birisidir. Bu kavram sayesinde sınıfları hiyerarşik bir şekilde ifade edebiliriz. Bu sayede yazılan program kodlarının yeniden kullanılabilirliği de artar. Bir sınıftan kalıtım yoluyla yeni bir sınıf türetildiğinde bu yeni sınıfa alt sınıf denilir. Mevcut sınıf ise üst sınıf olarak adlandırılır.
Kalıtım kavramına günlük hayatımızdaki sınıflardan temel bir örnek verecek olursak (kitapta Şekil 5.1), Çalışan ve Öğrenci isimli sınıfların İnsan isimli sınıftan kalıtım yoluyla türemiş olduğu görülmektedir. Çalışan ve Öğrenci sınıfları alt sınıf olarak adlandırılırken İnsan sınıfı üst sınıf olarak tanımlanmaktadır.
Verilen örneğin basit bir kodla yazarsak;
/* Insan.java */
public class Insan {
}
/* Calisan.java */
public class Calisan extends Insan {
}
/* Ogrenci.java */
public class Ogrenci extends Insan {
}
Yukarıda ki örnekte Ogrenci ve Calisan isimli sınıfların birer üst sınıfı olduğunu görmekteyiz. Büyük çapta programlar yazılırken bu yapının tek bir seviyede sonlanmayabilir ve bir hiyararşi şeklinde büyüyebilir. Daha detaylı bir örneği inceleyecek olursak (bakınız kitapta Şekil 5.2) Bu örnekte, Calisan isimli sınıftan kalıtım yoluyla tam zamanlı çalışan ve kısmı zamanlı çalışan olmak üzere 2 sınıf daha türetildiğini görmekteyiz.
Kalıtım kavramı içerisinde aşırı yükleme (overloading) ve ezme (overriding) kavramları sıklıkla kullanıldığı için bu kavramlara şimdi kısaca değineceğiz. Aşırı yükleme kavramı, sınıflar içerisinde aynı isimde olmakla birlikte farklı parametreler alan metotların bulunmasıdır.
Özetle, kalıtım kavramı ise tıpkı biyolojik olarak canlıların sınıflandırılması gibi sınıfların da hiyerarşik bir şekilde ifade edilmesidir. Bu konuya temel bir örnek olarak bir kedinin hayvanlar sınıfına, bir menekşenin bitkiler sınıfına dâhil olması durumunu verebiliriz. Kalıtım yoluyla bir sınıftan başka sınıflar türetildiğinde bu sınıfın özellik ve metodları türetilen yeni sınıfa aktarılır. Bu durumda türetilen yeni sınıfa alt sınıf, mevcut sınıfa ise üst sınıf denilir.
Kalıtım kavramı sayesinde yazılan program kodlarının yeniden kullanılabilirliği de artmaktadır. Kalıtım başlığı altında aşırı yükleme ve ezme kavramları hakkında da bilgi verilmiştir. Aşırı yükleme, sınıflar içerisinde aynı isimde olmakla birlikte farklı parametreler alan metotların bulunmasıdır. Ezme ise mevcut bir sınıftan kalıtım yoluyla başka bir sınıf türetildiği durumda mevcut sınıfta bulunan bazı metotların bu yeni sınıfta içerikleri farklı olarak yeniden tanımlanmasıdır.
Çok Biçimlilik
Çok biçimlilik, temel olarak bir nesnenin davranış şekillerinin duruma göre değişebilmesidir. Aynı temel sınıftan türetilmiş olan sınıflarda paylaşılan aynı isme sahip metodların bu sınıflarda farklı şekillerde uyarlanabilmesi mümkündür. Bu durum için günlük hayatımızdaki sınıflardan şu şekilde bir örnek verebiliriz. Canlı isminde bir sınıf ve bu sınıftan türemiş olan balık ve kuş isimli başka sınıflar olduğunu düşünelim. Canlı sınıfı içerisinde hareket et adında bir komut bulunsun. Hareket et komutu, balık ve kuş sınıfları için farklı şekillerde gerçekleştirilmelidir. Balık sınıf bu eylemi yüzerek gerçekleştirirken kuş sınıfı yürüyerek veya uçarak gerçekleştirecektir. Bu eylemin nasıl gerçekleştirileceği ise çalışma anında eylemi yapan canlının balık mı kuş mu olacağına göre anlık olarak belirlenmelidir. Bu durumda balık ve kuş sınıflarında aynı isimdeki bu metot farklı şekillerde tekrar tanımlanmalı ve bu yolla canlı sınıfındaki metot ezilmelidir.