Kotlin Bootcamp for Programmers 2: Kotlin basics

Bu codelab, Kotlin Bootcamp for Programmers kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla tamamlamanızı öneririz. Bilgi düzeyinize bağlı olarak bazı bölümleri gözden geçirebilirsiniz. Bu kurs, nesne yönelimli bir dil bilen ve Kotlin'i öğrenmek isteyen programcılara yöneliktir.

Giriş

Bu codelab'de Kotlin programlama dilinin temellerini (veri türleri, operatörler, değişkenler, kontrol yapıları ve null değer atanabilir ile null değer atanabilir olmayan değişkenler) öğreneceksiniz. Bu kurs, nesne yönelimli bir dil bilen ve Kotlin'i öğrenmek isteyen programcılara yöneliktir.

Bu kurstaki dersler, tek bir örnek uygulama oluşturmak yerine bilginizi artırmak için tasarlanmıştır ancak birbirlerinden yarı bağımsız oldukları için aşina olduğunuz bölümleri gözden geçirebilirsiniz. Örneklerin çoğu, bunları bir araya getirmek için akvaryum temasını kullanır. Akvaryumun hikayesinin tamamını görmek isterseniz Kotlin Bootcamp for Programmers (Programcılar için Kotlin Temel Eğitim Programı) adlı Udacity kursuna göz atın.

Bilmeniz gerekenler

  • IntelliJ IDEA'da proje oluşturma
  • IntelliJ IDEA'da Kotlin'in REPL'inde (Read-Eval-Print Loop) kodu açma ve yürütme (Tools > Kotlin > Kotlin REPL)

Neler öğreneceksiniz?

  • Kotlin veri türleri, operatörleri ve değişkenleri nasıl kullanılır?
  • Boole değerleri ve koşullarla çalışma
  • Null değer atanabilir ve atanabilir olmayan değişkenler arasındaki fark
  • Kotlin'de diziler, listeler ve döngülerin işleyiş şekli

Yapacaklarınız

  • Kotlin'in temellerini öğrenmek için Kotlin REPL ile çalışma

Bu görevde, Kotlin programlama dilindeki operatörler ve türler hakkında bilgi edineceksiniz.

1. adım: Sayısal operatörleri keşfedin

  1. Henüz açık değilse IntelliJ IDEA'yı açın.
  2. Kotlin REPL'yi açmak için Tools (Araçlar) > Kotlin > Kotlin REPL'yi seçin.

Diğer dillerde olduğu gibi Kotlin'de de toplama, çıkarma, çarpma ve bölme için +, -, * ve / kullanılır. Kotlin ayrıca Int, Long, Double ve Float gibi farklı sayı türlerini de destekler.

  1. Aşağıdaki ifadeleri REPL'ye girin. Sonucu görmek için her birinden sonra Control+Enter (Mac'te Command+Enter) tuşuna basın.
1+1
⇒ res8: kotlin.Int = 2

53-3
⇒ res9: kotlin.Int = 50

50/10
⇒ res10: kotlin.Int = 5

1.0/2.0
⇒ res11: kotlin.Double = 0.5

2.0*3.5
⇒ res12: kotlin.Double = 7.0

İşlemlerin sonuçlarının işlenenlerin türlerini koruduğunu unutmayın. Örneğin, 1/2 = 0, ancak 1.0/2.0 = 0.5 olur.

  1. Tam sayı ve ondalık sayıların farklı kombinasyonlarını içeren ifadeler deneyin.
6*50
⇒ res13: kotlin.Int = 300

6.0*50.0
⇒ res14: kotlin.Double = 300.0

6.0*50
⇒ res15: kotlin.Double = 300.0
  1. Sayılar üzerinde bazı yöntemleri çağırma. Kotlin, sayıları temel tür olarak tutar ancak sayılar üzerinde nesneymiş gibi yöntemler çağırmanıza olanak tanır.
2.times(3)
⇒ res5: kotlin.Int = 6

3.5.plus(4)
⇒ res8: kotlin.Double = 7.5

2.4.div(2)
⇒ res9: kotlin.Double = 1.2

2. adım: Türleri kullanma alıştırması yapın

Kotlin, sayı türleri arasında örtülü olarak dönüştürme yapmaz. Bu nedenle, kısa bir değeri doğrudan uzun bir değişkene veya Byte değerini Int değerine atayamazsınız. Bunun nedeni, örtülü sayı dönüşümünün programlardaki hataların yaygın bir kaynağı olmasıdır. Dönüştürme işlemi yaparak her zaman farklı türlerdeki değerler atayabilirsiniz.

  1. Olası yayınlardan bazılarını görmek için REPL'de Int türünde bir değişken tanımlayın.
val i: Int = 6
  1. Yeni bir değişken oluşturun, ardından yukarıda gösterilen değişken adını ve .to simgesini girin.
val b1 = i.to

IntelliJ IDEA, olası tamamlamaların listesini gösterir. Bu otomatik tamamlama özelliği, her türden değişken ve nesne için çalışır.

  1. Listeden toByte() simgesini seçin ve değişkeni yazdırın.
val b1 = i.toByte()
println(b1)
⇒ 6
  1. Farklı türlerdeki değişkenlere Byte değeri atayın.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1

val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected

val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected

val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
  1. Hata döndüren ödevleri yayınlamayı deneyin.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1

val i5: String = b2.toString()
println(i5)
⇒ 1

val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
  1. Kotlin, uzun sayısal sabitleri daha okunabilir hale getirmek için sayılara alt çizgi eklemenize olanak tanır. Farklı sayısal sabitler girmeyi deneyin.
val oneMillion = 1_000_000
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

3. adım: Değişken türlerinin değerini öğrenin

Kotlin, değiştirilebilir ve değiştirilemez olmak üzere iki tür değişkeni destekler. val ile bir değeri yalnızca bir kez atayabilirsiniz. Bir şeyi tekrar atamayı denerseniz hata alırsınız. var ile bir değer atayabilir, ardından programda değeri değiştirebilirsiniz.

  1. val ve var kullanarak değişkenleri tanımlayın, ardından bunlara yeni değerler atayın.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned

fish, var ile tanımlandığı için önce bir değer atayabilir, ardından yeni bir değer atayabilirsiniz. aquarium değişkenine yeni bir değer atamaya çalışmak, aquarium değişkeni val ile tanımlandığı için hataya neden olur.

Derleyici, bağlamdan anlayabildiğinde değişkende depoladığınız tür çıkarılır. İsterseniz iki nokta üst üste gösterimini kullanarak bir değişkenin türünü her zaman açıkça belirtebilirsiniz.

  1. Bazı değişkenleri tanımlayın ve türü açıkça belirtin.
var fish: Int = 12
var lakes: Double = 2.5

Bir tür, siz veya derleyici tarafından atandıktan sonra türü değiştiremezsiniz. Aksi takdirde hata alırsınız.

4. adım: Dizeler hakkında bilgi edinin

Kotlin'deki dizeler, dizeler için ", tek karakterler için ' kullanılan diğer programlama dillerindeki dizelere benzer şekilde çalışır. Dizeleri + operatörüyle birleştirebilirsiniz. Bunları değerlerle birleştirerek dize şablonları oluşturabilirsiniz. $variable adı, değeri temsil eden metinle değiştirilir. Buna değişken enterpolasyonu denir.

  1. Dize şablonu oluşturun.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
  1. İçinde ifade bulunan bir dize şablonu oluşturun. Diğer dillerde olduğu gibi, değer bir ifadenin sonucu olabilir. İfadeyi tanımlamak için küme parantezlerini {} kullanın.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants

Bu görevde, Kotlin programlama dilinde boolean'lar ve koşulları kontrol etme hakkında bilgi edineceksiniz. Diğer dillerde olduğu gibi Kotlin'de de Boole değerleri ve Boole operatörleri (ör. küçüktür, eşittir, büyüktür) bulunur (<, ==, >, !=, <=, >=).

  1. if/else ifadesi yazın.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. if ifadesinde bir aralık deneyin. Kotlin'de, test ettiğiniz koşul aralıkları da kullanabilir.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. Birden fazla durum içeren bir if yaz. Daha karmaşık koşullar için mantıksal "ve" && ile mantıksal "veya" || operatörlerini kullanın. Diğer dillerde olduğu gibi, else if kullanarak birden fazla durum oluşturabilirsiniz.
if (numberOfFish == 0) {
    println("Empty tank")
} else if (numberOfFish < 40) {
    println("Got fish!")
} else {
    println("That's a lot of fish!")
}
⇒ That's a lot of fish!
  1. whenİfadewhen oluşturmayı deneyin. Kotlin'de if/else if/else ifadeleri dizisini yazmanın daha iyi bir yolu vardır. Bu yol, diğer dillerdeki switch ifadesine benzeyen when ifadesini kullanır. when ifadesindeki koşullarda aralıklar da kullanılabilir.
when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!

Bu görevde, null değer atanabilir ve null değer atanabilir olmayan değişkenler hakkında bilgi edineceksiniz. Boş değerleri içeren programlama hataları, sayısız hatanın kaynağı olmuştur. Kotlin, null yapılamayan değişkenleri kullanarak hataları azaltmayı amaçlar.

1. adım: Nullability hakkında bilgi edinin

Varsayılan olarak değişkenler null olamaz.

  1. Bir Int değişkeni tanımlayın ve buna null değerini atayın.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
  1. Bir değişkenin boş değerli olabileceğini belirtmek için türden sonra soru işareti operatörünü (?) kullanın. Bir Int? değişkeni tanımlayın ve buna null değerini atayın.
var marbles: Int? = null

Liste gibi karmaşık veri türleriniz olduğunda:

  • Listenin öğelerinin boş olmasına izin verebilirsiniz.
  • Listenin boş olmasına izin verebilirsiniz ancak boş değilse öğeleri boş olamaz.
  • Listenin veya öğelerin boş olmasına izin verebilirsiniz.

Listeler ve diğer bazı karmaşık veri türleri sonraki bir görevde ele alınacaktır.

2. adım: ? hakkında bilgi edinin ve ?: operatörleri

? operatörüyle null için test yapabilir, böylece birçok if/else ifadesi yazma zahmetinden kurtulabilirsiniz.

  1. fishFoodTreats değişkeninin null olup olmadığını kontrol etmek için daha uzun bir şekilde kod yazın. Ardından bu değişkeni azaltın.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. Şimdi de ? operatörünü kullanarak Kotlin'de nasıl yazıldığına bakalım.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. Ayrıca, boş testleri ?: operatörüyle de zincirleyebilirsiniz. Şu örneğe bakalım:
fishFoodTreats = fishFoodTreats?.dec() ?: 0

Bu işlev, "fishFoodTreats değeri null değilse değeri azalt ve kullan; aksi takdirde ?: sonrasındaki değeri (0) kullan" ifadesinin kısaltmasıdır. fishFoodTreats değeri null ise değerlendirme durdurulur ve dec() yöntemi çağrılmaz.

Boş işaretçiler hakkında bir nokta

NullPointerExceptions'ı gerçekten seviyorsanız Kotlin bunları korumanıza olanak tanır. Null olmayan onay operatörü !! (çift ünlem), herhangi bir değeri null olmayan bir türe dönüştürür ve değer null ise istisna oluşturur.

val len = s!!.length   // throws NullPointerException if s is null

Bu görevde diziler ve listeler hakkında bilgi edinecek, Kotlin programlama dilinde döngü oluşturmanın farklı yollarını öğreneceksiniz.

1. adım: Liste oluşturun

Listeler, Kotlin'deki temel türlerden biridir ve diğer dillerdeki listelere benzer.

  1. listOf kullanarak bir liste bildirin ve yazdırın. Bu liste değiştirilemez.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
  1. mutableListOf kullanılarak değiştirilebilen bir liste bildirin. Öğe kaldırma
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

remove() yöntemi, iletilen öğeyi başarıyla kaldırdığında true değerini döndürür.

2. adım: Diziler oluşturun

Kotlin, diğer diller gibi dizilere sahiptir. Kotlin'deki listelerin değiştirilebilir ve değiştirilemez sürümleri olsa da Array için değiştirilebilir sürüm yoktur. Dizi oluşturduktan sonra boyutu sabittir. Yeni bir diziye kopyalama dışında öğe ekleyemez veya kaldıramazsınız.

val ve var kullanımıyla ilgili kurallar, dizilerde olduğu gibi listelerde de aynıdır.

  1. arrayOf kullanarak bir dizeler dizisi bildirin. Yazdırmak için java.util.Arrays.toString() dizi yardımcı programını kullanın.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
  1. arrayOf ile tanımlanan bir dizinin öğelerle ilişkili bir türü yoktur. Bu nedenle, türleri karıştırabilirsiniz. Bu da faydalı bir özelliktir. Farklı türler içeren bir dizi tanımlayın.
val mix = arrayOf("fish", 2)
  1. Ayrıca, tüm öğeler için tek bir tür içeren diziler de bildirebilirsiniz. intArrayOf() kullanarak bir tam sayı dizisi tanımlayın. Diğer türlerdeki diziler için karşılık gelen oluşturucular veya örnekleme işlevleri vardır.
val numbers = intArrayOf(1,2,3)
  1. + operatörüyle iki diziyi birleştirin.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
  1. İç içe geçmiş diziler ve listelerin farklı kombinasyonlarını deneyin. Diğer dillerde olduğu gibi, dizileri ve listeleri iç içe yerleştirebilirsiniz. Yani bir dizinin içine dizi yerleştirdiğinizde, iki dizinin içeriğinin düzleştirilmiş bir dizisini değil, dizilerden oluşan bir dizi elde edersiniz. Bir dizinin öğeleri liste, listelerin öğeleri ise dizi olabilir.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]

İlk öğe olan numbers, Array. Diziyi yazdırmak için dizi yardımcı programını kullanmadığınızda Kotlin, dizinin içeriği yerine adresi yazdırır.

  1. Kotlin'in güzel özelliklerinden biri, dizileri 0 olarak başlatmak yerine kodla başlatabilmenizdir. Aşağıdaki örneği deneyin:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]

İlk kullanıma hazırlama kodu, küme parantezleri {} arasındadır. Koddaki it, 0'dan başlayan dizi dizinini ifade eder.

3. adım: Döngüler oluşturun

Artık listeleriniz ve dizileriniz olduğuna göre, öğeler arasında döngü oluşturma işlemi beklediğiniz gibi çalışır.

  1. Dizi oluşturma Dizi içinde yineleme yapmak ve öğeleri yazdırmak için for döngüsü kullanın.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}
⇒ shark salmon minnow
  1. Kotlin'de öğeler ve dizinler arasında aynı anda döngü oluşturabilirsiniz. Aşağıdaki örneği deneyin:
for ((index, element) in school.withIndex()) {
    println("Item at $index is $element\n")
}
⇒ Item at 0 is shark
Item at 1 is salmon
Item at 2 is minnow
  1. Farklı adım boyutları ve aralıkları deneyin. Sayı aralıklarını veya karakter aralıklarını alfabetik olarak belirtebilirsiniz. Diğer dillerde olduğu gibi, 1 adım ileri gitmeniz gerekmez. downTo tuşunu kullanarak geri gidebilirsiniz.
for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..6 step 2) print(i)
⇒ 35

for (i in 'd'..'g') print (i)
⇒ defg
  1. Bazı döngüleri deneyin. Diğer dillerde olduğu gibi Kotlin'de de while döngüleri, do...while döngüleri, ++ ve -- operatörleri bulunur. Kotlin'de repeat döngüleri de vardır.
var bubbles = 0
while (bubbles < 50) {
    bubbles++
}
println("$bubbles bubbles in the water\n")

do {
    bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")

repeat(2) {
     println("A fish is swimming")
}
⇒ 50 bubbles in the water
49 bubbles in the water
A fish is swimmingA fish is swimming

Kotlin, operatörler, listeler ve döngüler gibi temel özellikler açısından diğer dillere çok benzer ancak bazı önemli farklılıklar vardır.

Aşağıdaki özellikler, Kotlin'de diğer dillerde alıştığınızdan farklı olabilir:

  • Kotlin türleri örtülü olarak dönüştürülemez. Bunun için yayınlama kullanın.
  • val ile tanımlanan değişkenlere yalnızca bir kez değer atanabilir.
  • Kotlin değişkenleri varsayılan olarak boş değerli olamaz. Değişkenleri boş değer atanabilir hale getirmek için ? kullanın.
  • Kotlin ile for döngüsünde bir dizinin dizininde ve öğelerinde aynı anda döngü oluşturabilirsiniz.

Aşağıdaki Kotlin programlama yapıları, diğer dillerdeki yapılara benzer:

  • Diziler ve listeler tek bir tür veya karışık türler içerebilir.
  • Diziler ve listeler iç içe yerleştirilebilir.
  • for, while, do/while ve repeat ile döngüler oluşturabilirsiniz.
  • when ifadesi, switch ifadesinin Kotlin sürümüdür ancak when daha esnektir.

Kotlin belgeleri

Bu kurstaki herhangi bir konu hakkında daha fazla bilgi edinmek veya takıldığınız noktaları aşmak için https://kotlinlang.org adresini ziyaret edebilirsiniz.

Kotlin eğitimleri

https://try.kotlinlang.org web sitesinde Kotlin Koans adlı zengin eğitimler, web tabanlı bir yorumlayıcı ve örneklerle birlikte eksiksiz bir referans dokümanı seti yer alır.

Udacity kursu

Bu konuyla ilgili Udacity kursunu görüntülemek için Kotlin Bootcamp for Programmers'a (Programcılar için Kotlin Temel Eğitimi) göz atın.

IntelliJ IDEA

IntelliJ IDEA ile ilgili dokümanları JetBrains web sitesinde bulabilirsiniz.

Bu bölümde, bir eğitmenin yönettiği kurs kapsamında bu codelab'i tamamlayan öğrenciler için olası ödevler listelenmektedir. Eğitmen, aşağıdakileri yapmalıdır:

  • Gerekirse ödev atayın.
  • Öğrencilere ev ödevi ödevlerini nasıl göndereceklerini bildirin.
  • Ödevlere not verin.

Eğitmenler bu önerileri istedikleri kadar kullanabilir ve uygun olduğunu düşündükleri diğer ödevleri verebilirler.

Bu codelab'i kendi başınıza tamamlıyorsanız bilginizi test etmek için bu ödevleri kullanabilirsiniz.

Bu soruları yanıtlayın

1. Soru

Aşağıdakilerden hangisi, değişmez bir dizeler listesi bildirir?

val school = arrayOf("shark", "salmon", "minnow")

var school = arrayOf("shark", "salmon", "minnow")

val school = listOf("shark", "salmon", "minnow")

val school = mutableListOf("shark", "salmon", "minnow")

2. Soru

Aşağıdaki kodun çıktısı ne olur?
for (i in 3..8 step 2) print(i)

▢ 345678

▢ 468

▢ 38

▢ 357

3. Soru

Bu koddaki soru işaretinin amacı nedir?
var rocks: Int? = 3

rocks değişkeninin türü sabit değil.

rocks değişkeni boş olarak ayarlanabilir.

rocks değişkeni boş değerli olarak ayarlanamaz.

rocks değişkeni hemen başlatılmamalıdır.

Sonraki derse geçin: 3. İşlevler

Diğer codelab'lerin bağlantıları da dahil olmak üzere kursa genel bir bakış için "Kotlin Bootcamp for Programmers: Welcome to the course." başlıklı makaleyi inceleyin.