31 Ağustos 2013 Cumartesi

Android Oyun Programlama Dersleri - Gün 3 - Daha Çok Temel








Android oyun programlama derslerimin 3. gününe hoş geldiniz. Bu gün java konusuna devam ederek değişkenlere yakından bakacağız. Bu konunun sizler için çok faydalı olacağını düşünüyorum. Lütfen atlamadan takip etmeye çalışın.

GÜN 3, DERS 1-0 : Değişkenlere yakından bakış

Daha önce yarattığımız telefon isimli sınıfı hatırlıyorsunuzdur. Hatırlamayanlar için :

public class Telefon{

 // Telefonun özelliklerini tanımlayan değişkenler yaratalım

 int agirlik = 0;
 boolean acildi = false;
 String renk = "turuncu";


      // Bu metod telefonun açılmasını kontrol edecek

 void TelefonuAc(boolean acildi){  
  if(acildi == true){
   acildi = false;
  }else{
   acildi = true;
  }
 }
}

ilk yarattığım üç değişken (agirlik, acildi, renk isimli değişkenler) integer, boolean ve String türünde yaratılmıştır. Bu gün bunların detaylarına bakacağız.

Temelde 4 tip değişken vardır (Değişken = Variable ! Unutmayın değişken, tür yada sınıf değil, değişken ! yani değişebilen şey...)

Temelde 4 tip değişken vardır :

Bir objenin yeniden yaratılmış kopyaları yani instance objeler. Örneğin yukarıdaki Telefon sınıfından türeteceğiniz bir obje, bu sınıfın kopyası yada instance versiyonu olacaktır. Dolayısı ile her üretilen telefon nesnesinin kendi agirlik, acildi, renk değişkenleri oluşacaktır. Ancak biz onları bir kez tanımladık ! Bu değişkenlere değer verdiğinizde sadece o telefon nesnesini etkileyecekler, diğer telefon objelerindeki ikiz kardeşleri bu durumdan etkilenmeyecektir.

Bu durumda şöyle diyebiliriz, bu 4 tip değişken ,

1. Instance Variable (Kopya Değişkenler) : Bir değişken static olarak tanımlanmadığı sürece kopya değişken olarak varsayılacaktır. bu durumda bu kopya değişkenlerden her biri kendi değerini alabilir.

2. Class Variable (Sınıf Değişkeni) : Değişken tanımlamasında static kelimesi kullanıldığında basitce bu değişkenden sadece bir tane olabilir demiş olursunuz. Kullandığınız sınıf birden fazla nesne yaratmış olsa dahi bu değişken tekil olmaya devam edecektir.

public class Telefon{

 // Telefonun özelliklerini tanımlayan değişkenler yaratalım

 static double versiyonNumarasi = 3.1;
 int agirlik = 0;
 boolean acildi = false;
 String renk = "turuncu";


      // Bu metod telefonun açılmasını kontrol edecek

 void TelefonuAc(boolean acildi){  
  if(acildi == true){
   acildi = false;
  }else{
   acildi = true;
  }
 }
}

Örneğin bu telefon sınıfından türetilecek tüm telefon objelerinin versiyon numarası tekil olacaktır. Java (veya başka bir programlama dili) ile gerçek dünyadaki olaylara yakın örnekler kurabiliriz.

Bunu daha gerçekçi bir örnek ile açıklayalım :

Diyelim ki ; Samsung bu gün bizim telefon sınıfımızı kullanarak 10 Android Telefon üretmiş olsun. Yarın 10 kullanıcı bu 10 telefonu satın aldığında telefonları tanıyabilmek için şu şekilde etiketleyelim : Telefon1, Telefon2, Telefon3 ............

Eğer Samsung bir yenileme (update) yayınlarsa bu durumda tüm telefonların versiyon numaralarının güncellenmesini isteyeceğiz. (Gerçekçi bir örnek oldu !)

Bunu java kodu ile anlatmamız gerekirse :

static void TelefonlariGuncelle(){
    versiyonNumarasi = 3.2;
}

(Not : Burada eşittir işareti matematiksel olarak düşündüğünüzde kafanızı karıştırabilir. Eşittir işareti java, c ve türevi programlama dillerinde eşitlik anlamına gelmez, eşit olsun anlamına gelir. Yani versiyonNumarasi 3.2 ye eşit olsun veya versiyonNumarasi 3.2 değerini alsın şeklinde düşünebilirsiniz.)

Dikkat ettiyseniz versiyonNumarasi değişkenimizi static olarak tanımlamıştık. Bu durumda bu değişkeni bir kez değiştirdiğimizde yani değerini yeniden tanımladığımızda tüm kopyalarının değeri tanımlanmış olacaktır. Ancak bir telefon sahibinin başka birinin telefonunu açıp kapatmasına izin vermek istemeyeceğimiz için acildi isimli değişkeni static olarak tanımlamadık.

Peki hangi telefonun açık hangisinin kapalı olacağını nasıl ayarlayacağız  ?
Çok basit, telefonları etiketlemiştik hatırladınız mı ? Bu etiketleri kullanacağız :

static void acmaKapamaDugmesineBasildi(){
 if(Telefon1.acildi == true){
  Telefon1.acildi = false;
 }else{
  Telefon1.acildi = true;
 }
}

Son değişken tipimizi hatırlarsak ( String renk = "Turuncu"; ) bu bir metinsel değişkendir. İçerisinde metinsel ifadeler tutabilir. Diyelimki bu değişken asla ama asla değişmeyecek. Bu durumda özel bir ek ile bunu javaya söylememiz gerekir ; final . Yani asla değişmeyecek olan değişkenlerimizi şu şekilde tanımlayabiliriz. final String renk = "Turuncu";

Burada 4 değişken tipinden bahsediyorduk. Hadi 3. değişken tipine bakalım ;

3. Local Variable (Yerel Değişken) : Bir metod içinde yarattığınız değişken o metot içerisine tanımlı olacaktır. Aynı ada sahip olsa bile o metod dışında yaratılan değişkeni hiç bir şekilde etkilemez. Bu tip değişkenlere yerel değişken deriz. Aynı şekilde Bir sınıf içinde yaratılan değişken de başka sınıfları etkilemez. Bu durumda o değişken o sınıfın yerel değişkeni (Local Variable) dir.

public class yerelDegiskenler{

 // Bu bir sınıf yerel değişkeni, tüm sınıf içinde erişilebilir

 static double pi = 3.14;

 public static void main(String[] args){
  // Bu bir metod yerel değişkeni.
  // Bunun anlami bu cap degeri sadece
                // bu metod içinde tanımlı dışaridakileri etkileyemez.

  double cap = 2.0;
  cap = (cap * cap) * pi;
 }

 static void ikinciMetod(){
  double cap = 18.0;
  cap = cap + pi;
 }
}

Buradaki örnekte gördüğümüz gibi;
1. pi bir sınıf değişkeni olarak tanımlanmış
2. main metodu içinde bir cap değişkeni tanımlanmış.
3. ikinciMetod içinde başka bir cap değiskeni tanımlanmış.

UNUTMAYIN : Bir metod içinde tanımladığınız ve kullandığınız değişken o metod için geçerlidir. Diğer metodları veya sınıf değişkenlerini etkilemez !

ve son değişken tipi olarak :

4. Parameter Variables (Parametre Değişkenleri) : Bir yerel değişkeni başka bir metod içinde kullanmak veya değerini değiştirmek için kullanılan parametre değişken tipidir. Değişkenlerin ve değerlerinin metodlar hatta sınıflar ve hatta uygulamalar arasında değiştirilebilmesini, kullanılabilmesini sağlarlar.

public class yerelDegiskenler{
 // Bu bir sınıf yerel değişkeni, tüm sınıf içinde erişilebilir
 static double pi = 3.14;

 public static void main(String[] args){
  // Bu bir metod yerel değişkeni.
  // Bunun anlami bu cap degeri sadece bu metod 
  // içinde tanımlı dışaridakileri etkileyemez.
  double cap = 2.0;
  cap = (cap * cap) * pi;

  // hadi buradan ikinci metodu çağırarak ona cap degerini gönderelim

  ikinciMetod(cap);

 }

 // simdi cap degiskenini metod icinde değil
 // parametre olarak tanimladik

 static void ikinciMetod(double cap){
  cap = cap + 5;
 }
}

Bu örnekte olduğu gibi bir metodu çağırdığınızda java sizden bir parametre isteyecektir. Tanımlanan özelliklerdeki parametre yerel bir değişken olarak o metod içinde işlenebilir ve onu çağıran sınıf veya metoda geri gönderilebilir.

Bir metodu çağırmak için şu kodu kullanıyorduk : metodAdi(); Eğer bu metod bir veya birden fazla parametre istiyorsa java hata vererek size bu durumu anlatacak ve parametre isteyecektir. Bu hatayı console panelinde görebilirsiniz. :



Peki biz ikinciMetod isimli metodu çağırdığımızda neler oluyor ?
main metod içinde tanımlanmış ve değer almış olan cap degiskeni parametre ile ikinciMetod fonksiyonuna geçiyor. (Hatırlarsanız metodlara fonksiyon da diyebiliyoruz, METOD = FONKSİYON) ikinciMetod fonksiyonu içinde tekrar yeniden işlenerek değer alıyor. Sonuç olarak hala iki farklı yerel cap değişkeni var, bir tane değil !

Bunun anlamı nedir ?
main fonksiyonu içindeki cap değişkeninin değeri : 12,56 dır.
ikinciMetod fonksiyonu içindeki cap değeri ise : 17,56 dır.
Karışık mı geldi ? Son paragrafları birkaç kez okuyun. Daha anlaşılır hale gelecektir.

4. günde görüşmek dileğiyle....








Dip Not : Sizinde fark ettiğiniz gibi bir ders hazırlamak gerçekten zor. Bu yüzden internette Türkçe kaynak bulmak gerçekten zor hale geliyor. Bir dersin hazırlanma süresi sizin onu okuma sürenizden defalarca kez fazla. Derslerin devamı ve ücretsiz kalması için desteğinizi lütfen esirgemeyin.

Destek olmak için :

1. Bağışta bulunabilirsiniz. Sağ taraftaki "PAYPAL DONATE" butonunu kullanarak bağış yapabilirsiniz.
2. Derslere yorum yazabilirsiniz. Farkettiğiniz hataları, Eleştirilerinizi veya takdirinizi belirtmekten çekinmeyin.
3. Dersleri facebook, twitter gibi sosyal medya ortamlarında ilgisini çekeceğini düşündüğünüz arkadaşlarınız ile paylaşın.
4. Emeğime saygı gösterin ve metni kopyalayıp forumlara yapıştırmayın. Bunun yerine dersin linkini yayınlayın. Merak etmeyin o forumu okuyabilen insanlar bu sayfayı da okuyabilirler...

Teşekkürler.

2 yorum:

  1. Merhabalar;

    Dersleriniz çok iyi, anlatımınız süper.

    Neden dersleri bıraktınız?

    YanıtlaSil
  2. Dersleri bırakmanız anlaşılan gerçekten insanları üzmüş.

    YanıtlaSil