Scope and Life Time – Java

SCOPE AND TIME DURATION
Bu konunun Türkçe ismi “Yaşam Alanı ve Yaşam Süresi”dir.
Çok fazla abartılacak kadar zor bir konu da değildir. Aynı zamanda kısa bir konudur.
Konu sadece, “Bu scope and Time Duration” da neymiş sorusunun cevabı olan basit bir konu.
Konu pek “zorlu ve uzun” olmadığından bunu kısa örnekler halinde anlatmak daha doğru bir karar olacaktır.
Çünkü konu, değişkenler neredeyken hata alırız neredeyken almayız sistemiyle gidiyor.
Yaşam Alanı – Scope
Yaşam alanı, adından da anlaşılacağı gibi, bir değişken(variable)’in içinde tanımlı olduğu yerdir. Yani scope, bir değişkenin ulaşılabileceği sınırları belirler.
Yaşam Süresi- lifetime- time duration
Yaşam süresi, bir değişkenin oluşturulduğu andan yok edileceği zamana kadarki süredir. Değişkenler, genel olarak yaşam alanlarının bittiği yerde yok edilirler.
(İlk olarak)En basitindan başlarsak, değişkenler, tanıtıldığı satırdan itibaren hayattadır. Bunun üstünde kullanmaya çalışırsak hata alırız.
Mesela;
public class Scope{
public static void main(String[] args) {
System.out.println(x);
int x=0;
}
}

Hatamz:\\scope.java:14: error: cannot find symbol
System.out.println(x);
symbol:   variable x
location: class scope

Kurallar halinde söylemek istersek;
• class düzeyinde tanıtılan değişkenler, o class içindeki tüm metodlarda kullanılabilirler.
• Bir method içinde tanıtılan değişken, sadece o method içinde yaşar.
• parametre olarak alınan değişkenler de, yalnızca o metod içinde yaşarlar.
• Bir yaşam alanı içinde tanıtılan değişkenlere bu yaşam alanı dışında kullanılamazlar.
• Bölgeler iç içe oluşturulabilir. Dış bölge iç bölgeyi kapsar.
• Dış bölgede(kapsayan bölge) tanıtılan değişkenler iç bölgede de ulaşılabilir durumdadır.
• İç bölgede tanıtılan değişkenler dış bölgede kullanılamazlar.
—> Aslında tüm bu söylediklerimiz, tek bir kurala dayanıyor.
Bir değişken, içinde bulunduğu en dar, en küçük kapsamlı “{ }” işaretleri arasında canlıdır. Çok yoğun bir cümle gibi gözüküyor olabilir ama diğer
hiçbir tanım tam sayılmaz. Biraz daha açıkça belirteyim. Mesela “gecici” değişkeni,
for(i=1;i<11;i++){
int gecici=5;
gecici*=i;
}

şeklinde tanıtılırsa, bu for’u kapsayan main veya onu da kapsayan class düşünülmez. kendinden önceki “{” işaretinin kapandığı yerde yok edilir.Yani “gecici” isimli değişken,
for’u kapatan “}” ile yok olur.
for(i=1;i<11;i++){
int gecici1=5;
if(i%3==0){
gecici1*=i+1;
}
}

Burada, gecici1 değişkeni yine for’u kapatan “}” ile yok olur, (Bariz bir şekilde) if’i kapatanla değil.
Aşağıdaki kodda, y if içinde tanıtılmıştır ve if’in dışında ulaşılamaz.
public class Main {
public static void main(String args[]) {
if (true) { // yeni yaşam alanı başlar
int y = 20; // sadece bu alanda tanınır.
System.out.println(“y: ” + y);
}
y = 100; // Hata! y burada tanınmıyor.
}
}

Aşağıdaki derleme hatasını oluşturur.
Main.java:7: cannot find symbol
symbol : variable y
location: class Main
y = 100; // Hata! y burada tanınmıyor.

public class Main {
public static void main(String args[]) {
int x; // main içinde yaşar.
x = 10;
if (x == 10) { // yeni bir yaşam alanı başlatır
int y = 20; // y sadece bu iç alanda tanınır.
// x ve y, ikisi de burada kullanılabilir.
System.out.println(“x and y: ” + x + ” ” + y);
x = y + 2;
}
System.out.println(“x is ” + x);
}
}
Output:
x and y: 10 20
x is 22

• Bir yaşam alanı içinde tanıtılan değişken, o yaşam alanının tekrar çağırılması durumunda yeni baştan oluşturulur. Eski değerini korumaz.
public class Main {
public static void main(String args[]) {
for (int i = 0; i < 3; i++) {
int y = 0; // her defasında bu döngüye girildiğinde y tekrar oluşturulur.
System.out.print(“y is: ” + y);
y = 100;
System.out.println(” y is now: ” + y);
}
}
}
Bu programın oluşturduğu çıktı:
y is: 0 y is now: 100
y is: 0 y is now: 100
y is: 0 y is now: 100

• İç bölgede tanıtılacak bir değişken, onu kapsayan bölgede tanıtılmış bir başkasıyla aynı isme sahip olamaz.
public class Main {
public static void main(String args[]) {
int i = 1;
for(int x=0;x<50;x++){ // yeni yaşam alanı oluşturur.
//bazı kodlar
int i = 2; // Derleme hatası – Compile-time error
}
}
}

Yukarıdaki kodu derlemeye çalışırsanız, şu hata mesajını alırsınız.
Main.java:7: i is already defined in main(java.lang.String[])
int i = 2; // Compile-time error

_______________________________
Şimdi gelelim daha önce muhtemelen hiçbirinizin denemediği bir şeye:
Sizce aşağıdaki kod çalışır mı? Gördüğünüz gibi, herhandi bir komuta bağlı olmayan küme parantezleri açıp kapattık.

Evet arkadaşlar bu kod çalışır.Bir de şuna bakalım.

Bu kodda da aynı şekilde, yaşam alanı dışında ulaşmaya çalıştığımızdan, hata aldık.
scope.java:10: error: cannot find symbol
System.out.println(“WaxtaP sordu: a+b=?\\t”+(a+b));
symbol:   variable b
location: class scope
1 error

Bunu nerede kullanacağız?
Bunu, kodlama yaparken pratik bilgi olarak kullanmamız mümkün sadece. Bir hata gördüğümüzde aşina olduğumuz bir şeyle karşılaşmış oluruz.
Uzun kodlar yazacağımızda, her şeyi tüm main’de veya tüm class’ta tanıtmak yerine belli şartlar oluştuğunda oluşturabiliriz.
Kullandığımız hafıza miktarının bize sorun çıkarmasına engel oluruz böylece.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s