Перейти до вмісту

Освоюємо Kotlin/Основи

Матеріал з Вікіпідручника


Серодовища розробки (IDE)

[ред.]

Для програмування на Kotlin вам необхідне інтегроване середовище розробки (IDE). Офіційним середовищем є IntelliJ IDEA. Його можна звантажити з офіційного сайту jetbraints тут. При виборі версій, вибираєм IntelliJ IDEA Community Edition - воно безкоштовне.

Другий спосіб опробувати прості програми - використати віртуальний емулятор на офіційному сайті (для початку згодиться). Його можна опробувати тут

Можна також скористуватися іншими компіляторами, наприклад, IDE Eclipse з відповідним плагіном.

Змінні

[ред.]

Оголошення змінних

[ред.]

Оголошення змінних відбувається з вказанням ключового слова var або val після чого йде назва змінної. Тип змінної можна не вказувати, тоді компілятор сам спробує визначити її тип за тим, що ви присвоюєте змінній. Змінні з ключовим словом val називають незмінюватими (immutable) або лише для читання (read-only).

var x=5 //оголошення цілочисельної змінної
val y=5 //оголошення val змінної
var num: Int // оголошення цілочисельної змінної з прямим вказанням типу
var isVar= true // створення змінної типу Boolean
var hugeNumber = 6L //створення змінної типу Long
var letter='D' //змінна типу Char
var name="Tom" // змінна типу String
var x=3.14 // змінна типу Double

Можна при оголошенні змінної зразу вказати її тип:

var name:String="Tom" // змінна типу String
var hugeNumber2: Long =6 // змінна типу Long

Але переважно компілятор сам визначає тип змінної, по типу значення, яке присвоюється. Проте існують випадки, коли це необхідно. Наприклад, при вказанні параметрів функції і т.п.

Типи змінних

[ред.]

Цілочисельні типи представлені типами Byte, Short, Int та Long.

Тип Біт Діапазон значень
Byte 8 біт -128 до 127
Short 16 біт –32768 до 32767
Int 32 біт –2147483648 до 2147483647
Long 64 біт -9 223 372 036 854 775 808 () до 9 223 372 036 854 775 807 ( - 1)

Дробові числа представлені типами Float (32 біта) та типом Double (64 біта).

Для представлення символів використовується тип Char.

var letter='D' // символи вводяться в одинарних лапках

Для представлення рядків використовується тип String.

var name ="John"

Зверніть увагу, що для присвоєння символу використовуються одинарні лапки. Подвійні лапки означають, що змінна буде типу String.

Як і в іших мовах для використання спеціальних символів використовується \ (backslash).

var apostrophe= '\'' //використовуємо одинарну лапку/апостроф
var myString="Ви ввели\n символ $apostrophe" // використовуємо символ нового рядка \n
println (myString)
Standard input or output Результат:
Ви ввели
 символ '

Можна ввести рядок символів, який відображатиметься без змін як він введений, використовуючи потрійні лапки на початку тексту і в кінці:

var myString="""
    Ви ввели\n 
       поможіть
    бо я заплутався
"""
println (myString)
Standard input or output Результат:
        Ви ввели\n 
           поможіть
        бо я заплутався


Boolean змінні застосовуються для значень true або false.

var isMan = true

Також існують безнакові змінні (unsigned) цих же типів, що відповідно можуть вміщати вдвічі більші додатні числа у себе (UBite, UShort, UInt, ULong):

var x:UInt=5u;

Коли в змінну необхідно записати велике число, то можна використовувати символ _ між цифрами, для кращого візуального представлення числа:

var x:Int=5_500_000 // ніякої помилки, все правильно

Перетворення типів

[ред.]

Для перетворення одного типу в інший використовуються відповідні функції, наприклад toLong(), що викликаються на відповідному об'єкті (змінній).

var k=65 // створиться змінна типу Int
var l:Long = k.toLong() //до типу Long

Коментарі

[ред.]

У Kotlin є три види коментарів:

    //однорядковий коментар
    //новий коментар

    /*
     багаторядковий
     коментар
     */

    /**
     * KDoc коментар
     * для документування функцій 
     * та класів
     */

Тобто однорядкові коментарі починаються з двох косих рисок //. Багаторядкові вміщуються в символи /* та */. Все, що в цих символах, компілятор не сприймає як код.

Останній вид коментарів застосовується для документування функцій та класів. Так, наприклад, якщо спереді функції є такий коментар, то при наведенні в місці використання на назву функції, компілятор видасть підказку з даним текстом. Всередині може спеціальним чином використовуватися опис параметрів функції:

/**
 * Ця функція обчислює суму двох цілих чисел.
 * @param a Перше ціле число.
 * @param b Друге ціле число.
 * @return Сума a та b.
 */
fun addNumbers(a: Int, b: Int): Int {
    return a + b
}

Детальніші про функції далі, у відповідному підрозділі.

Привіт Світе!

[ред.]

Проста програма складається мінімум із одної функції main, що схоже на С/С++ чи java.

fun main(args: Array<String>){ // вказання аргументів функції необов'язкове
    val message="Привіт, Світе!"
    println (message) // якщо виводимо лише значення змінної
    pintln ("Ми говоримо: $message") //якщо вставляємо змінну в рядок
    println("Ми говоримо знову: "+message) // можна й так 
}
Standard input or output Результат:
Привіт, Світе!
Ми говоримо: Привіт, Світе!
Ми говоримо знову: Привіт, Світе!

Зверніть увагу, що для вставляння змінної в рядок використовується знак $

Читання з консолі

[ред.]

Ви можете прочитати з консолі введений користувачем текст або числа використовуючи функцію readln():

    println ("Введіть своє ім'я:")
    val name=readln() // читаємо ім'я (тип String)
    println ("Скільки вам років:")
    val age=readln().toInt() // читаємо і конвертуємо введений текст (String) у число (Int)
    println("Привіт $name ($age)")
Standard input or output Результат:
Введіть своє ім'я:
Володимир
Скільки вам років:
18
Привіт Володимир (18)

Конкатенація

[ред.]

Оператор + може використовуватись як для додавання так і для конкатенації (з'єднання) тексту, але тут є деякі особливості:

println("Hello"+" Igor") // так працює, виведе два слова
println((2+5)+" hello")// не працює, помилка, бо пробує до Int додати текстовий рядок

Якщо хочемо, щоб нам зробило додаавання і з'єднало з текстовим рядком, то це можна зробити двома способами. Перший переставити місцями текст і математичний вираз:

println("hello "+(2+5)) // виведе: hello 7

Другий спосіб - поставити на початку порожній текстовий рядок:

println(""+(2+5)+" hello")// виведе: 7 hello

Конкатенацію можна використовувати не тільки у функції println():

val text:String=""+(5+4)+" Hello" //так теж можна

Константи на рівні компіляції

[ред.]

Перед ключовим словом val можна використати ключове слово const. В такому разі значення константи буде підставлятися в код під час компіляції:

const val MY_CONST=55
fun main(){
    println (MY_CONST)
}

Такі константи прийнято писати великими буквами та з використанням символів підкреслення. Вони повинні бути оголошені на початку модуля поза межами інших блоків (як то функції чи класи). Винятками є оголошення таких констант в середені спеціальних конструкцій як то object та companion object. Значення, що присвоюється має бути базового типу, як то String, Int і т.п.

null безпечність

[ред.]

В Kotlin на відміну від Java не можна так просто присвоїти значення null (що означає пусто, нічого). Ви повинні передбачити, що змінна може прийняти null використавши оператор ?:

val name: String? = null

Позначивши змінну таким чином, подальші помилки на совісті програміста, що застосовуватиме змінну і в подальшому треба використовувати спеціальні оператори. Так щоб отримати довжину рядка такої змінної ми повинні використати оператор !!:

Warning Небезпечний код
val name: String? = null 
println(name.length) // так не можна, помилка компіляції
println (name!!.length) //так можна, але можливе аварійне завершення при виконанні

Використавши два знаки оклику ми усуваємо помилку при компіляції, але можемо отримати помилку (виняток) при виконанні програми, коли змінна буде рівна null, оскільки програма не зможе отримати довжину неіснуючого рядка. Найкращим виходом з даної ситуації є перевірка змінної на null і якщо null, то присвоїти змінній якесь інше значення. Це можна зробити використавши умову if (див. розділ "Умовні конструкції"), або оператор ?: (так званий елвіс оператор):

val name: String? = null // 'name' є nullable String
val displayName: String = name ?: "Гість" // якщо 'name' рівна null, присвоюємо змінній значення "Гість"
println(displayName) //вивід: Гість

val nameNotNull: String? = "Іван"
val displayNameNotNull: String = nameNotNull ?: "Гість"
println(displayNameNotNull) // Вивід: Іван

Приклад, коли можна отримати null, це наприклад ввід з клавіатури. Якщо ми будемо читати число так val number=readln().toInt(), то користувач може ввести замість числа букви, тоді перетворення до типу Int введеного тексту закінчиться аварійною ситуацією (винятком). Ми можемо використати функцію toIntOrNull(), тоді якщо перетворення до типу Int буде невдале, то функція поверне null. І вже тоді можна здійснити перевірку на null і зробити певні дії:

fun main(){
    println("Введіть ціле число:")
    val number:Int?=readln().toIntOrNull()
    if (number==null) //якщо число рівне null, то вивід "Ви ввели: не число"
        println("Ви ввели: не число")
    else // в іншому випадку виводимо наше число
        println("Ви ввели: $number")
}
Standard input or output Результат:
Введіть ціле число:
фіав
Ви ввели: не число