Kotlin 101: Kontrol Yapıları-Control Flows

Recep Fırıncıoğlu

--

Merhabalar,

Bu yazıda, önceki yazımda da ifade ettiğim gibi temel olarak if,else if, while, for, when kontrol yapılarından bahsedeceğim.

Öncelikle kontrol yapıları nedir ve neden kullanıyoruz konusuna bir açıklık getirelim. En basit tabiri ile program akışında karşımıza çıkan durumlar hakkında kararlar vermek, şu olursa bunu yapalım demek için kullandığımız bir karar verme yapısıdır aslında bunlar.

Başlamadan önce, biraz sonra kullanacağımız yeni bir yapıdan, range’den bahsedeceğim. Range yapısı ile sonlu sayili, sıralı listeler oluşturabiliyoruz.

CharRange, IntRange gibi primitive tiplerin kullanımı ile de range tanımı yapilabilir. Bu durumda, first, last, count, step gibi ek bilgiler alinabilir.

If Yapısı

If yapısı güzel Türkçe’mizde eğer anlamına gelmektedir. Eğer kelimesi ile kurabildiğiniz cümleler hayal edin, hepsini bu yapı ile ifade edebilirsiniz. Kotlin’in ilgili referans sayfasına bakarsanız “if expression” şeklinde tanımlanmış olduğunu göreceksiniz. Yani geri değer döndüren bir yapıdır.

Eğer kontrol yapılarını öğrenmek istiyorsanız, bu makaleyi okumalısınız.

Gördüğünüz gibi size bir durum sunuyorum ve durumun gerçekleşebilmesi için bir de koşulumuz var. Herhangi bir durum için birden fazla koşul da sunabilirdim. Örneğin,

Eğer kontrol yapılarını öğrenmek istiyorsanız, bu makaleyi okumalı ve not tutmalısınız.gibi.

Bu örnekleri sonsuza kadar sıralayabiliriz. Artık yapının ne ifade ettiğini temel olarak biliyoruz. Öyleyse örneklerimizi çeşitlendirelim.

Not: $ ve diğer özel karakterler hakkında detaylı bilgi için buraya tıklayınız.

Yukarıdaki yapıda number1 ve number2 adında iki adet int sayı tanımlanmış. Tanımlanan sayılardan hangisinin büyük olduğunu tespit edip bu sayıyı println() metodu ile bir string ifade içinde yazdırıyoruz. Yazdırma işleminde string ifadeler için özel bir kulanım olan, değişken isminin önünde “$” sembolü kullanılması ile ifade edilen string template* yapısından faydalanıyoruz. Görüldüğü üzere “+” operatörüne gerek kalmadan “$” (dolar işareti) ile değişkenimizi istediğimiz string yapısına entegre edebiliyoruz. Kotlin’in güzelliklerinden birine daha tanık oldunuz. Ayrıca bu yapı ile kullandığımız değişkenin var olan herhangi bir özelliğine erişmek için aşağıdaki kod bloğundaki ikinci satırda bulunan yapıdan faydalanabilirsiniz.

Burada da yaptığımız şey aslında aynı, sadece aklımızda canlanabilecek başka ne yapılabilir soruları için eklediğim bir kod bloğu. Yine number1 ve number2 sayılarımız var fakat ek olarak max adında Int tipinde bir sayı alabilen nullable bir değişkenimiz var. Eğer değişken oluştururken değerini vermek istemiyorsak bu nullable değişkenleri kullanabiliriz fakat tipini belirtmek zorundayız. If içerisinde de “number1 sayısı number2 sayısından büyük mü?” diye soruyorum. Cevap “evet” ise if yapısının altındaki ilk süslü parantez bloğu, cevap “hayır” ise else yapısının kod bloğu çalışacaktır.

Not: Kotlinde nullable değişken tanımlamak için iki farklı yöntem var.

!! : Bu operator ile tanımlanan değişkenin null olmayacağını içerisine mutlaka bir değer alacağını belirtmiş oluyoruz. Detaylı bilgi için tıklayınız.

? : Bu operatörle ise söz konusu değişkenin null olabileceği fakat bundan emin olmadığımızı ifade ediyoruz. Dolayısıyla eğer null ise program akışını bozmamak adına ifade yoksayılacaktır. Detaylı bilgi için tıklayınız.

Yukarıda kod bloğunda tanımlanan string tipindeki name değişkeninin null olup olmadığını sorguladığımız bir yapı görülmekte. Öyleyse hemen if yapısının içerisini inceleyelim.

if( (name != null) && (name.lenght > 0) )

İşlem önceliğini kavramak adına bu yapıyı yukarıdaki gibi parantezlerle ayrılmış şekilde de düşünebilirsiniz. “!=” ifadesi ile name değişkeni “null değilse” ve “name.lenght > 0” ile name değişkeninin karakter sayısı sıfırdan büyükse if koşulunun true değer alacağını görebiliyoruz. Söz konusu değişkenimize null olarak tanımlanmış olsaydı, else yapısınn kod bloğu çalıştırılacak ve program çıktısını “Empty string” olarak görecektik. Bu yapılara kendinizi yabancı hissediyorsanız buradan aritmetik ve mantıksal operatörlerle ilgili yazımı inceleyebilirsiniz.

Şimdi “Neden bu şarkıyı koydu buraya, ne alaka yani?” dediğiinizi duyar gibiyim. Hemen açıklayayım; Kotlin referans sayfasında, özellikle isminden dolayı, dikkatimi çeken tatlı mı tatlı bir yapı var ki sizlerle paylaşmadan edemeyeceğim. Karşınızda Elvis Operatörü! Peki neden mi Elvis Operatörü, aşağıdaki görsele göz atın derim. Tam olarak “?:” böyle ifade ediliyor. Peki ne işe yarıyor? Kısaca bu değişken null ise şu işlemi yap demek için kullanılıyor diyerek detaylar için sizi referans sayfasına yönlendireyim ve ufak bir örnekle de açıklamaya çalışayım.

Else if yapısını da içeren çok kısa bir örnekle if defterini kapatacağım. Aslında çalışma mantığında bir farklılık yok. “Şu mu? Bu mu? O mu?” diye soruyoruz bu sefer. Kullanıcıdan girilen bir not ortalaması değeri ile harf notu belirlediğimiz bir kod bloğu ile karşı karşıyayız. Yukarıdan aşağıya doğru hangi aralığa uyuyorsa onun çıktısını veren bir program.

Aynı örneği Range yapısını kullanarak biraz daha basit bir yapıya dönüştürebiliriz.

When Yapısı

When yapısı, diğer dillere en azından bir göz atmış arkadaşlar için switch case yapısı ile aynıdır diye özetlenebilecek bir konu diyebiliriz.

Aldığı parametreye göre eşleştiği değerin içerisindeki kod bloğunu çalıştırdığımız biz yapıdan bahsediyoruz.

// Kullanım formatıwhen(parametre) {
value1 -> {}
value2 -> {}
value3 -> {}
else -> {}
}

Örnekte Lambda sembolünden ( -> ) sonra tek satırlık bir ifade yazıldığından dolayı {} kullanılmamıştır. İhtiyaç halinde {} ile birden fazla satırdan oluşan kod bloğu da eklenebilir.

Yukarıda ilk önce if içerisinde operatörleri kullanarak, ardından operatörler yerine, oluşturduğumuz range ifadeleri ile üzerinden geçtiğimiz not ortalamasına göre harf notu elde ettiğimiz kod bloğunu bu kez de when yapısı ile nasıl yapabiliriz ona göz atalım.

For Döngüsü

Kotlin referans sayfasından da for döngülerine göz atmayı ihmal etmeyin derim. Esasında For döngüleri, tekrar edilebilen herhangi bir şey üzerinde kullanılabilecek olan oldukça basit bir yapıdır.

Bu yapıyı farklı şekillerde kullanabiliriz.

  • value in list : ilk durumda verilen value değerlerini alabiliriz
  • index in list.indices : verilen index değerlerini alabiliriz.
  • (index,value) in list.withIndex() : index, value değerlerini alabiliriz.

Kod bloğunun çıktısı aşağıdaki gibi olacaktır.

// for.kt output
1 2 3 4 5 6 7 8 9 10
AA BB CC DD FF
0 . öğrenci : AA
1 . öğrenci : BB
2 . öğrenci : CC
3 . öğrenci : DD
4 . öğrenci : FF
0 . öğrenci : AA
1 . öğrenci : BB
2 . öğrenci : CC
3 . öğrenci : DD
4 . öğrenci : FF

Continue ile ilgili şart sağlanırsa döngüye bu değeri atlayarak devam edebilir, return ile döngüden çıkabiliriz.

İç içe for döngülerinde dögüye belli değerlerde müdahale ederek bir üstteki for döngüsüne değil de iki yada daha üst katmanlarda bulunan for döngüsüne dönmek istediğimiz durumlarda labelName@ ifadesini kullanabiliriz. İlgili örnekleri aşağıdaki kod bloğundan inceleyebilirsiniz.

Son olarak for döngüsü içersindeyken belli bir durumla karşılaştığımızda bulunduğumuz değeri atlamak ya da dögüyü sonlandırmak, bazı durumlarda farklı bir noktaya gitmek istediğimiz senaryolarda kullanabileceğimiz bir örneği inceleyelim.

Repeat

Bu kez de aynı işin belli bir sayıda tekrar edilmesini istiyorsak kullanabileceğimiz bir yapı ile karşımızda Kotlin. Kullanımı da çok basit.

While Döngüsü

Kotlin’de de bilinen while döngülerinden hiçbir farkı yoktur. Bir kod bloğunun sadece belli bir koşul altında çalışabilir olmasını istediğimiz durumlarda kullanılır.

Bu yazıyı da burada sonlandırıyorum. Devam eden yazılarda Kotlin fonksiyon yapılarından bahsedeceğim.

--

--