630 likes | 858 Views
Sayısal Türler. Tamsayılar (byte, short, int, long) Tam sayılardır exact Yaklaşık olarak ~10 19 rakamında sınırlıdır Kayan noktalı (float, double) kesirli Genelde yaklaşma (0.33333) Yaklaşık olarak ~10 308 rakamında sınırlıdır. Veri Türlerinin Listesi.
E N D
Sayısal Türler • Tamsayılar (byte, short, int, long) • Tam sayılardır • exact • Yaklaşık olarak ~1019 rakamında sınırlıdır • Kayan noktalı (float, double) • kesirli • Genelde yaklaşma (0.33333) • Yaklaşık olarak ~10308 rakamında sınırlıdır
Veri Türlerinin Listesi Temel Türler Default Value boolean false char '\u0000' (null) byte (byte) 0 short (short) 0 int 0 long 0L float 0f double 0d void N/A Note: “Void “ C/C++ dillerindeki gibi temel bir tür değildir. Java ‘da void türüne doğru bir tür değişimi yapılamaz.
Veri Türlerinin Değer Sınırları Tür Boyut En az En fazla Varsayılan boolean 1 false* true* false char 16 '\u0000' (null) byte 8 -128 127 (byte) 0 short 16 -32,768 32,767 (short) 0 int 32 -2,147,483,648 2,147,483,647 0 long 64 -9,223,372,036,854,775,808 9,223,372,036,854,775,807 0L float 32 Yaklaşık olarak ±3.4E+38 ve 7 haneli 0.0F double 64 Yaklaşık olarak ±1.7E+308 ve 15 haneli 0.0D void *En az ve en fazla gibi durumlar geçerli değildir.
Tür Dönüşümü (Casting) HATA Açık tür dönüşümü gereklidir Doğru ! derlenir Bir önceki derste tür dönüşümü ile ilgili temel birkaç şey gördük. Bazen açık tür dönüşümü gerekebilir bazen de gerekmez. float f2 = 11.234f; int y = f2; int x = 10; float f1 = x; Derlenebilmesi için hangisinde tür dönüşümüne ihtiyaç vardır? Neden?
Tür Dönüşümü (Devam) Tür dönüşümünün ne zaman gerekli olduğunu anlayabilmek için aşağıdaki örneğe bakalım. Aşğıdaki gibi iki ayrı türden iki adet değişkenimiz olsun: int x; char c; Asıl soru, Bu veri türlerinin bellekte kapladığı alan ne kadardır?
Recall java int Daha önce Java ‘daki veri türlerinin bellekte kapladığı alanları gördük. Her tamsayı (int) türünde tanımlanmış bir değişken için bellekten 4 baytlık yer ayrılır. Bize ayrılan yeri bir kutu gibi düşünebilirsiniz. tahılkutusu Besin değerleri Servis miktarı 1 int Her serviste ikram edilen Kalori değeri0 % günlük miktar Toplam bayt sayısı 4 100%
And recall... Besin değerleri Servis miktarı 1 char Her serviste ikram edilen Kalori değeri0 % günlük miktar Toplam bayt sayısı 2 50% java char Karakter türünde tanımlanmış bir değişken için 2 bayt alan tahsis edilir . Tamsayı (int) türüne göre daha az bir alandır.Dolayısıyla bunu daha küçük bir kutu olarak düşünebiliriz. Ton balığı konservesi
Öyleyse... Bir karakter yani char veri türü 2 bayt, vebir tamsayı yani int türü 4 bayt yer kaplar.Dolayısıyla aşağıdaki kodu incelersek: int x; char c; Aşağıdaki şekle bakarsak: DeğişkenBelleğin resmi x 0000 0000 0000 0000 0000 0000 0101 0110 Her bir blok 1 bayt temsil eder c 0100 0001 0000 0000
Gerçeklik kontrolü java int java char Konserve kutusu tahıl kutusunun içine sığabilir mi? Evet, küçük olduğu için sığar. Peki, tahıl kutusu konserve kutusunun içine sığabilir mi? Düzgün bir şekilde mümkün değil, çünkü tahıl kutusu daha büyüktür.
Aynı mantıkla... char türündeki bir değer int türündeki bir alana sığar mı? int türündeki bir değer char türündeki bir alana sığar mı? DeğişkenBelleğin Resmi x c
Gerçeklik kontrolü java int java char Peki tahıl kutusunun yarısını konserve kutusuna yerleştirmek istersek mümkün mü? İşte bu olur ! Örneğin, eğer tahıl kutusunun yarısının boş olduğunu biliyorsak o boş kısmı atabiliriz.
Açık tür dönüşümü: Kasıtlı olarak yapılan duyarlılık kaybı int x = 45; char c = ‘A’; c = (char) x; // tür dönüşümü gereklidir Değişken Belleğin resmi x Tür dönüşümü gerekli! c
Kendinizi sınayın Boşlukları doldurun. Eğer aşağıdakileri uygularsak ne olur: int someInt = 2000; long longNumber; longNumber = (long) someInt; Bu tür değişimi kurallara uygun mudur? Öyleyse gerek var mıdır?
Diğer bir örnek Sonuç 4 olur, çünkü yapılan tamsayı bölmesi sonucu kesirli kısım budanır! float f; int i, j; i = 9; j = 2; f = i / j; Eğer beklenen değer bu değilse, 3 türlü çözüm vardır f = (float) i / j; f = (float) i / (float) j; f = i / (float)j;
Diğer bir örnek Dikkat etmemiz gereken diğer bir husus tür dönüşümü yapılırken Java ‘nın tür dönüşümü yapılan değerin işaretini korumasıdır. int türü için ayrılan 4 bayt ‘lık alanı düşünelim. En yüksek anlamlı bit işaret biti olarak kullanılır. 0 ise pozitif, 1 ise negatif anlamına gelir. int İşaret biti Veri için 31 bit ayrılır
Tür dönüşümü ve işaret Tür dönüşümü sadece bir veri türünü diğerine dönüştürürken bir kısmını budamaktan ibaret değildir. Orjinal işaret neyse o korunur. İşaret bitini korur bayt int
Diğer bir örnek 10 (ekim) 31 1929 Elimizde çok eskiden kalma, tarih bilgisinin tamsayı (int yani 4 bayt) şeklinde ifade edildiği bir veri olduğunu kabul edelim, şu şekilde: 19291031 Bu çok kabaca, fakat eskiden kalma veri kaynakları bu formatta verilere sahiptir.
public class CutData { public static void main(String[] args) { int iDate = 20001225; // eskiden böyleydi byte byDay = (byte) (iDate % 100); System.out.println (“Gün " + byDay); iDate = iDate / 100; byte byMonth = (byte) (iDate % 100); System.out.println (“Ay " + byMonth); iDate = iDate / 100; short sYear = (short) iDate; System.out.print (“Yıl = " + sYear); } } // Veriyi parçalara ayırdık Açık tür dönüşümü gerekli
Ters yönde çalışırsak yani byte veya short türündeki bir veriyi int türündeki bir alana aktarmak istersek tür dönüşümü gerekli değildir çünkü herhangi bir duyarlılık veya veri kaybı olmaz. public class PackDate { public static void main(String[] args) { byte month = 12; byte day = 25; short year = 2000; int date = year * 10000 + month * 100 + day; System.out.println ("The date = " + date); } } // PackDate
Tür dönüşümü: Bilginizi sınayın • Verilenler: char c = ‘A’; int x; c = x; • Kurallara uygun mudur? • Verilenler: int start = 10; float temp = 5.5f; temp = (int) temp * start; • temp değişkenin değeri şimdi ne oldu? Hızlı tekrar
Bilginizi sınayın iVar = (int) (iVar * fVar) iVar = (int) iVar * fVar iVar = iVar * (int) fVar iVar = (int) ((float) iVar * fVar) • İşte problem: int iVar = 10; float fVar = 23.26f; // derleme zamanı hatası verir iVar = iVar * fVar • Hangi çözüm en iyi çalışır? 3 230 4 1 232 232 2 Hızlı tekrar Aynı derleme hatası
Kısayol operatörleri • counter = counter + 1; VEYA counter++; • counter = counter - 1; VEYA counter--; • counter = counter + 2; VEYA counter+=2; • counter = counter * 5; VEYA counter*=5;Son iki örnekte : İlk önce artırma ve çarpma işlemleri yapılır daha sonra atama işlemi yapılır. Hızlı tekrar Bu ifadeleri anlayın fakat kullanmamaya çalışın
The Short End of Shorthand Akıllı ifadeleri kısayol operatörlerle birlikte kullanırken dikkatli olun. Örneğin, “_” gibi bir değişken tanımlayabiliriz. Alt çizgi karakteri geçerli bir değişken ismidir. int _ = 1; Aşağıdaki gibi Morse kodu oluşturacak şekilde değişik karakterlerin kombinasyonundan oluşan bir değişken ismi de oluşturabiliriz: _ -= --_ - _--; Evet, yukarıdaki ifade geçerlidir, ancak tamamen anlamsız ve okunamaz bir ifadedir.
Dokümantasyon ve Açıklamalar Hızlı Tekrar • Üç çeşit yöntem vardır: // satır sonuna kadar olan her şeyi açıklama olarak kabul eder /*ve */ işaretleri arasında kalan tüm ifadeler satır sonu gözetmeksizin açıklama olrak kabul edilir. /** * Bu sentaksbiçimi Javadocaçıklamaları için kullanılır, * HTML biçimlendirme özelliklerini sunar. */ • BİLM 217 için, Javadoc açıklamalarını kullanın Javadoc örneği üzerinde çalışalım
Javadoc: Basit bir örnek Javadoc açıklamaları değişiklik yapılan öğenin üzerinde yer almalıdır. Sınıf açıklamaları yapılacağı zaman açıklamaları import ifadelerinin altına koymak gerekir. import java.util.*; /** * HelloComments.java * * * Created: Wed Jan 12 18:17:29 2000 * * @author David Dagon * @version 98 beta */ public class HelloComments { /** * Basit <b> bir </b> değişken. */ public int x = 10; HTML terimleri!
Basit bir örnek (devam) Short, one-liner, followed by period Sadece değişken isimlerini belirtin. /** * This comment is reproduced twice, because * of the comma delimited declaration of ints. * The solution would be to use separate lines * for each declaration. */ public int y = 4, z = 11; /** * Bu sınıf çalıştırılırsa Main metodu programın * başlangıç noktasıdır. * @param args Komut satırından girilen parametreler */ public static void main(String[] args) { } } // HelloComments
Javadoc (devam) • HTML etiketleri ekleyebilirsiniz fakat <H1> gibi yapısal etiketler kullanmaktan kaçının. • Javadoc comments should immediately preceed the declaration of the class, field or method. İlk cümle özet olmalıdır. Javadoc ‘a özel etiketler kullanın, örneğin --@ . Eğer @ etiketi kullanılırsa diğer bir @ etiketine kadar parse işlemi devam eder. @see <class name> @see <full-class name> @see <full-class name#method.name> @version Kendi javadoc açıklamalarınıza geri dönerseniz bu notlara geri dönersiniz. @author @param @return @exception @deprecated // jdk 1.1 @since // jdk 1.1 @serial // jdk 1.2
Sabitler Hızlı tekrar • Java: • public final static <tür> <IDer> = <değer>; • public final static int MIN_PASSING = 60; • public final static float PI = 3.14159f; • Neden bu sentaks kullanıldığı konusunda detaylı bilgi ileride...
Printing to Screen Quick Review • Java: • System.out.println(<argüman>); • System.out.println( ); // boş satır ekler • System.out.println(5); // ekrana 5 yazarSystem.out.println(“Merhaba Dünya”); // ekrana Merhaba Dünya yazar • “println” vs. “print” : • println komutu ekrana mesajı bastıktan sonra imlecin bir alt satırın başına geçmesini sağlar • printkomutu ise ekrana mesajı bastıktan sonra imlecin kaldığı yerden devam etmesini sağlar
Dikkat Java ‘daki metodları konuşmaya başlamadan önce yüksek seviyeli programlama dillerine bir göz atmamız gerekir. Slaytlardaki sentaks konusunda endişelenmeyin. Büyük resimde kod detayları önemli değildir önemli olan neyin önemli olduğudur.
Programlama Modelleri • Prosedürel Programlama (Procedural Programming) • ‘Imperative’ assignment used to create state, and procedures manipulate state. E.g., C, Assembly, Pascal • int y; int x = 3; • y = manipulateData(x); • Fonksiyonel Programlama (Functional Programming) • Functions (procedures that do not depend on outside data) are used to provided data. E.g., Lisp. • (defun check-member (input-item input-list) • (cond ((null input-list) nil) • ((equal input-item (first input-list)) T) • (T (check-member input-item (rest input-list)))))
Programlama Modelleri • Nesneye yönelik programlama • Bütün veriler objelerin içinde tutulur; bütün etkileşim objeler arasında olur. Even numbers are objects that know how to add themselves. E.g., SmallTalk: • | array | • array := Array new: 5. • rect := 0@0 corner: 8@9. • 1 to: array size do: [ :item | • rect origin: item@item. • array at: item put: rect copy ]. • Java ‘nın yeri neresidir? • Nesneye yöneliktir ancak %100 değildir çünkü, temel veri tiplerine sahiptir ve de az da olsa prosedürel programlamaya izin verir. Başka modeller de mevcuttur ancak, bu üçü Java ‘nın nereden geldiğini açıklamaya yeter
Java Metodları • Java ‘da hem prosedürler hem de fonksiyonlar için method adı verilen bir yapı mevcuttur: • aşağıda prosedür geriye değer döndürmediği için metod adından önce “void” ifadesi kullanılmıştır. • public void printHelloWorld( ) • { • System.out.println(“Hello World!”); • } // printHelloWorld • Not: Bütün metodlar, parametre almasa dahi metod isminden sonra ( ) kullanmak zorundadır. Açıklamayı not edin
Java Metodları • hem prosedürler hem de fonksiyonlar için tek bir yapı: • fonksiyon tanımlaması yapıldığı zaman geri dönüş değerinin türü belirtilmesi gerekir. • public float average (float num1, float num2, float num3) • { • float answer; • answer = • (num1 + num2 + num3)/ 3; • return (answer); • } // of average
Metod Yazımı : Büyük Bakış Java kuralı: --Her metod bir nesneye aittir ya da bir sınıfa. --Bir metod çağrıldığı zaman hangi sınıfa ya da nesneye ait olduğu kesin belli olmalıdır. --Bir uygulamayı çalılştırabilmek için programın aynı adında bir sınıf ve bu sınıfın içinde de main metodu bulunmalıdır. Komut satırı parametreleri için Herkese açık Geri dönüş değeri yok public static void main (String[ ] argv) Sınıf metodu olduğunu belirtir, üye metodu değil Metod adı
Öyleyse, her sınıf kendi main metoduna sahip olabilir. Bunlardan hangisinin çalışacağına siz karar vereceksiniz. Debug testi yapmak için gerekli olan main metodlarını yazmayı öğrendiğimiz zaman yukarıda bahsettiğimiz konu kritik bir hal alacak. class A { public static void main(... } class B { public static void main(... } class C { public static void main(... }
Metod İmzaları “Metod imzası, metod adı, parametre sayısı ve türleridnen oluşur. Herhangi bir sınıf aynı imzaya sahip iki metod tanımlayamaz, yoksa derleme zamanı hatası oluşur. Aynı isme sahip metodlar farklı varyasyonlarda parametrelere sahip olurlarsa Method overloading meydana gelir. public int getCube(int num){ return num*num*num; } public int getCube(float num){ return (int)(num*num*num); } public int getCube(double num){ return (int) (num*num*num); }
Metodlarda yapılan genel hatalar public float average (float num1, float num2, float num3); { float answer; answer = (num1 + num2 + num3)/ 3; return (answer); } // average ‘;’ Noktalı virgül hakkında -- Eğer yukarıdaki gibi bir kullanım söz konusu olursa metod abstract metod gibi görünebilir. -- Çözümlenmesi zor bir hata mesajı ile karşılaşılabilir. -- Çok kolay yapılan hatalardan biridir.
Metotlar nereye? Tıpkımainmetodunda olduğu gibi oluşturulan bütün metodlar bir sınıfa ya da bu sınıfın bir üyesine ait olmalıdır.Daha sonra nasıl sınıf ve nesne oluşturulur göreceğiz... Şimdilik, metodların bir sınıfa ait olması gerektiğini bilmeniz yeter.
Nesneye Yönelik Programlama Hakkında Nesneye yönelik programlama ile ilgili önemli noktaları görmüş olduk : Veri ve metodlar birlikte bir sınıfa aittir. Şu anda sadece, değişkenlerin ve metodların sınıflara ait olduğunu bilmeniz yeterli. Daha sonra, bu özelliği kullanarak durumları (değişken), davranışlarla (behaviour) nasıl sarmalanır göreceğiz... Öyleyse, bugün neler öğrendiğimizi hatırlayalım. Nesneye yönelik programlamanın temel taşlarını öğrenmeye başladınız.
Java: if (koşul) tek bir ifade; else tek bir ifade; Ya da: if (koşul) { bir ya da daha fazla ifade; } else { bir ya da dah fazla ifade; } Karar ifadeleri
Java: Aşağıdaki örnekte ne yapılmıştır? int testGrade = 65; boolean passing = true; if (testGrade < 60) passing = false; System.out.println(testGrade + ”notu geçer demek” + passing + ”olur”); Örnekler
Boole ve İlişkisel operatörler • Boole: Java: VE&& VEYA|| DEĞİL! • İlişkisel: eşittir == eşit değildir!= küçüktür < küçük ya da eşittir <= büyüktür > büyük ya da eşittir >= • Not: Atama =
Örnek if (enrolled && passing) { // etc. } Java, şartlardan sadece bir tanesinin değerlendirilmesi gibi bir imkan da sunar. Eğer ilk şart doğruysa, ikinci şarta bakılmaksızın toplam koşul doğru kabul edilir ve değerlendirme sona erer. if (enrolled(studentNum) || getPassing(studentNum)) { // etc. }
Biraz da kod public static void main(String args[]) { int quiz1 = 42; int quiz2 = 99; if(isPassing(quiz1) && isPassing(quiz2)) System.out.println(“Passed both quizzes”); } public static boolean isPassing(int testGrade) { boolean passing = true; if (testGrade < 60) passing = false; System.out.println(“Is “ + testGrade + “ passing? “ + passing); return passing; } Çıktı?
Sonuç? a Is 42 passing? false b Is 42 passing? false Is 99 passing? true Neden?