Program Yazmaya Giriş 

Programlamaya yeni başlayanlar için, öğrenmenin en iyi yolu kitaplarda yazılan küçük programları usanmadan yazmak, derlemek ve çalıştırmaktır. Bu küçücük programlar, bilgisayarın yapabileceği bütün işleri size öğretecektir. Unutmayınız ki, büyük programlar bu küçücük programların birleşmesiyle oluşur. O nedenle, bu derste yazılacak küçük programların, programlamayı öğrenmenin biricik yolu olduğunu aklınızdan çıkarmayınız. Burada izlenecek aşamaların herhangi birisinde yapılacak yanlışlar, öğrenciyi bıktırmamalıdır. Aksine, programlamayı çoğunlukla yaptığımız yanlışlardan öğreniriz. O nedenle, yanlış yapmaktan korkmayınız. Üstelik yeni bir şey öğrenirken bilerek yanlışlar yapıp onun doğurduğu sonuçları görmek eğlenceli ve öğretici olabilir. 

Bilgisayarınızda  JSDK’ nın  kurulu olduğunu varsayıyoruz. Bunu kurmak istemeyenler Java derleyicisi ile de yetinebilirler. Biz bu derste Java JSDK’nın kurulduğunu ve gerekli konfigürasyonların yapıldığını varsayıyoruz. Eğer bu işler yapılmamışsa, önce kurulum işlemlerini yapmalısınız. Kurulumun nasıl yapılacağı ilgili web sayfalarından görülebilir. Windows İşletim Sisteminde JSDK kurulumu için Birinci Bölüme bakınız.

İlerleyen haftalarda Eclipse, Netbeans, vb. bir bütünleşik uygulama geliştirme aracı (IDE- Integrated Development Environment) kullanmaya başlayacağız. Bu tür araçların uygulama geliştirmede ne kadar yararlı ve kolay kullanılır olduğunu göreceksiniz. Ama bu tür bir aracı hemen kullanmaya başlamak, binanın tepesine asansörle çıkmak gibidir. Aşağı katlarda ne olup bittiğini anlamak için, en aşağıdan başlayıp medivenleri adım adım çıkmalıyız. Başlangıçta atacağımız bu zahmetli adımlar, kaynak programın yürütülebilir bir programa nasıl dönüştüğünü anlamamızı sağlayacaktır.

O nedenle, ilk derslerde hiçbir görsel arayüz kullanmadan, işlerimizi doğrudan doğruya işletim sisteminin komutlarıyla göreceğiz. Böyle yapabilmek için, Windows’un Komut İstemi kipini açacak ve DOS (Disk Operating System) komutları yazacağız. Windows 7 İşletim sisteminde Komut İstemi’ni aşağıdaki iki yoldan birisiyle açabilirsiniz:

Başlat -> Çalıştır  sekmelerine basınca açılan pencerede Search Programs and Files: -----   kutucuğuna  cmd  yazıp  entere basınız.

Başlat -> Tüm Programlar -> Donatılar sekmelerinden sonra açılan alt pencereden Komut İstemi (Command Prompt) sekmesine tıklayınız.

Windows’un farklı sürümleri için de benzer işler yapılabilir. Yukarıdakilerden birisini yaptığınız zaman, ekranda siyah zemin üzerine beyaz yazılar yazılan Komut İstemi (Command Prompt) penceresinin açıldığını göreceksiniz. Bu pencereye istediğiniz dos komutunu yazabilir ya da yürütülebilir (executable) herhangi bir programı çalıştırabilirsiniz.

Şimdi yazdığımız programları içine kaydedeceğimiz bir dizin yaratalım. İstediğiniz sürücüde istediğiniz adla bir dizin ya da alt dizin yaratıp Java programlarınızı oraya kaydedebilirsiniz. Programlarımızı C: sürücüsünde yaratacağımız jprg dizini içine kaydetmek isteyelim. Bunun için şu komutları yazacağız:

md C:\jprg

cd C:\jprg

Bunlardan birincisi olan md (make directory) komutu istediğimiz dizini yaratır. İkincisi olan cd (change directory) komutu ise o dizini etkin kılar. Basit bir deyişle, sistemin yazma/okuma kafası o dizin içine girer ve orada yazabilir ve okuyabilir. Dizine girdiğimizi, Komut İstemi ekranında beliren

C:\jprg>

görüngesinden anlarız.  Bu simgeler daima Komut İstemi penceresinde görünecektir; etkin olan dizini gösterir. Dos komutlarını  c:\jprg>  etkin (prompt) simgesinden hemen sonra yazacağız. Şimdi program yazmamıza yardım edecek basit bir editör açalım. Komut İstemi penceresinde edit yazıp Enter tuşuna basınız:

edit

Eğer editör penceresi açılmazsa, sisteminiz edit.com  dosyasını görecek biçimde ayarlı değildir. Bunu PATH çevre değişkeni ile ayarlayabilirsiniz. Ama, şimdi zaman kaybetmemek için, edit.com  dosyasının bulunduğu adresi tam yazarak, editörü açabiliriz:

C:\WINDOWS\system32\edit 

Açılan editörde aşağıdaki programı yazıp Dosya sekmesinden Farklı Kaydet seçeneğine basınız. Açılan alt pencerede Dosya Adı yerine Program001.java yazıp Enter tuşuna basınız. İsterseniz yazma ve kaydetme işini Notepad ile de yapabilirsiniz.

Program001.java

class Program001

{

}

 

İpucu

Java kaynak programlarının dosya adlarının uzantısı .java olmalıdır.

Programa verilen dosya adı ile programda tanımlanan class adı aynı olmalıdır.

Tabii, bir programda birden çok class olabilir. Burada söylenen şey, programdaki iç sınıfların hepsini içeren en dıştaki class’ın adı ile dosya adının aynı olması gereğidir. Bunun nasıl yapıldığını ilerideki örneklerimizde daima göreceğiz.

Java  nesne yönelimli bir dil olduğu için, hemen her şey sınıflar (class) içine yazılır. Programda kullanacağımız değişkenler ve metotlar mutlaka bir ya da birden çok sınıf  içinde tanımlanmalıdır. Bunların nasıl olacağı, bu dersin asıl konusudur ve onları adım adım öğreneceğiz.

Yukarıda yazdığımız Program001.java dosyası için tanımlanan Program001 sınıfının içi boştur. Dolayısıyla, bu sınıfın hiçbir iş yapmayacağı açıktır. Böyle olduğunu birazdan göreceğiz. javac.exe  derleyicisi ile programı derlemek için

javac Program001.java

yazıp Enter tuşuna basınız. Eğer sisteminiz  javac.exe  derleyicisini görmüyorsa, derleyicinin bulunduğu adresi yazabilirsiniz.

C:\jdk\bin\javac  Program001.java

Derleyici Program001.class adlı bytecode dosyasını yaratacaktır. (Bunu görmek için DOS kipinde dir komutunu çalıştırınız.)

Şimdi Program001.class dosyasını yorumlamak (yürütmek, icra) için java.exe yorumlayıcısını kullanacağız:

              java Program001

Yorumlayıcı bize aşağıdaki iletileri gönderecektir.

C:\jprg\src>javac Program001.java

 

C:\jprg\src>java Program001

Exception in thread "main" java.lang.NoClassDefFoundError: Program001

Caused by: java.lang.ClassNotFoundException: Program001

        at java.net.URLClassLoader$1.run(Unknown Source)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.net.URLClassLoader.findClass(Unknown Source)

        at java.lang.ClassLoader.loadClass(Unknown Source)

        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

        at java.lang.ClassLoader.loadClass(Unknown Source)

Could not find the main class: Program001.  Program will exit.

 

C:\jprg\src>

Bu iletinin ilk satırı javac.exe derleyicisinin Program001.java dosyasının derlemesi için verdiğimiz komuttur. Derleyici bu komuta karşılık bir hata olduğu iletisi göndermemiştir. O halde Program001.class adlı bytecode dosyasının yaratıldığını anlayacağız.

İkinci satır java.exe yorumlayıcısının Program001.class bytecode’unun yorumlaması (yürütülmesi) için verilen komuttur. Bu komuttan sonra gelen iletiler, komutun yürütülemediğini ve yürütülemeyiş nedenlerini açıklayan satırlardır.  

Üçüncü satır, java.exe yorumlayıcısının programı yürütmek için gerekli olan main() metodunu bulamadığını söylüyor.

Programın yürütülemeyiş nedeni, üçüncü satırdaki ileti ile bildirilmektedir. Ondan sonraki satırları şimdilik düşünmeyiniz. Onlar, yorumlayıcının kendi iç işlevlerini ilgilendiren şeylerdir.

İpucu

Derleyici kaynak programda sözdizimi (syntax) hatası olduğunda programı derleyemez. Derleyici, derleyemediği her programda, sözdizimi yanlışlarını satır numarası yanında olası hatanın ne olduğunu yazarak bize iletir.  Bu iletiler, programın düzeltilmesinde (debug)  çok işe yararlar.

Ama, şimdilik bunları hiç düşünmeden, derleyicinin bizden istediği giriş noktasını oluşturmaya çalışalım.

Java uygulamaları bir main() metodu (fonksiyon) tarafından eyleme geçirilir. Programın yapacağı bütün işler bu main() metodu tarafından belirlenir. Buna programın giriş noktası diyoruz. Şimdi yukarıdaki programımıza  main() metodunu ekleyelim ve Program002.java adıyla kaydedelim.

Program002.java

class Program002

{

    public static void main(String[] args)

    {

    }

}

Sonra programı derleyelim:

javac Program002.java

Derleyicimiz gene hiç hata (error) iletisi göndermedi. Demek ki programı derledi ve yürütülebilir bytecode’a çevirdi. Gerçekten Dos kipinde

dir

komutu verirseniz, c:\jprg dizini içinde Program002.class adlı bytecode dosyasını göreceksiniz.  Bu dosyayı yorumlamak için

java Program002

komutunu yazmanız yetecektir. Bunu yazdığınızda, program çalışır, ama siz ekranda bir şey göremezsiniz. Çünkü, programın içine ekrana çıkacak bir şey yazmadık. Şimdi bunu yapalım.

İpucu

Bir dili öğrenirken işin pedagojisi ile sistematiği asla paralel gitmez. Bu nedenle, bazen pedagojiden bazen sistematikten ödün vermek gerekir. Böyle durumlarda, görünmez uzaylı dostumuz Uzay bize ipucu verecektir. Şimdilik Uzay’ın bize verdiği ipuçlarını kullanalım. Zamanla, onları daha iyi kavrayacağız.

İpucu

Ekrana bir şey yazdırmak için System.out.print() ya da System.out.println() metotları kullanılır. İkisi de aynı işi yapar, ancak birincisi isteneni yazdıktan sonra, yazdığı satırın sonunda bekler, ikincisi isteneni yazdıktan sonra satırbaşı yapar; yani alttaki satırın başına geçer.

Şimdi bu ipucuna göre programımızı düzeltelim.

Program003.java

    class Program003

    {

        public static void main(String[] args)

        {

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

        }

    }

Bu programı kaydettikten sonra derleyelim:

javac Program003.java

Bu kez, Komut istemi penceresinde şunu göreceğiz: 

 

C:\jprg\src>javac Program003.java

Program003.java:5: ';' expected

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

                                               ^

1 error

 

Bu iletinin ikinci satırı kaynak programın 5-inci satırında hata olduğunu, hatanın ‘;’ simgesinin yokluğu olduğunu söyler. Üçüncü satırda ise hatanın yeri  (^) simgesi ile işaret edilmektedir.

İpucu

Java dilinde her deyimin sonuna  (;) konulur.

Derleyicinin hata iletisi kesinlikle kaynak programda bir hata olduğunun belirtir. Tabii her programcının yaptığı hatayı tam belirleyemeyebilir. Ama kaynak programdaki hatayı kategorik olarak bildirir ve yerini doğru işaret eder. O nedenle, hatayı işaret edilen yerde aramalıyız.

Şimdi eksik olan (;)  yazarak programımızı düzeltelim (bu işleme ‘debug’  denir).

Program004.java

    class Program004

    {

        public static void main(String[] args)

        {

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

        }

    }

Bu programı Program004.java  adıyla kaydedelim ve derleyelim:

javac Program004.java

Derleyicimiz başka bir hata iletisi göndermez. Öyleyse yorumlanabilir bytecode dosyasını yaratmıştır.

Gerçekten

dir

komutunu yazarsak, C:\jprg dizininde Program004.class  bytecode dosyasının yaratıldığını görebiliriz. Şimdi bu dosyayı koşturmak için,

Program004

yazıp Enter tuşuna basarsak, ekranda

Merhaba  Java!

yazısını göreceğiz.

Buraya kadar dört adımda ekrana ‘Merhaba Java!’  tümcesini yazdıran bir program yazdık. Bu bir tümce yerine bir roman ya da karmaşık matematiksel işlemlerden oluşan deyimler de olabilirdi. Uzun ya da kısa metinler veya basit ya da zor işlemler için yapacağımız iş hep budur. Bu biçimde yazacağımız küçük programlarla Java dilinin bütün hünerlerini öğreneceğiz. Büyük programların bu küçük programların uyumlu birleşmesinden oluştuğunu hiç aklımızdan çıkarmayalım.  O nedenle, bütünleşik bir uygulama geliştirme aracını (IDE) kullanmaya başlamadan, Java dilinin temellerini öğrenmeye devam edeceğiz.

 

Kaynak Programın Biçemi

Programlama dillerinde, belirli bir işi yapmak üzere yazılan sözdizimi (kod) parçasına deyim denir. Örneğin,

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

bir deyimdir. Java dilinde bir deyimin bittiğini derleyiciye bildirmek için, o deyimin sonuna (;) konulur. Bir deyimdeki farklı sözcükler birbirlerinden en az bir boşluk karakteri ile ayrılır. Kaynak programda ardışık yazılan birden çok boşluk karakterleri tek boşluk olarak algılanır. Benzer olarak, tablar, satırbaşları ve boş satırlar birer boşluk karakteri olarak yorumlanır. Dolayısıyla, yukarıdaki programı

Program004a.java

class Program004a { public static void main(String[] args) {System.out.println("Merhaba Java! );}}

biçiminde ya da

Program004b.java

class

Program004b

{

Public static

 

void

main()

 

{

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

}

}

biçiminde de yazabiliriz. Derleyici, kaynak programı derlerken birden çok tekrar eden boşluk karakterlerini, tab ve satırbaşlarını birer boşluk karakteri sayacaktır.

Buraya kadar Java diline ait bazı kavramları açıklamadan kullandık. Bu noktada basit açıklamalar yapmak yararlı olabilir.

Sınıf (class)

Sınıflar (class) Nesne Yönelimli Programlamanın (Object Oriented Programming) temel taşlarıdır. Programın kullanacağı her değişken, her deyim, her metot (fonksiyon) mutlaka bir sınıf içinde tanımlanmalıdır. Bir sınıf içinde tanımlanan metotlar (fonksiyonlar) ve değişkenler o sınıfın öğe'leridir (member). Karışmamaları için, bir sınıfta aynı adı taşıyan iki öğe olamaz (aşkın öğeler kavramını ileride göreceğiz).

Bloklar

Kaynak program bir ya da bir çok sınıftan oluşur. Sınıfların her biri bir bloktur. Bir sınıf içindeki her metot (fonksiyon) bir bloktur. Örneğin, yukarıdaki programın tamamından oluşan

class Program004

{

}

 

bir bloktur. Benzer olarak,

 

public static void main(String[] args)

{

}

 

metodu da bir bloktur. main(){ } bloku,  class Program004.java{ }  blokunun içindedir. Bu tür bloklara iç-içe bloklar diyoruz.  Bir blok içinde gerektiği kadar iç-içe bloklar oluşturabiliriz. Bir programda birden çok sınıf ve bir sınıf içinde birden çok blok olabilir. Bloklar, adına blok parantezleri diyeceğimiz { } simgeleri içine yazılır. Bazan main(){ } blokunda olduğu gibi blok parantezlerinin önüne blok adı gelebilir. Her sınıf (class) ve her alt sınıf bir bloktur. Bir sınıf içinde yer alan her metot (fonksiyon) bir bloktur. İleride göreceğimiz if, case ve döngü yapılarının her birisi bir bloktur. Bir sınıf içinde birbirlerinden bağımsız bloklar seçkisiz sırada alt-alta yazılabilir. Ancak iç-içe olan bloklar, istenen işlem sırasını izleyecek uygun sırayla iç-içe konur. İç-içe blok yazılırken, en içten dışa doğru blokun başladığı ve bittiği yerleri belirten blok parantezlerinin ({ }) birbirlerini karşılaması sağlanmalıdır. Bu yapılmazsa derleme hatası doğar. İç-içe bloklarda, işlem öncelikleri en içten en dışa doğru sıralanır.

Derleyici kaynak programın biçemine (format) değil, sözdizimine bakar. Ama kaynak programı hem kendimiz hem de başka programcılar için kolay okunur biçimde yazmak iyi bir alışkanlıktır. İç-içe giren blokları  birer tab içeriye almak, alt-alta yazılan bloklar arasına birer boş satır koymak, kaynak programın, programcı tarafından kolay okunup anlaşılmasını sağlar. Özellikle, uzun programlarda düzeltme (debug) ya da güncelleme (update) yaparken, kaynak programın yazılış biçemi işin kolay ya da zor yapılmasına neden olur.

Programa Açıklama Ekleme

Kaynak programımızın biçemi bilgisayar için değil, onu okuyan kişiler için önemlidir, demiştik. Büyük bir programın kaynağının kolay anlaşılır olmasını sağlamak programcının ahlâki sorumluluğundadır. Bunu sağlamak yalnızca programın biçemiyle olmaz. Büyük programlar için sınıfların, metotların, değişkenlerin işlevleri ayrıca açıklanmalıdır. Büyük yazılım firmaları programdaki her ayrıntıyı açıklayan döküman hazırlarlar. Böylece, yıllar sonra programcılar değişse bile, o dökümanlara bakılarak, kaynak program üzerinde değişiklikler, iyileştirmeler yapılabilir.

Java dilinde programa açıklama eklemek için iki yöntem kullanırız. Bu yöntemler C, C++ ve java gibi bir çok dilde de var olan yöntemlerdir.

Tek satır açıklaması

// simgesinden sonra satır sonuna kadar yazılanlar derleyici tarafından işlenmez. Bir satırın bütününü ya da bir satırın ortasından sonuna kadar olan kısmı açıklamaya koyabiliriz:

// Bu metot net ücretten gelir vergisini hesaplar

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

return netÜcret;   // metodun değeri netÜcret 'tir

Birincide satırın tamamı bir açıklamadır. Örneğin, gelir vergisi hesaplayan bir metodun başladığı satırdan önceki satıra konulabilir, böylece metodun ne iş yaptığı her okuyan tarafından anlaşılır.

İkincide, genellikle program yazarken bazı deyimlerin programa konulup konulmamasının etkisini görmek için, programcının sık sık başvurduğu bir yöntemdir. Bir deyimin başına  // simgelerini koyarak o deyimi derleyicinin görmesini engelleyebilirsiniz.

Üçüncüde, önce bir deyim yazılmış, deyimin bittiği yerde // simgesi konulmuştur. Derleyici deyimi görür ve işler, ama // simgesinden sonra satır sonuna kadar yazılanları görmez. Bu yöntemle, bir deyimin ne iş yaptığını kolayca açıklayabiliriz.

Çoklu satır açıklaması 

Bazan yapacağımız açıklama tek satıra sığmayabilir. O zaman ardışık açıklama satırlarını /*   */  simgeleri arasına alırız.

/*

Bu sınıf 20 Ağustos 2008 tarihinde

Java  ile Nesne Programlama

kitabının Onikinci Bölümü için yazılmıştır.

*/

Bu yöntem çok satırlı açıklamalar için kullanıldığı gibi, program yazarken ardışık satırlardan oluşan bir blokun, bir metodun, bir sınıfın programda olup olmamasının etkisini görmek için programcının geçici olarak başvurduğu önemli bir araçtır.