Yrd.Doç.Dr. Yüksel ÇELİK
Java Projesinin Temelleri Bir Java projesinde kaynak kodlarımız src adlı klasörde tutulur. Oluşturacağımız her türlü Java uzantılı dosya (Java sınıfları) bu klasörde saklanır ve uygulamayı çalıştırdığımızda bu klasör içinden derlenir. libklasör ise harici Java kütüphanelerini projemize eklemek için kullanılan jar dosyalarının saklandığı klasördür. NOT: Herhangi bir jar dosyasını projeye ekleyerek içerisindeki sınıfları kullanmak için bir jar dosyasını sağ tuşla tıklayarak Build Path -> Add to Build Path demeniz yeterlidir.
Java Yazım Kuralları ve Önerileri Her dilin olduğu gibi programlama dillerinin de kendi içinde belli kuralları var. Bu kurallara uyarak yorumlayıcıya veya derleyiciye kodunuzu doğru biçimde ifade edebilirsiniz Yazılım üretimindeki %80'lik zaman dilimi, kod bakımına (maintenance) harcanıyor. Çok az yazılım, yaşamı boyunca ilk yazarınca geliştirilir. Kod yazma gelenekleri yazılımın okunmasını ve anlaşılmasını kolaylaştırır. Mühendislerin yeni kodu hızlı ve verimli bir şekilde anlamasını sağlar. Kodunuzu açmaya karar verdiğinizde daha anlaşılır olacağı için daha kolay destek bulursunuz.
Değişken tanımlama kuralları ve önerileri Kural: Bir değişken yazarken önce onun tipini, sonra adını yazmalısınız: Öneri: Değişken ismi yazmanın belli kuralları var. Örneğin CamelCase kuralıyla isimlendirme yaparken isimlerin ilk harfi büyük olmalı. Eğer değişken ismi iki kelimeden oluşuyorsa ikinci kelimenin de ilk harfi büyük olmalı. Örn: Integer UyeSayisi Öneri: Geleceği Yazanlar'da genellikle Mixed Case olarak isimlendirilen, ilk harfinin küçük olması dışında CamelCase'e benzeyen yaklaşımı tercih ediyoruz. (Çünkü CamelCase, çoğunlukla sınıf isimlendirmelerinde kullanılır) Örn: Integer uyesayisi
Değişken tanımlama kuralları ve önerileri Kural: Değişken isimlerinde Türkçe karakter kullanamazsınız. Kural: Değişken adları rezerve edilmiş Java sözcüklerinden oluşamaz (int, float, public, static, volatile vs). Bu sözcükler Java derleyicisinde bir anlam ifade ettiğinden değişken adı olarak kullanılamazlar. Kural: Değişken isimleri rakamla başlayamaz ancak içinde rakam olabilir. Örn: Integer dogrulamakodu2;
Değişken tanımlama kuralları ve önerileri Öneri: Sabit-değeri değişmeyen değişkenleri büyük harfle ve kelime aralarına alt çizgi koyarak yazınız. Örn: public static final Integer VARSYLN_CARPISMA_KATSAYISI; Öneri: Java'da uygulamalar sınıflar halinde yazılır. Ayrıntılarını ilerleyen bölümlerde göreceksiniz. Bir sınıfın üyesi olacak değişken tanımlayacağınız zaman onun isminin önüne m getirebilirsiniz. Böylelikle kodunuzu okuyan kişi, bu değişken ismini nerede görürse görsün, sınıfın üyesi (member) olduğunu anlayacaktır. Örn: 1.public class ProfileTask { 2. 3.private Integer markadassayisi; 4. 5.} Öneri: Bazı sınıf değişkenleri static olarak tanımlanırlar. Böyle değişkenlerin adının önüne s ön eki getirebilirsiniz. Bu da onun diğer değişkenlerden ayrılmasını kolaylaştırılacaktır. Örn: 1.public class ProfileTask { 2. 3.private Integer markadassayisi; 4.private static Integer setkinislemsayisi; 5. 6.}
Değişken tanımlama kuralları ve önerileri Öneri: Fonksiyonlara parametre olarak gönderdiğiniz değişken isimlerinin önüne alt çizgi koyabilirsiniz. Böylelikle fonksiyon içinde çalışırken hangisinin parametre, hangisinin sınıfın ya da nesnenin kendi değişkeni olduğunu karıştırmamış olursunuz. Örn: 1.public class ProfileTask { 2. 3.private Integer markadassayisi; 4.private static Integer setkinislemsayisi; 5. 6... 7. 8.public static Boolean isetkinislemsayisibigger(integer _islemsayisi) { 9.if (_islemsayisi>setkinislemsayisi) { 10.return true; 11.} else { 12.return false; 13.} 14.} 15. 16... 17. 18.}
Fonksiyon tanımlama kuralları ve önerileri Kural: Bir fonksiyonun işini bitirdikten sonra döndüreceği değerin tipi fonksiyon adından önce yazılır. Örneğin: 1.public Integer getarkadassayisi(){ 2.return markadassayisi; 3.} Burada getarkadassayisi() isimli fonksiyonun Integer türünden değer döndüreceğini anlıyoruz. Öneri: Kendi oluşturduğunuz fonksiyonların isimlerini fonksiyonun görevini ifade edecek şekilde seçmelisiniz. sayi() yerine getderssayisi() gibi.
Sınıf tanımlama kuralları ve önerileri Kural: Sınıf ismiyle, o sınıfı sakladığınız dosyanın ismi aynı olmalıdır. Örneğin LoginManager sınıfıloginmanager.java dosyasında saklanmalı. Kural: Sınıf isimleri verirken değişken tanımlarken uyguğunuz kurallara uymalısınız. Öneri: Sınıfları isimlendirirken fiilleri kullanmak yerine özellikle isimler kullanmalısınız. Çünkü sınıflar gerçek hayattaki nesnelerin karşılığıdır. Örneğin User, UserManager birer isimdir. Register, Login, Delete gibi işlemler birer fiildir. Öneri: Sınıf isimleri CamelCase biçiminde verilmelidir. public class usermanager {...} yerine public class UserManager kullanmak kodunuzu daha okunur kılacaktır.
Yorum satırı kuralları ve önerileri Yazılan kodu ister siz ister başkası yazmış olsun, sonradan okuyan herkes için kodu anlatmanın en kolay yollarından biri ona yorumlar bırakmaktır. Java'da satıra ya da birçok satıra blok olarak yorum koyulabilir. Kural: Java'da bir yorum satırı oluşturmak için satırın başına "//" (iki tane bölü işareti) getirmek yeterlidir. Birden fazla satırı aynı anda yorum satırı haline getirmek için tek tek hepsinin başına "//" koymak yerine en baştaki satıra "/*" ve en sondaki satırın sonuna da "*/" koymak yeterlidir. Örnek: 1./*public Integer getarkadassayisi(){ 2. return markadassayisi; 3. }*/ 4... 5. 6.public static Boolean isetkinislemsayisibigger(integer _islemsayisi) { 7.if (_islemsayisi>setkinislemsayisi) { 8.return true; 9.} else { 10.//return false; 11.return 0; 12.} 13.} 14. 15... Öneri: Bir sınıfı tanımlarken o sınıfın ne işe yaradığını hemen sınıf tanımlamasının üzerine yazabilirsiniz. Örneğin:
Sabitlerden Oluşan İfadeler Sabitler; değişkenler gibi veri tutan sınıf öğeleridir. Ancak C dilinde olduğu gibi sabit öğe kavramı da yoktur. Java'da sabitler bir değişken bildirimi yaparak hareket ederler. Sabitlere atanan değerler değiştirilemez ve sabit bildirimi yapıldığı anda değeri atanmalıdır. Sabitlerden (constants) oluşan ifadeler, sadece sabit ve operatör içerirler. Örneğin; 17 + 2 3 'b' 200 / 3 Burada ilk ifadenin sonucu 19 sabitidir. İkinci ifade zaten sadece 3 sabitinden oluşuyor. Üçüncü ifadenin sonucu ise, b karakterinin ASCII kodu 98 olduğu için: 98 200/3 şeklinde hesaplanacaktır. Önce bölme yapılacağı için 200/3 ün sonucunu 66 olarak buluruz; çünkü iki tam sayı arasındaki işlemin sonucu daima bir tam sayıdır. Bu durumda sonuç; 'b' 200/3=98-66=32 olarak hesaplanacaktır.
int Türü İfadeler int türünde tamsayı sabit ya da değişken içeren ifadeler, sonuçta tamsayı (int) değer üretecektir. Örneğin, int a,b,c; a=9; b=12; c=13; şeklindeki atamalar ile, a + b / c ifadesi, 9+12/13=9+0=9 olarak hesaplanacaktır. 12 ve 13 ün int türünde olduğunu ve bu nedenle 12/13 işleminin sonucunun da int türünde olacağını ve 12/13 ün int türündeki sonucunun da 0 olacağını hatırlatalım. b c % a + x 3 + (int) 8.7 ifadesi ise 12 13%9+120 3+8 12 4 + 120 3+8=133 aşamalarından geçerek 133 olarak hesaplanır. x karakter sabiti yerine onun ASCII kodu olan 120 değeri alınır. 13%9 ifadesi ise 13 ün 9 ile bölümünden elde edilecek olan kalanı hesaplanır. (int) 8.7 ifadesi ise 8.7 ondalık sayısını int türüne yani 8 e dönüştürür.
float Türündeki İfadeler Programlamada özellikle hesaplama aşamasındayken, sadece tamsayılar üzerinden gitmek sizi sınırlayabilir. Rasyonel sayıları kullanmak istediğinizde, yeni değişken türlerini de kullanmalısınız. Java dilinde float ve double türündeki değişkenler ile rasyonel sayıları tutabilirsiniz. Float ve double türünden değişkenlerin adını kayan noktalı (floating point) değişkenler olarak da duyabilirsiniz. Buradaki nokta kısmı, tam sayı kısmı ile ondalıklı sayı kısmını bölen virgül oluyor. Float ve double türlerinin arasındaki fark, virgülden sonraki ondalık kısımda tutabildikleri hane sayısıdır. Bu yüzden bir float değişken sanal bellekte 32 bitlik yer tutarken, double türündeki bir değişken 64 bit yer tutacaktır. Kayan noktalı bir tip yerine tamsayı tipini kullandığınızda olacakları daha iyi anlamak için aşağıdaki örneği inceleyiniz: 1.public class FloatDeneme1 { 2.public static void main(string[] args) { 3. 4.int sinav1=50; 5.int sinav2=55; 6. 7.int ortalama_yaklasik =(sinav1+sinav2)/2; 8.float ortalama_tam =(float) (sinav1+sinav2)/2; 9. 10.System.out.println("Sinav ort. (yaklasik): "+ortalama_yaklasik); 11.System.out.println("Sinav ort. (tam olrk): "+ortalama_tam); 12.} 13.} Bu programın çıktısı şu şekilde olacaktır: Gördüğünüz gibi int tipindeki ortalama_yaklasik değişkenin 52,5 çıkan sonucu, tamsayı tipinde olduğu için 52'ye yuvarladı. float tipindeki ortalama_tam değişkeni ise olması gerektiği gibi 52,5 olarak kaldı.
float Türündeki İfadeler NOT: float ortalama = (float) (sinav1+sinav2)/2; satırındaki (float) ifadesi ile "(sinav1+sinav2)/2" işleminden gelen sonucun float olarak tutulmasını sağlıyoruz. Gördüğünüz gibi kayan noktalı değişkenleri tanımlarken bazı ifadelere dikkat etmek gerekiyor. Şimdi de float ile double türlerinin hassasiyetleri üzerine bir örneğe göz atalım: 1.public class FloatDeneme2 { 2.public static void main(string[] args) { 3. 4.//Math.PI, bize PI sayısını döndürür 5.float PI_float =(float) Math.PI; 6.double PI_double=Math.PI; 7. 8.System.out.println("PI sayisi: "+PI_float); 9.System.out.println("PI sayisi: "+PI_double); 10.} 11.} Çıktısı şöyle olacaktır: NOT: Math.PI ifadesi, PI sayısını tutan bir ifadedir. Gördüğünüz üzere double türündeki PI_double değişkeni, PI sayısına ilişkin daha fazla ondalık değeri tutabiliyor. Bu yüzden double değişkenler, daha hassas hesaplama gereken yerlerde kullanılır.
Tekli Operatörler Bu bölümde negatifini alma ( ), pozitifini alma (+), artım (++) ve azaltım ( ) operatörlerini inceleyeceğiz. Negatifini alma operatörü ( ) tek bir operand üzerinde etkili olduğu için, iki operand ile işleme giren ( ) sembolü ile karıştırılmamalıdır. ÖRNEK: 1.public class Uyg5 { 2.public static void main(string[] args){ 3.int x, y=-5; 4. 5.x=16- -y; 6.System.out.println("x="+x); 7.} 8.} Bu programda x in değeri 11 olarak bulunacaktır. y ( 5)= +5 olarak hesaplanır. 16 yı izleyen çıkarma operatörü ( ) ile y nin önündeki negatifini alma ( ) operatörü arasında mutlaka bir boşluk olmalıdır. Aksi halde ( ) ifadesi azaltım operatörü olarak algılanacaktır.
Tekli Operatörler Son artım ve son azaltım operatörlerinde derleyici, değişkenin o andaki değerini bellekte geçici bir değişkene atayarak saklar. Sonra değişkenin değerini 1 artırır (son artım) veya 1 azaltır (son azaltım). Geçici değişkendeki değer ise ifade içinde kullanılır. Tablo T.1-Tekli Operatörler operatör sembolü kullanlışı işlem sonucu tekli negatif alma a a nın negatifini alır son artım ++ a++ önce a nın değerini al, kullan, sonra 1artır. ön artım ++ ++a önce a nın değerini 1 artır, sonra kullan. son azaltım a önce a nın değerini al, kullan, sonra 1son azaltım azalt. ön azaltım a önce a nın değerini 1 azalt, sonra kullan.
Tekli Operatörler ÖRNEK PROJE: 1.public class Uyg6 { 2.public static void main(string[] args){ 3.int x=4, y=8, z; 4. 5.z= x++ + y--; 6. 7.System.out.println("z="+z); 8.System.out.println("x="+x); 9.System.out.println("y="+y); 10.} 11.} PROJENİN ÇIKTISI:
Tekli Operatörler ÖRNEK UYGULAMA: 1.public class Uyg7 { 2.public static void main(string[] args){ 3.int x, y, z, m; 4. 5.x=10; 6.y=5; 7.z=16; 8. 9.m=++x - --y + z++; 10. 11.System.out.println("z="+z); 12.System.out.println("x="+x); 13.System.out.println("y="+y); 14.System.out.println("m="+m); 15.} 16.} UYGULAMANIN ÇIKTISI:
Tekli Operatörler ARTIM VE AZALIM OPERATÖRLERİ İÇİN BİR DİĞER ÖRNEK UYGULAMA 1.public class Uyg8 { 2.public static void main(string[] args){ 3.int m, n, p, q; 4. 5.m=4; 6.n=2; 7.p=10; 8.q=8; 9. 10.m= -m++; 11.n= n--; 12.p= --p; 13.q= -++q; 14.System.out.println("m="+m); 15.System.out.println("n="+n); 16.System.out.println("p="+p); 17.System.out.println("q="+q); 18.} 19.} UYGULAMANIN ÇIKTISI
İkili Aritmetiksel Operatörler Operatör Sembolü Kullanılışı Sonucu İşlem çarpma * a*b a ile b nin çarpımı bölme / a/b a nın b ye bölümü kalan % a%b toplama + a+b çıkarma a-b a nın b ye bölümünden kalan a nın b ile toplanması b nin a dan çıkarılması *, / ve % operatörleri, + ve 'ye göre önceliklidir. *, /, + ve operatörlerinin int veya float (double) türde operand kabul etmelerine karşılık kalan operandları sadece int türde operand olarak kabul eder. % operandı bölmede kalanı hesaplar. Örnek: 17 % 3 işleminin sonucunda 2 değeri (17 nin 3 ile bölümünden kalan) elde edilir. ANSI standardı, kalan ve bölme operatörleri arasında aşağıdaki bağıntının bulunmasını zorunlu kılar: a = a % b + (a /b) *b (a ve b tamsayı)
İkili Aritmetiksel Operatörler ÖRNEK UYGULAMA: 1.public class Uyg9 { 2.public static void main(string[] args){ 3.int a, b, c; 4.double p, q, r, x, y, z, k; 5. 6.a=7; b=4; c=15; 7.p=2.7; 8.q=13.8; 9.r=12.45; 10. 11.x= a % b * 15 - c / b * a; 12.y= a * 2 % (b + 1) - c / (a +b); 13.z=x / y * a - b ++ * --c; 14.k=p -q / (r +z) * (q -r) + b++ * z; 15. 16.System.out.println("x="+x); 17.System.out.println("y="+y); 18.System.out.println("z="+z); 19.System.out.println("k="+k); 20.} 21.} ÖRNEK UYGULAMANIN ÇIKTISI: x değeri 7 % 4 * 15 15 / 4 * 7 3 * 15 3 * 7 45 21 24 y değeri 7 * 2 % (4 + 1 ) 15 / (7 + 4) 14 % 5 15 / 11 4 1 3 z değeri 24 / 3 * 7 4++ * 15, 8 * 7 4 * 14 56 56 0 olarak hesaplanır.
Aritmetiksel Atama Operatörleri Operatör Sembolü Kullanılışı İşlem Sonucu Atama = x = y Topla-ata + = x + = y Çıkar-ata = x = y Çarp-ata * = x * = y Böl-ata / = x / = y Kalanını ata % = x % = y y nin değerini x e ata x + y nin değerini x e ata x y nin değerini x e ata x * y nin değerini x e ata x / y nin değerini x e ata x % y nin değerini x e ata Tablodan kolayca anlayacağımız üzere, x + = y ifadesi x = x + y ifadesine, x % = y ifadesi de x = x % yifadesine denktir. = operatörünün atama amacı ile kullanıldığını biliyoruz. Sembolün sol tarafındaki operand bir sol taraf operandı (left hand operand, Lvalue) olmalıdır. Sol taraftaki operand (değişken, dizi elemanı, yapı elemanı vb.) sağ taraftaki operandın değerini bellekte saklar.
Aritmetiksel Atama Operatörleri ÖRNEK: int k; double l; l = k = 13.72; Yukardaki komutlar ile (=) sembolünün birleşme özelliği sağdan sola olduğu için, ( l = (k = 13.72)); sırasıyla atamalar yapılacaktır. Java hassasiyetin kaybolmasına izin vermeyeceği için k=13.72 atamasında, possible loss of precision veya Eclipse'te "cannot convert from double to int" şeklinde bir hata mesajı verilecektir. Java da sadece programcının açıkça cast ifadeleri ile, (int) 13.72 gibi, hassasiyetin kaybolmasına özellikle izin verdiğini belirtmesi halinde bu tür atamalar yapılır.
Aritmetiksel Atama Operatörleri ATAMA OPERATÖRLERİ: ÖRNEK PROGRAM 1.public class Uyg10{ 2. public static void main(string[ ] args){ 3. 4. int k; 5. double l; 6. l = k =13.72; 7. 8. System.out.println("l="+l); 9. System.out.println("k="+k); 10. } 11.} ÖRNEK PROGRAMIN ÇIKTISI ÖRNEK PROGRAM: CAST İFADESİNİN KULLANIMI 1.public class Uyg10{ 2. public static void main(string[ ] args){ 3. 4. int k; 5. double l; 6. l = k =(int)13.72; 7. 8. System.out.println("l="+l); 9. System.out.println("k="+k); 10. } 11.} CAST İFADESİNİ KULLANAN ÖRNEK PROGRAMIN ÇIKTISI: