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
- Henüz açık değilse IntelliJ IDEA'yı açın.
- 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.
- Aşağıdaki ifadeleri REPL'ye girin. Sonucu görmek için her birinden sonra
Control+Enter
(Mac'teCommand+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.
- 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
- 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.
- 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
- 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.
- Listeden
toByte()
simgesini seçin ve değişkeni yazdırın.
val b1 = i.toByte()
println(b1)
⇒ 6
- 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
- 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
- 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.
val
vevar
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.
- 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.
- 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
- İç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 (<
, ==
, >
, !=
, <=
, >=
).
if
/else
ifadesi yazın.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
println("Good ratio!")
} else {
println("Unhealthy ratio")
}
⇒ Good ratio!
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
- 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!
when
İfadewhen
oluşturmayı deneyin. Kotlin'deif
/else if
/else
ifadeleri dizisini yazmanın daha iyi bir yolu vardır. Bu yol, diğer dillerdekiswitch
ifadesine benzeyenwhen
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.
- Bir
Int
değişkeni tanımlayın ve bunanull
değerini atayın.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
- Bir değişkenin boş değerli olabileceğini belirtmek için türden sonra soru işareti operatörünü (
?
) kullanın. BirInt?
değişkeni tanımlayın ve bunanull
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.
fishFoodTreats
değişkenininnull
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()
}
- Şimdi de
?
operatörünü kullanarak Kotlin'de nasıl yazıldığına bakalım.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
- 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.
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]
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.
arrayOf
kullanarak bir dizeler dizisi bildirin. Yazdırmak içinjava.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]
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)
- 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)
+
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
- İç 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.
- 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.
- 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
- 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
- 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
- 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'derepeat
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
verepeat
ile döngüler oluşturabilirsiniz.when
ifadesi,switch
ifadesinin Kotlin sürümüdür ancakwhen
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.
- Açık tür dönüşümü
- Değişkenleri tanımlama
- Dize şablonları
- Boş değerler
- Listeler
- Diziler
if
,when
,for
,while
?:
(Elvis) operatörü!!
operatörü
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:
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.