Görsel Programlama

advertisement
Görsel Programlama
Temel Veri Tipleri, Değişkenler, Operatörler,
Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc
Sözcüksel Kurallar
• Java programları aşağıdaki bileşenlerin bir kolleksiyonudur:
•
•
•
•
•
•
Boşluk (whitespace)
Anahtar Kelimeler (keywords)
Tanımlayıcılar (identifiers)
Hazır bilgiler (literals)
Yorumlar (comments)
Ayırıcılar (seperators)
• Java serbest formlu bir dildir ve herhangi bir hizalama kuralı yoktur.
• Bir veya birden fazla boşluk arasında fark yoktur: boşluk, tab, alt satır...
Anahtar Kelimeler
abstract
continue
for
new
switch
assert
default
goto
package
synchronized
boolean
do
if
private
this
break
double
implements
protected
throw
byte
else
import
public
throws
case
enum
instanceof
return
transient
catch
extends
int
short
try
char
final
interface
static
void
class
finally
long
strictfp
volatile
const
float
native
super
while
Tanımayıcılar
• Tanımlayıcılar çeşitli bileşenlere isim vermek için kullanılır:
• Değişkenler
• Metotlar
• Sınıflar
• Büyük/küçük harfler, sayılar, alt çizgi karakteri veya dolar işareti
içerebilir
• Büyük/küçük harf ayrımı vardır. Örnek: count, Count ve couNt
• İsimler bir rakamla başlayamazlar
• Anahtar kelimeler ile true, false ve null değerleri isim olarak
kullanılamaz
Hazır bilgiler ve Yorumlar
• Hazır bilgiler: Java’da kullanılan sabit değerlerdir
•
•
•
•
100 -> tam sayı
98.6 -> ondalıklı sayı
‘X’ -> karakter
“This is a test” -> karakter katarı
• Tek satırlı, çok satırlı ve dökümantasyon yorumları
• Tek satırlı: // karakterkeri ile başlar
• Çok satırlı: /* karakterleri ile başlar ve */ karakterleri ile biter
Ayırıcılar
Belirli ifadelerin kullanılması ve kod cümlelerinin ayrılabilmesi için
kullanılan karakterlerdir.
•
•
•
•
•
•
Noktalı virgül -> ;
Köşeli parantez -> [ ]
Süslü Parantez -> { }
Virgül -> ,
Nokta -> .
İki tane iki nokta üst üste -> ::
Ayırıcılar – Noktalı Virgül
Noktalı virgül (;), kod cümlelerini ayırmak için kullanılır. En sık kullanılan
ayırıcıdır.
i=i+1;
j = j + 3; k = 13;
Ayırıcılar – Köşeli Parantez
Köşeli parantez ([ ]), dizi tanımlamak ve dizi elemanlarına erişmek için
kullanılır
int[] dizim = new int[4];
dizim[0] = 34;
dizim[1] = dizim[2] + dizim[3];
Ayırıcılar – Süslü Parantez
Süslü parantez ({ }), dizilerin ilk değerlerini atamak için ve kod blokları
(sınıflar ve metotlar gibi) tanımlamak için kullanılır
int[] dizim = {2, 4, 7, 9, 12};
class Araba {
…..
}
Ayırıcılar – Virgül
Virgül (,) for döngüsü içerisinde ve değişken tanımlarında aynı tipte
değişkenleri sıralarken kullanılır
int[] dizim = {2, 4, 7, 9, 12};
double[] dizim2 = {2.3, 4.1, 7.0, 9.23};
for (int i=0, j=3; i<20; i++, j=j+2)
Ayırıcılar – Nokta
Nokta (.), paket adlarını alt paketlerden ve sınıflardan ayırmak için ve
metot veya değişkeni referans değişkenden ayırmak için kullanılır.
import java.util.Timer;
Araba a;
a.gazaBas();
a.vites = 5;
Ayırıcılar – İki Tane İki Nokta Üst üste
İki tane iki nokta üst üste (::), metot ya da yapıcı
referansı oluşturmak için kullanılır (Java 8)
Class Hey{
private double square(double num){
return Math.pow(num , 2);
}
}
Hey hey = new Hey();
Function<Double, Double> square = hey::square;
double ans = square.apply(23d);
Temel veri tipleri
• byte: 8 bit, değer aralığı: -128 ... 127
• short: 16 bit, değer aralığı: -32768 ... 32767
• int: 32 bit, değer aralığı: -231 ... 231 − 1
• long: 64 bit, değer aralığı: -263 ... 263 − 1
• float: 32-bit tek duyarlıklı (single-precision) ondalıklı sayı
• double: 64-bit çift duyarlıklı (double-precision) ondalıklı sayı
• boolean: iki değer alabilen veri tipi: true ve false
• char: 16-bit evrensel kod (Unicode) karakter
Örnek: Karakter Değişkeni Örneği
Double veri tipinde “pi” ve “yaricap” değişkenlerini tanımlayıp, dairenin
alanını hesaplayan ve ekrana yazdıran Java programını yazınız.
public static void main(String[] args) {
char ch1, ch2;
ch1 = 88; // X karakteri icin ASCII kod
ch2 = 'Y';
System.out.println(ch1);
System.out.println(ch2);
}
Operatörler
• Atama: =
• Aritmetik: + - * / %
• Tek terimli: + - ++ -- !
• Eşitlik: == !=
• İlişkisel: > >= < <=
• Koşullu: && ||
• Tip Karşılaştırma: instanceof
• Bitsel: ~ & | ^
• Bit kaydırma: << >> >>>
Örnek: Daire Alanı Hesabı
Double veri tipinde “pi” ve “yaricap” değişkenlerini
tanımlayıp, dairenin alanını hesaplayan ve ekrana
yazdıran Java programını yazınız.
Örnek: Daire Alanı Hesabı - Çözüm
public static void main(String[] args) {
double pi, r, a;
r = 10.8; // dairenin yaricapi
pi = 3.1416; // yaklasik pi degeri
a = pi * r * r;
System.out.println(a);
}
Aritmetik ve Atama Operatörlerinin
Birleştirilmesi
Aritmetik operatörleri atama opertörleri ile birlikte kullanmak için
kullanılan özel operatörlerdir
a = a + 4;  a += 4;
a = a % 2;  a %= 2;
Örnek: Aritmetik ve Atama Operatörlerinin
Birleştirilmesi
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
a += 5;
b *= 4;
c += a * b;
c %= 6;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
Arttırma ve Azaltma Operatörleri
• Tam sayı değerleri birer arttırmak ya da azaltmak için kullanılan
operatörlerdir
x = x + 1;  x++;
x = x - 1;  x--;
• Arttırılacak/azaltılacak değerin önüne ya da arkasına
yazılabilirler
Örnek: Arttırma ve Azaltma Operatörleri
public static void main(String[] args) {
int a = 1;
int b = 2;
int c, d;
c = ++b;
d = a++;
c++;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
Kısa-Devre Mantıksal Operatörler
• AND ve OR operatörlerinin ikincil versiyonlarıdır.
• Duruma göre sağdaki ifadenin doğru veya yanlış olup olmadığını
test etmeden sonuca ulaşmayı sağlarlar
• Örnek: OR ifadesinde birinci ifade doğru ise, ikinci ifadeye
bakmadan sonuç doğru atanabilir
• Bu operatörleri kullanmanın bazen avantaj sağladığı durumlar
olabilir
if (bolen != 0 & sayi / bolen > 10) …
Soru İşareti Operatörü
• Bazı if-then-else cümlelerinin yerini alabilen üç yollu
operatördür
• Başlangıçta karmaşık gelebilir ancak öğrenildiğinde etkin bir
şekilde kullanılabilir ve aşağıdaki formdadır:
sonuc = ifade1 ? İfade2 : ifade3
• “ifade1” ikili (boolean) sonuç döndüren herhangi bir ifade
olabilir.
• Eğer “ifade1” in sonucu doğruysa, “ifade2” işletilir. Yanlışsa
“ifade3” işletilir. İşletilen sonuç ise “sonuc” değişkenine atanır.
Örnek: Soru İşareti Operatörü
public static void main(String[] args) {
int i, j;
i = 10;
j = i < 0 ? -i : i; // mutlak degeri al
i = -10;
j = i < 0 ? -i : i; // mutlak degeri al
System.out.println(j);
}
Operatör Önceliği
En yüksek
++ (postfix)
-- (postfix)
++ (prefix)
-- (prefix)
~
*
/
%
+
-
>>
>>>
<<
>
>=
<
==
!=
&
^
|
&&
||
?:
->
=
En düşük
op=
!
+ (unary)
<=
instanceof
- (unary)
Tip dönüşümü
Operatör Önceliği - Açıklamalar
• Üst satırlardaki operatörler, alt satırdakilere göre önceliklidir
• Aynı satırdaki operatörler aynı önceliktedir
• İkili (binary) işlemlerde ifadeler soldan sağa doğru hesaplanır
• Eşitlik ifadeleri sağdan sola doğru işletilir
• [] ve () operatör olmamalarına rağmen, operatör gibi davranırlar
ve en yüksek önceliğe sahiptirler
• İfadelerin öncelik sırasını değiştirmek için parantezler
kullanılabilir
Akış Kontrolü
• If
• If-else
• If-else-if
• Switch
• Dallanma: break, continue, return
Örnek: If-Else-If
public static void main(String[] args) {
int ay = 4;
if (ay == 12 || ay == 1 || ay == 2)
System.out.println("Mevsim: Kis");
else if (ay == 3 || ay == 4 || ay == 5)
System.out.println("Mevsim: Ilkbahar");
else if (ay == 6 || ay == 7 || ay == 8)
System.out.println("Mevsim: Yaz");
else if (ay == 9 || ay == 10 || ay == 11)
System.out.println("Mevsim: Sonbahar");
else
System.out.println("Gecersiz Ay");
}
Örnek: Switch
int ay = 4;
switch (ay) {
case 12: case 1: case 2:
System.out.println("Mevsim: Kis");
break;
case 3: case 4: case 5:
System.out.println("Mevsim: Ilkbahar");
break;
case 6: case 7: case 8:
System.out.println("Mevsim: Yaz");
break;
case 9: case 10: case 11:
System.out.println("Mevsim: Sonbahar");
break;
default:
System.out.println("Gecersiz Ay");
}
Değişkenlerin Etki Alanı
public static void main(String[] args) {
int x = 10; // main icerisinde her yerden gorunur
if (x == 10) { // yeni blok baslangici
int y = 10; // sadece bu blokta gorunur
// Hem x hem y burada biliniyor
x = y * 2;
}
// y = 100; // Hata! y bu blokta bilinmiyor
// x bu blokta halen biliniyor
System.out.println(x);
}
Tip Dönüşümleri
• Belli bir tipteki veri, diğer bir tipteki değişkene atanmaya
çalışıldığında, eğer aşağıdaki şartlar sağlanıyorsa dönüşüm otomatik
gerçekleşir:
• İki tip birbiriyle uyumlu olmalıdır (örneğin int ve byte)
• Hedef tip, hafızada kaynak tipten daha çok yer kaplıyorsa
• Yukarıdaki ikinci şartın sağlanmaması durumunda dönüşümü açıkça
isteyebilirsiniz:
int a; byte b;
b = (byte) a;
Sınıflar
• Programcı tarafından tanımlanan veri tipleridir
• Nesne: sınıfın bir örneğidir
• Sınıf tanımı, sınıfın adında bir Java dosyası içerisinde yapılır:
<SınıfAdı>.java
• Sınıf adları geleneksel olarak büyük harfle başlar
• Sınıf üyeleri: değişkenler (fields) and metotlar (methods)
• Değişkenler: nesne içerisindeki değişkenlerdir
• Temel veri tipi veya sınıf tipi
• Metotlar: Java komutlarını içeren prosedürlerdir (functions?)
Örnek: MyClass.java
class MyClass {
int myVariable;
int getVariable() {
return myVariable;
}
void setVariable(int value) {
myVariable = value;
}
}
Sınıf Üyelerine Erişim
• Sınıfın içerisinden:
• Değişkenin yada metotun adı kullanılarak erişilir.
• Örnekler:
myVariable = 0;
setVariable(0);
• Opsiyonel olarak, this anahtar kelimesi kullanılabilir, e.g.
this.myVariable
• Yerel değişkenler alanı gölgelediği durumda gereklidir
• Dışarıdaki bir sınıftan:
• Nesne değişkeni + . + alanın yada metotun adı
Örnekler:
myObject.myVariable = 0;
myObject.setVariable(0);
Örnek: Sınıf Kullanımı
Aşağıda tanımlı “Kutu” sınıfından (1) bir nesne oluşturup, (2) kutunun
genişliği, yüksekliği ve derinliğini ilgili sınıf değişkenlerine atayıp, (3)
kutunun hacmini hesaplayan ve ekrana yazan Java programını yazınız.
class Kutu {
double genislik;
double yukseklik;
double derinlik;
}
Örnek: Sınıf Kullanımı (Çözüm)
public static void main(String args[]) {
Kutu kutu1 = new Kutu();
double hacim;
// kutu1 nesnesinin ozelliklerini değiştir
kutu1.genislik = 10;
kutu1.yukseklik = 20;
kutu1.derinlik = 15;
// kutu1 kutusunun hacmini hesapla ve ekrana yazdir
hacim = kutu1.genislik * kutu1.yukseklik * kutu1.derinlik;
System.out.println(hacim);
}
Örnek: Sınıf Metotu Tanımlama
Aynı örneği, “Kutu” sınıfına “hacimHesapla” adlı metotu ekleyip main
metotundan bu metotu çağırarak gerçekleştiriniz. “hacimHesapla”
metotu herhangi bir parametre almamalı ve hesaplanan hacmi
döndürmelidir.
Örnek: Sınıf Metotu Tanımlama (Çözüm)
class Kutu {
double genislik;
double yukseklik;
double derinlik;
double hacimHesapla() {
return genislik * yukseklik * derinlik;
}
}
Örnek: Sınıf Metotu Tanımlama (Çözüm)
(devam)
public static void main(String args[]) {
Kutu kutu1 = new Kutu();
double hacim;
// kutu1 nesnesinin ozelliklerini değiştir
kutu1.genislik = 10;
kutu1.yukseklik = 20;
kutu1.derinlik = 15;
// kutu1 kutusunun hacmini hesapla ve ekrana yazdir
hacim = kutu1.hacimHesapla();
System.out.println(hacim);
}
Paketler (1/2)
• Sınıflar paketler içerisinde gruplanır
• Mantıksal gruplama
• Sınıflara ya da sınıf üyelerine erişimin düzenlenmesi
• Paket adları hiyerarşik yapıda tanımlanır
• Üst seviyeden alt seviyeye doğru
• Örnekler:
• org.organization.product
• com.company.division.product
• Kaynak kodların ve derlenen dosyaların dizin hiyerarşisi paket
adlandırmasına uygun olmalıdır.
• Örnek: org/organization/product/MyClass.java
Paketler (2/2)
• Bir paket sınıflara ya da alt paketlere sahip olabilir
• Örnek: “com.company.division”, “com.company” paketinin alt paketidir
• Tam anlamıyla tanımlanmış sınıf adları (sınıfın tam adı) paket adını
içerir:
• Örnek: “org.organization” paketindeki Product sınıfı:
“org.organization.Product”
• Farklı paketlerde aynı isimli sınıflara izin verilir
• Java anahtar kelimesi: package
• Sınıf tanımının bulunduğu dosyanın en üstünde kullanılır
• Örnek:
package org.organization;
Sınıf Görünürlüğü (1/2)
• Normalde sınıflar sadece tanımlı olduğu paket içerisinden görülür
• Public sınıflar herhangi bir paketten görülebilir
• Örnek:
public class MyClass {
// Sınıf tanımı
}
• Public bir sınıfa başka bir paketten erişebilmek için:
• Ya sınıfın tam adı (paket adı ile birlikte sınıf adı) kullanılmalı
• Ya da sınıf içeri aktarılmalıdır (import):
• Tek bir sınıfın içeri aktarılması: import <paket_adı>.<sınıf_adı>;
• Bir paketteki tüm public sınıfların içeri aktarılması: import <paket_adı>.*;
Sınıf Görünürlüğü (2/2)
• Örnek:
• com/company/firstpackage/FirstClass.java:
package com.company.firstpackage;
public class FirstClass {
// Sınıf tanımı
}
• com/company/secondpackage/SecondClass.java:
package com.company.secondpackage;
import com.company.firstpackage.FirstClass;
class SecondClass {
FirstClass firstObject;
// ...
}
• java.lang paketi içerisindeki sistem sınıfları içeri aktarılmadan görünür
haldedir ve direk kullanılabilir
Sınıf Yapıcıları (1/5)
• Yeni bir nesne, new operatörü kullanılarak oluşturulur:
MyClass myObject = new MyClass();
• Sınıf yapıcısı: Nesne oluşturulurken otomatik çağırılan özel sınıf
metotudur
• Yapıcı tanımlama:
MyClass(...) {
// ...
}
• Otomatik tanımlanan varsayılan yapıcı, parametresi olmayan boş bir
fonksiyondur
• Eğer sınıfta bir yapıcı tanımlanrsa, bu sınıf için varsayılan yapıcı
tanımlanmaz
Sınıf Yapıcıları (2/5)
• İstenildiği kadar yapıcı tanımlanabilir (farklı parametre listesine sahip
olmaları şartıyla)
• Örnek:
MyClass() {
// Parametresi olmayan yapıcı
}
MyClass(int arg0, double arg1) {
// Bir «int» ve bir «double» parametre alan yapıcı
}
• Boş olmayan parametre listesine sahip bir yapıcıyı çağırma örneği:
MyClass myObject = new MyClass(arg0, arg1);
Sınıf Yapıcıları (3/5)
• Bir yapıcı, diğer bir yapıcıyı çağırabilir
• Yapıcı çağırma şekli: this(...)
• Örnek:
MyClass() {
this(0, 0.1);
}
MyClass(int arg0, double arg1) {
// Bir «int» ve bir «double» parametre alan yapıcı
}
Sınıf Yapıcıları (4/5)
• Sınıf yapıcıları genellikle sınıf değişkenlerine ilk değer atamak için
kullanılır
• Yapıcılar dışında, değişken tanımlama sırasında da ilk değer ataması
yapılabilir
• Değişkenlere ilk değer atanmaması durumunda varsayılan değerleri
kullanılır:
• Sayısal değişken tipleri için 0
• Boolean tip için false
• Sınıf tipleri için null
Sınıf Yapıcıları (5/5)
Sınıf değişkeni ilk değer atama örneği:
class MyClass {
int zeroField; // varsayılan değer: 0
int myField = 1;
MyClass() {
}
MyClass(int value) {
myField = value;
}
}
// ...
MyClass firstObject = new MyClass();
// firstObject.myField = 1
MyClass secondObject = new MyClass(2);
// secondObject.myField = 2
Örnek: Sınıf YapıcısıTanımlama
Daha önce çözdüğünüz “Kutu” örneğinde, (1) “Kutu” sınıfına genişlik,
yükseklik ve derinlik parametrelerini alan bir yapıcı ekleyiniz ve (2) main
metodunu bu yapıcıyı çağırarak Kutu nesnesini oluşturacak şekilde
değiştiriniz.
Örnek: Sınıf Yapıcısı Tanımlama (Çözüm)
class Kutu {
double genislik;
double yukseklik;
double derinlik;
Kutu(double g, double y, double d) {
genislik = g;
yukseklik = y;
derinlik = d;
}
double hacimHesapla() {
return genislik * yukseklik * derinlik;
}
}
Örnek: Sınıf YapıcısıTanımlama (Çözüm)
(devam)
public static void main(String args[]) {
// kutu1 yapıcısını genislik, yukseklik ve derinlik parametreleri ile cagir
Kutu kutu1 = new Kutu(10, 20, 15);
double hacim;
// kutu1 kutusunun hacmini hesapla ve ekrana yazdir
hacim = kutu1.hacimHesapla();
System.out.println(hacim);
}
Standart Java Paketleri
JavaDoc
• Java kaynak kodlarından otomatik olarak HTML formatında API
dökümantasyonu oluşturmaya yarayan araçtır.
• Oluşturulan HTML kodu, ilişkili metot ve sınıfları web bağlantıları
aracılığıyla birbirine bağlar.
• Normalde Java kodlarındaki yorum satırları, /* ve */ karakterleri
arasına yazılırken, JavaDoc dökümantasyonu üretmek için
kullanılan yorumlar, ekstra bir yıldız (*) kullanılarak başlatılır: /*
yerine /**
JavaDoc – Sınıf Örneği
/**
* Sınıfın açıklaması
* @author
Firstname Lastname <address @ example.com>
* @version
1.6
* @since
2010-03-31
*/
public class Test {
// class body
}
(current version number of program)
(the version of the package this class was first added to)
JavaDoc – Metot Örneği
/**
* Validates a chess move.
*
* @param theFromFile file from which a piece is being moved
* @param theFromRank rank from which a piece is being moved
* @return true if the move is valid, otherwise false
*/
boolean isValidMove(int theFromFile, int theFromRank, int theToFile, int theToRank)
{
...
}
NetBeans – JavaDoc Oluşturma
Projeniz için JavaDoc’u, proje penceresinde projenize sağ tıklayıp
“Generate Javadoc” menü elememanını seçerek gerçekleştirebilirsiniz.
Örnek: JavaDoc Oluşturma
Daha önce çözdüğünüz “Kutu” örneğinin metotlarına JavaDoc yorumları
ekleyip, NetBeans projesinin JavaDoc’unu üstteki slaytta gösterildiği gibi
oluşturup, oluşan JavaDoc dökümantasyonunu inceleyiniz.
Java7 ve Java8 için JavaDoc
JFreeChart: (Kendi projeleriniz için de javadoc üretebilirsiniz)
http://www.jfree.org/jfreechart/api/javadoc/
Java7:
http://docs.oracle.com/javase/7/docs/api/
Java8:
http://docs.oracle.com/javase/8/docs/api/
Download