Kotlin, Part 1 : Giriş ve Standart Programlama Yapıları

Tuğçenur Erdoğan
10 min readJan 6, 2021

Herkese Merhaba,

Yeni yıla Turkcell’de Geleceğe Adını Yazacak Mühendis Adayı olarak girmeye hak kazandım. Bu sebeple Turkcell Teknoloji Kampı Kotlin ile Android Studio eğitimlerim başladı. Bu süreci adım adım sizlerle paylaşmaya karar verdim.

Bildiğiniz üzere Android, Google tarafından geliştirilmiş olup milyonlarca kişi tarafından kullanılan dev bir işletim sistemi. Android Studio ise, yine Google tarafından 16 Mayıs 2013 tarihinde Google etkinliğinde tanıtılan ve o tarihten bu yana Android uygulama geliştirmede kullanılan resmi Entegre Geliştirme Ortamıdır (IDE). Peki benim bu eğitim sürecinde kullanacağım programlama dili olan Kotlin neyin nesi? Kotlin genel amaçlı bir programlama dilidir. Yani, web geliştirme, masaüstü uygulama geliştirme gibi çok çeşitli amaçlarla kullanılabilir. Google, 2017'de Android geliştirme için Kotlin’i resmi bir dil olarak benimsemiştir. Şu anda, buna rağmen Java Android geliştirme için en popüler programlama dilidir. O zaman neden Java değil de Kotlin? Bence cevap, Kotlin daha yeni ve öğrenmesi daha kolay. Tabii ki pek çok sebebi var ama ana sebeplerden biri bu diyebilirim. Ama program sonunda Java yı öğrenmem gerektiğini düşünüyorum.

Bu yazımda Android Stuido kurulumu, Android Studio’da yeni proje açma, yeni Kotlin dosyası oluşturma, “fun main(){}” , println() komutu, val ve var ile değişkenler oluşturma, değişken tipleri, konsol girdisi oluşturma ve if, else ,when ,döngüler(for while) ,break ve continue gibi standart programlama yapılarından bahsedeceğim.

Yavaştan başlayalım!

Kurulum için : https://www.oracle.com/technetwork/java/javase/downloads/jdknetbeans-jsp-3413139-esa.html bağlantısına tıklayabilirsiniz.

Sonrasında yukarıdaki resimde de görüldüğü gibi Lisansı kabul edip indirmek istediğiniz ‘Production’ ların yanındaki kırmızı indirme sembolüne basmalısınız.

Son olarak https://developer.android.com/studio?hl=zh-cn bağlantısına tıklayıp

DOWNLOAD ANDROID STUDIO seçeneğine tıklamanız yeterli olacaktır.

Kurulumlardan sonra Android Studio IDE açabilirsiniz.

Karşınıza çıkan bu sayfada eğer yeni bir proje oluşturmak istiyorsanız Create New Project i seçmelisiniz.

Sonrasında benim seçtiğim gibi Empty Activity i seçip ‘Next’ diyoruz.

Aşağıda gördüğünüz kısım ise oluşturacağımız projenin adını, paket adını, kaydedeceğimiz yeri, dilini ve kullanacağımız Android sürümünü seçebildiğimiz ekran. Kotlin ile çalışacağımız için Kotlin’i, bilgisayarlarımızı çok yormamak için ise API 16 : Android 4.1(Jelly Bean) sürümünü seçiyoruz.

Burada önemli bir detay var : paket isminin ileride oluşturduğumuz mobil uygulamaları Google Play e yüklemek istediğimizde unique olması gerekiyor. Şuan bunun pek önemi olmasa da ileride değiştirmemiz gerekecektir.

Sonunda aşağıdaki şekilde de görüldüğü gibi IDE ekranına ulaştık.

Ama programı bir Kotlin dosyasında yazacağımız için bir Kotlin dosyası açmalıyız. Oluşturduğumuz project dosyasına sağ tıklayıp NewKotlin File/Class sırasıyla ilerliyoruz.

Karşımıza çıkan bu ekranda ise oluşturduğumuz yeni Kotlin dosyasına bir isim veriyoruz. Burada File seçmeyi unutmuyoruz.

Ve ilk Kotlin dosyamız bizlerle….

package com.example.homework_1

Paket ismi yukarıdaki kod satırında da gördüğünüz gibi hazır gelmekte.

Şimdi programlarımızı yazmaya başlamadan önce tüm kodlama dillerinde olduğu gibi bir main fonksiyonu oluşturmalıyız.

package com.example.homework_1
fun main(){

}

Kotlin’de main fonksiyonu oluşturmamız için yazmamız gereken kod satırı yukarıdaki gibi. Kodlarımızı main fonksiyonu içine, iki süslü parantez arasına yazacağız.

Şimdi en klasiğinden bir Merhaba Dünya yazdıralım. Kotlin’de çıktı almak için println() fonksiyonunu kullanıyoruz. Sonundaki ln konsolda aldığımız sıralı çıktıların alt alta ve düzenli gözükmesini sağlıyor.

fun main(){
println("Merhaba Dünya!")
}

Aşağıdaki şekilde gördüğünüz gibi, yazdığımız kısmın başında çıkan yeşil ok kodu hatasız yazdığımızı gösterir.

O yeşil ok üzerinde sağ tıklayıp Run’DosyaAdıKt’ with Coverage seçeneği ile programı compile ediyoruz. İlk satırdaki Run’DosyaAdıKt’ ile compile etmeme sebebimiz garip bir şekilde hata vermesi. Bu galiba Android’in genel bir problemiymiş. O yüzden tüm compile işlerini aşağıdaki görselde de görülen şekilde yapmalısınız.

Ve sonuç :

Şimdi de değişkenlerden bahsedelim. Programlama dillerinde hafızada saklanan değerler, değişkenler ile ifade edilmektedir. Değişkenler hafızada geçici olarak saklanan değerleri temsil ederler. Kotlin’ de değişkenleri nasıl oluşturuyoruz bakalım:

var studentName ="Tugce"

ya da

val studentName ="Tugce"

gördüğünüz gibi val ya da var parametreleri ile değişken oluşturabiliriz.

Yukarıdaki kod satırında da görüldüğü gibi var/val degiskenAdı = “String”

ya da

var/val degiskenAdi = Integer, Double şeklinde değişkenleri tanımlayabiliriz.

Aslında var ve val bir değişkeni tanımlamak için kullanılır. Fakat var değeri değiştirilebilen bir değişken olarak tanımlanır ve o değişkene yeni değerler atanabilir. Ama val sabit bir değişken ve bir kez değer ataması yapıldıktan sonra o değişkene yeni değer ataması yapılamaz. Aslında yukarıdaki kod satırında “Tugce” string i değişmeyeceğinden val ile tanımlanması daha iyidir ki Kotlin’ de bu konuda sizi şu şekilde uyarır :

Peki bu değişkenlerin tipleri Kotlin dilinde neler olabilir? Programlama geçmişiniz varsa ne demek istediğimi anlamış olmalısınız. Integer, double, float, string, char gibi şeylerden bahsediyorum.

Örneğin ;

val ogrNo : Int = 591
val ogrAdi : String = "Tugce"
val cinsiyet : Char = 'K'
val puan : Double = 90.5
val oran : Float = 10.3f

Yukarıdaki tabloda Kotlin dilinde kullanabileceğiniz veri tipleri ve üstündeki kod satırında ise nasıl kullanıldıklarını gözlemleyebilirsiniz.

Veri Tipi Dönüşümleri

• toDouble() , toFloat() , toLong() , toInt() , toShort() , toByte() ,toChar() , toString() komutlarını kullanarak veri tiplerini birbirine dönüştürebiliriz.

fun main() {

//Sayısaldan sayısala dönüştürme

var i: Int = 42
var d: Double = 42.45
var f: Float = 42.89f

var sonuc1: Int = d.toInt()
var sonuc2: Double = i.toDouble()
var sonuc3: Int = f.toInt()

println(sonuc1)
println(sonuc2)
println(sonuc3)

//Sayısaldan stringe dönüştürme

var str1 = i.toString()
var str2 = d.toString()
var str3 = f.toString()

println(str1)
println(str2)
println(str3)

//Stringden sayısala dönüştürme

var yazi = "48"
var sayi = yazi.toIntOrNull()

if(sayi != null){
println("Sayı : $sayi")
} else {
println("Hatalı Dönüşüm")
}
}

Yukarıda gördüğünüz kod parçasında aslında gayet açık bir şekilde dönüşüm komutlarını nasıl kullandığımı inceleyebilirsiniz. //Stringden sayısala dönüştürme kısmında yaptığım şeyi açıklamam gerekirse yazi değişkenine atanan “48” string i aslında bir integerdir. Örneğin bu “48t” olsaydı bu kısmın döngüsü Hatalı dönüşüm olurdu. Çünkü 48t maalesef bir sayıya dönüşemez. String den sayıya dönüşüm kısmında bu duruma dikkat edilmelidir.

Kodu compile ettiğimizde konsolda göreceklerimiz aşağıdaki gibi olur :

Konsol Girdisi Alma

Konsoldan girdi alarak fonksiyonları gerçekleştirmek de mümkündür.

import java.util.*

fun main(){

val girdi = Scanner(System.`in`)

Eğer konsol girdisi alarak ilerlemek istiyorsak yukarıdaki kod parçası projelerimizde muhakkak olmalıdır. Bu haliyle program konsoldan girdi almaya hazırdır. Örneğin adımızı yaşımızı ve boyumuzu soran ve sonrasında bizden konsol aracılığı ile aldığı verileri çıktı olarak veren bir kod yazmak istersek :

import java.util.*

fun main(){

val girdi = Scanner(System.`in`)

println("Adınızı giriniz")
val ad =girdi.next()

println("Yaşınızı giriniz")
val yas = girdi.nextInt()

println("Boyunuzu Giriniz")
val boy =girdi.nextDouble()

println("Adiniz : $ad")
println("Yasiniz : $yas")
println("Boyunuz : $boy")
}

Bu şekilde yazmalıyız.

val ad =girdi.next() →String veri almak için kullanılır.

val yas = girdi.nextInt() →Integer veri almak için kullanılır.

val boy =girdi.nextDouble() →Double veri almak için kullanılır.

Bu kodu compile edersek konsolda neler görürüz ?

İlk olarak ad verisini giriyorum.

Yaşımı soruyor.

Yaşımı girdikten sonra boyumu soruyor. nextDouble() dediğimden ondalıklı sayı olarak bir girdi yazabilirim.

Böylece konsola girdiğim verileri yine konsoldan yukarıda görüldüğü gibi alabiliyorum.

Değişken ve veri tiplerini öğrendik artık standart programlama yapılarına giriş yapabiliriz. İlk olarak If — Else fonksiyonlarını öğrenelim. Aslında yine eğer aşinaysanız diğer programlama dillerinin çoğunda if, else, if else, else if, elif gibi pek çok operatörün olduğundan haberdarsınızdır. Bu operatörleri ortaya bir veya birden çok şart koyduğumuz durumlarda kullandığımızı bilmeniz yeterli olacaktır. Örnek bir kod parçasıyla açıklayacak olursak :

import java.util.*
fun main() {

val girdi = Scanner(System.`in`)
println("Dikdörtgen Alanı için 1'e,")
println("Daire Alanı için 2'ye basınız.")
val secim = girdi.nextInt()
println("Seciminiz : $secim")

if (secim == 1){
println("Kısa kenar giriniz")
val kisaKenar = girdi.nextInt()

println("Uzun kenar giriniz")
val uzunKenar = girdi.nextInt()

println("Dikdörtgen Alani")
println("Sonuc : ${kisaKenar * uzunKenar}")
}
if (secim == 2) {
println("Yarıçap giriniz")
val yariCap = girdi.nextInt()

println("Daire Alani")
println("Sonuc : ${3.14 * yariCap * yariCap}")

}
}

Seçime göre dikdörtgen alanı ya da daire alanı hesaplayan bir program yazdım. Eğer 1’e basarsam dikdörtgen 2 ‘ ye basarsam daire alanı hesaplasın istiyorum. Bunun için ayrı ayrı dosyalar da açıp bir dosyada dikdörtgen diğerinde daire alanı hesaplatabilirdim. Ama ben böyle yapmak istemiyorum. Bu zaman kaybına ve hafızayı boş yere meşgul etme gibi durumlara neden olabilirdi. Burada imdadımıza if yapısı yetişiyor. Hangi işlemi seçtiğimizi konsol soruyor, cevaplıyoruz. Seçime göre dikdörtgen alanı hesabı için gereken parametreleri ya da daire alanı için gereken parametreleri isteyen ve girilen verilere göre sonucu döndüren bir algoritma söz konusu.

Olayı adım adım gösterecek olursak :

Eğer 2'ye bassaydık :

Son olarak da bir durumun gerçekleşmesi için aynı anda birkaç koşul sunulduğunda ne yapmamız gerektiğini yine bir örnekle göstermek istiyorum.

println("Kullanıcı adınızı giriniz :")
val kullaniciAdi = girdi.next()

println("Şifrenizi giriniz :")
val sifre = girdi.nextInt()

//&& : and,true and true :true
//|| : or, true or false :true
if(kullaniciAdi == "tugcerdogan" && sifre == 12345){
println("Hoşgeldiniz")
}else{
println("Hatalı giriş yaptınız")
}

Yukarıdaki örnekte de olduğu gibi herhangi bir durumun gerçekleşmesi için iki koşulun da sağlanması gerekiyorsa -sosyal medya hesap girişlerinde uygulanan algoritma da budur- iki koşul arasına && eklenir. Bu aslında dijital sistemlerden bildiğimiz AND operatörlerine benzetilebilir. Yani iki koşul da sağlanırsa ancak o zaman koşul sağlanmış kabul edilir, if operatörünün süslü parantezi arasındaki işlemleri yürütebiliriz.

Eğer koşullardan birinin sağlanması yeterliyse iki koşul arasına || eklenmesi gereklidir.

Bu programın çıktısına bakacak olursak :

Şimdi diğer bir şart operatörü olan when kullanımını inceleyelim.

Örneğin ; konsoldan girilen türk lirası miktarının dolar veya euro karşılığını yine konsoldan girilen seçime göre veren bir program yazmak istersek :


//Girilen türk lirasını when kullanarak dolar, euro'a çevirme işlemi

import java.util.*
fun main(){
val girdi = Scanner(System.`in`)

println("Çevirmek istediğini Türk lirası miktarını giriniz :")
val turk = girdi.nextDouble()

println("Dolar karşılığı için 1'e,")
println("Euro karşılığı için 2'ye basınız :")

val secim = girdi.nextInt()

when(secim){
1->println("$turk TL ${0.14*turk} ABD Dolarıdır.")
2->println("$turk TL ${0.11*turk} Euro'dur. ")
else->println("1 ya da 2 arasından bir seçim yapınız!")
}

}

when kullanım şeklini ayrıntılandıracak olursak ;

when(değişken){

değişkenin 1 olma durumunda olacaklar ->……

değişkenin 2 olma durumunda olacaklar ->……

.

.

else -> …………………………………………….//değişkenin yukarıdaki durumlar dışında herhangi bir değer alması durumunda olacaklar

Aynı algoritmayı if ile kurmak istersek :

if(secim==1){
println("$turk TL ${0.14*turk} ABD Dolarıdır.")
}
else if(secim==2){
println("$turk TL ${0.11*turk} Euro'dur ")
}else{
println("1 ya da 2 arasından bir seçim yapınız!")
}

if ve when kullanımın kıarşılaştırdığımızda , when in kullanımının daha pratik olduğunu görebiliyoruz.

Kotlin’de Döngüler

Döngüler belirli kodları tekrarlı çalıştırma amacı ile kullanılan yapılardır. Kotlin’ de döngüleri çoğu dilde olduğu gibi for ve while yapıları ile sağlayacağız. Hangisini kullanacağımıza nasıl karar vereceğiz derseniz for döngüyü kaç kere döndüreceğimizi baştan bildiğimiz durumlarda , while ise elimizdeki koşula göre döngü sayısının belirleneceği yani baştan döngünün kaç kere döneceğini bilmediğimiz durumlarda kullandığımız yapılardır. Mesela dinamik bir veri tabanından günlük veri çekimi yapmak istersek while kullanmak mantıklıdır, çünkü dinamik yapıdaki veri tabanından kaç kere veri çekeceğimizi bilmemiz mümkün değildir. Aslında while, if in koşul gerçekleşmesi durumunda case i tekrarlayan halidir de diyebiliriz.

for kullanımı

//1 – 100 arasındaki tek sayıları yazdıracak döngü oluşturun.

fun main(){
println("1 ve 100 arasındaki tek sayılar :")

for(i in 1..100){
if(i%2==1){
print("$i,")
}
}
print("\n")
}

Bu kod 1 ve 100 arasındaki tek sayıları yazdıracak döngü oluşturduğum bir kod, for satırına odaklanacak olursak :

for(i in 1..100){
case
}

for (i in aralık başlangıç değeri..bitiş değeri)

for(i in aralık başlangıç değeri..bitiş değeri step x) -x: i nin kaçar kaçar artmasını istiyorsak o değeri girdiğimiz değişkendir, herhangi bir pozitif sayı olabilir-

şeklinde kullanılabilir. Yani kısaca : 1..6 =1,2,3,4,5,6

Programı çalıştırırsak aşağıdaki sonucu görürüz:

for(i in aralık başlangıç değeri until bitiş değeri) kullanım şeklinde aradaki until bitişin bitiş değeri - 1 olmasını sağlar.

Son olarak for(i in aralık bitiş değeri downTo başlangıç değeri) ise tersten saymayı sağlar.

while kullanımı

while(koşul){

koşul sağlandığı sürece tekrarlanacak case

}

şeklindedir.

Örneğin; sayacın 9'dan küçük olduğu durumları yazdırmak istediğimde kullanacağım yapı aşağıdaki gibi olacaktır. Daha ayrıntılı anlatacak olursam sayac ilk durumda sıfırdır. While koşulunu sağladığından(0<9) case içine girer, konsolda Döngü : 0 çıktısını verir ve sayacı 1 artırır, sonra tekrar sayacın koşulu sağlayıp sağlamadığını kontrol eder, 1<9 olduğundan sağlar. Bu dönme sayac = 9 olup döngüden çıkma sağlanana kadar gerçekleşir.

var sayac = 0

while(sayac < 9 ) {
println("Döngü : $sayac")
sayac +=1
}

Compile işlemi sonunda konsolda :

Döngü : 0
Döngü : 1
Döngü : 2
Döngü : 3
Döngü : 4
Döngü : 5
Döngü : 6
Döngü : 7
Döngü : 8

çıktısını görmek mümkündür.

break ve continue dan bahsetmem de gerekir diye düşünüyorum. Bunlar while ve for ile birlikte kullanılırlar. break işlemi bitiren, continue ise pas geçen komuttur.

Örneğin :

var sayac =0
while(sayac < 5){
if(sayac == 3){
break
}
println("Döngü : $sayac")
sayac+=1
}

Yukarıdaki kod parçası sayac 3'e eşit olduğunda break sayesinde döngüden çıkmayı sağlar.

for(i in 1..5) {
if (i == 3) {
continue
}
println("Döngü : $i")

}

Buradaki olay ise continue sayesinde i değişkeninin 3 olduğu durumun pas geçilmesinin, 4'ten devam edilmesinin sağlanmasıdır.

Evet geldik yazının sonuna ama devamının geleceğinin garantisini veriyorum sizlere. Kendimce sizlere bildiklerimi aktarmaya çalıştım ve çalışmaya devam edeceğim. Ve yazımı buraya kadar okuduysanız eğer gerçekten teşekkür ederim, yazdığım bu yazıyı buraya kadar okuyan birine küçücük bile bir dokunuşum olmazsa çok üzülürüm. Bir sonraki yazımda Kotlin ile Nesne Tabanlı Programlama kısmından bahsedeceğim. En yakın zamanda görüşmek üzere.

İyi çalışmalar…

--

--