Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

3. diel - Typový systém druhýkrát: Dátové typy v Kotlin

V predchádzajúcom cvičení, Riešené úlohy k 1.-2. lekciu Kotlinu, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii Kotlin kurzu, Riešené úlohy k 1.-2. lekciu Kotlinu , sme si ukázali základné dátové typy. Boli to Int, String a Double. Teraz sa na dátové typy pozrieme viac zblízka a vysvetlíme si, kedy aký použiť. Dnešná lekcia bude veľa teoretická, ale o to viac bude praktická tá budúci. Na konci si vytvoríme pár jednoduchých ukážok.

Kotlín nám poskytuje veľa dátových typov pre ukladanie rôznych dát. Java a ďalšie jazyky rozlišovali kvôli optimalizácii výkonu či je typ tzv. Primitívne alebo zložitý a podľa toho s ním potom pracovali. Tento mechanizmus síce ušetril nejaký výkon, ale bol neintuitívne. Kotlín žiadne také rozlíšenie nerobí a aj jednotlivé čísla sa vnútorne ukladajú úplne rovnako ako komplexné objekty.

Celočíselné dátové typy

Pozrime sa teraz na tabuľku všetkých vstavaných celočíselných dátových typov v Kotlin. Všimnite si typu Int, ktorý už poznáme z minulosti.

dátový typ rozsah veľkosť
byte -128 až 127 8 bitov
short -32768 až 32767 16 bitov
Int -2147483648 až 2147483647 32 bitov
long -2 63 to 2 63 - 1 64 bitov
Rozsahy týchto typov si samozrejme nemusíte pamätať, pre celé čísla môžete jednoducho používať vždy typ Int.

Asi vás napadá otázka, prečo máme toľko možných typov pre uloženie čísla. Odpoveď je prostá, záleží na jeho veľkosti. Čím väčšie číslo, tým viac spotrebuje pamäte. Pre vek užívateľov teda zvolíme Byte, pretože sa určite nedožije viac, než 127 rokov. Predstavte si databázu milióna užívateľov nejakého systému, keď zvolíme miesto Byte typ Int, bude zaberať 4x viac miesta. Naopak keď budeme mať funkciu na výpočet faktoriálu, ťažko nám bude stačiť rozsah typu Int a použijeme Long.

Nad výberom dátového typu nemusíte moc premýšľať a väčšinou sa používa jednoducho Int. Typ riešte len v prípade, keď sú premenné v nejakom poli (všeobecne kolekciu) a je ich teda viac, potom sa oplatí zaoberať sa pamäťovými nárokmi. Tabuľky sem dávam skôr pre úplnosť.

Desatinné čísla

U desatinných čísel je situácia trochu jednoduchšie, máme na výber iba dva dátové typy. Samozrejme sa líšia opäť v rozsahu hodnoty, ďalej však ešte v presnosti (vlastne počtu des. Miest). Double má už podľa názvu dvojnásobnú presnosť oproti Float.

dátový typ rozsah presnosť
float + -1.4 * 10 ^ -45 až + -3.4 * 10 38 7 čísel
double + -5.0 * 10 ^ -324 až + -1.7 * 10 308 15-16 čísel
Vzhľadom k tomu, že desatinné čísla sú v počítači uložené v dvojkovej sústave, dochádza k určitej strate presnosti. Odchýlka je síce takmer zanedbateľná, však keď budete programovať napr. Finančný systém, nepoužívajte tieto dát. typy pre uchovanie peňazí, mohlo by dôjsť k malým odchýlkam.

Typ Double je pre desatinné čísla predvolené, Float je tak nutné bližšie špecifikovať. Keď do Float chceme dosadiť priamo v zdrojovom kóde, musíme použiť sufix F.

val f: Float = 3.14f
val d = 2.72

Ako desatinný separátor používame v zdrojovom kóde vždy bodku, nehľadiac na to, aké máme v operačnom systéme regionálnej nastavenia.

Ďalšie vstavané dátové typy

Pozrime sa na ďalšie dátové typy, ktoré nám Kotlin ponúka:

dátový typ rozsah Veľkosť / Presnosť
char U + 0000 až U + ffff 16 bitov
Boolean true alebo false 8 bitov
Char

Char nám reprezentuje jeden znak, na rozdiel od typu String, ktorý reprezentoval celý reťazec hodnôt Char. Znaky v Kotlin píšeme do úvodzoviek:

val c: Char = 'A'

Char patrí v podstate do celočíselných premenných (obsahuje číselný kód znaku), ale prišlo mi logickejšie uviesť ho tu.

Boolean

Dátový typ Boolean nadobúda dvoch hodnôt:

  • true (pravda)
  • false (nepravda).

Budeme ho používať najmä vtedy, až sa dostaneme k podmienkam. Do premennej typu Boolean možno uložiť ako priamo hodnotu true / false, tak i logický výraz. Skúsme si jednoduchý príklad:

Klikni pre editáciu
  • val b = false
    val vyraz = 15 > 5
    println(b)
    println(vyraz)
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu:

    false
    true

    Výrazy môžeme písať do zátvoriek. To sa hodí v prípade, že ich máme napr. Niekoľko. Vidíme, že výraz nadobúda hodnoty true (pravda), pretože 15 je naozaj väčší ako 5. Od výrazov je to len krok k podmienkam, na ne sa pozrieme nabudúce.

    String

    Dátový typ, s ktorým sa stretnete na každom kroku. Reprezentuje reťazec znakov, či proste akýkoľvek text. My si ukážeme hlavne dôležité metódy, ktoré je dobré poznať alebo aspoň vedieť, že existujú.

    contains(), endsWith() a startsWith()

    Môžeme sa jednoducho opýtať, či reťazec začína, končí alebo či obsahuje určitý podreťazec (substring). Podreťazcom myslíme časť pôvodného reťazca. Všetky tieto metódy budú ako parameter brať samozrejme podreťazec a vracať hodnoty typu Boolean (true / false). Zatiaľ na výstup nevieme reagovať, ale poďme si ho aspoň vypísať:

    Klikni pre editáciu
    • val s = "Krokonosohroch"
      println(s.startsWith("krok"))
      println(s.endsWith("hroch"))
      println(s.contains("nos"))
      println(s.contains("roh"))
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Výstup programu:

      false
      true
      true
      false

      Vidíme, že všetko funguje podľa očakávania. Prvý výraz samozrejme neprešiel vďaka tomu, že reťazec v skutočnosti začína veľkým písmenom.

      toUpperCase() a toLowerCase()

      Rozlišovanie veľkých a malých písmen môže byť niekedy na obtiaž. Veľakrát sa budeme potrebovať opýtať na prítomnosť podreťazca tak, aby nezáležalo na veľkosti písmen. Situáciu môžeme vyriešiť pomocou metód toUpperCase() a toLowerCase(), ktoré vracia reťazec vo veľkých a v malých písmenách. Uveďme si reálnejšie príklad ako je Krokonosohroch. Budeme mať v premennej riadok konfiguračného súboru, ktorý písal užívateľ. Keďže sa na vstupy od užívateľov nemožno spoľahnúť, musíme sa snažiť eliminovať možné chyby, tu napr. S veľkými písmenami.

      Klikni pre editáciu
      • var konfig = "Fullscreen shaDows autosave"
        konfig = konfig.toLowerCase()
        println("Pobeží hra vo fullscreen?")
        println(konfig.contains("fullscreen"))
        println("Budú zapnuté tiene?")
        println(konfig.contains("shadows"))
        println("Želá si hráč vypnúť zvuk?")
        println(konfig.contains("nosound"))
        println("Želá si hráč hru automaticky ukladať?")
        println(konfig.contains("autosave"))
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Výstup programu:

        Pobeží hra vo fullscreen?
        true
        Budú zapnuté tiene?
        true
        Želá si hráč vypnúť zvuk?
        false
        Želá si hráč hru automaticky ukladať?
        true

        Vidíme, že sme schopní zistiť prítomnosť jednotlivých slov v reťazci tak, že si najprv reťazec prevedieme celý na malé písmená (alebo na veľké) a potom kontrolujeme prítomnosť slová len malými (alebo veľkými) písmenami. Takto by mimochodom mohlo naozaj vyzerať jednoduché spracovanie nejakého konfiguračného skriptu.

        replace()

        Asi najdôležitejšie metódou na String je nahradenie určitej jeho časti iným textom. Ako parametre zadáme dva podreťazca, jeden čo chceme nahrádzať a druhý ten, ktorým to chceme nahradiť. Metóda vráti nový String, v ktorom prebehlo nahradenie. Keď daný podreťazec metóda nenájde, vráti pôvodnú reťazec. Skúsme si to:

        var s = "Java je nejlepší!"
        s = s.replace("Java", "Kotlin")
        println(s)

        Výstup programu:

        Kotlin je nejlepší!

        trim()

        Ďalšou nástrahou môžu byť medzery a všeobecne všetky tzv. Biele znaky, ktoré nie sú vidieť, ale môžu nám v aplikácii spôsobovať problémy. Vo všeobecnosti môže byť dobré trimovať všetky vstupy od užívateľa. Skúste si v nasledujúcej aplikácii pred číslo a za číslo zadať niekoľko medzier, trim() je odstráni. Odstraňujú sa vždy biele znaky okolo reťazca, nie vo vnútri:

        Klikni pre editáciu
        • println("Zadaj číslo:")
          val s = readLine()!!
          println("Zadal si text: $s")
          println("Text po funkciu trim: " + s.trim())
          val a = s.trim().toInt()
          println("Previedol som zadaný text na číslo parsováním, zadal si: $a")
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Skúste program spustiť a zadať pred číslo niekoľko medzier:

          Zadaj číslo:        10
          Zadal si text:        10
          Text po funkciu trim: 10
          Previedol som zadaný text na číslo parsováním, zadal si: 10

          Reťazcové šablóny

          Reťazcové šablóny, niekedy označované ako tzv. Interpolácie reťazcov, sme si už spomínali. Ak chceme do reťazca v Kotlin na určité miesta vložiť nejaké premenné, zapíšeme ich priamo do reťazca pomocou značiek $.

          Klikni pre editáciu
          • val a = 10
            val b = 20
            val c = a + b
            println("Keď sčítame $a a $b, dostaneme $c")
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Výstup programu:

            Keď sčítame 10 a 20, dostaneme 30

            Komplikovanejšie výrazy vkladáme ešte do zložených zátvoriek za znak dolára ako ${a + b}. Napríklad, ak chceme sčítať dve čísla a ihneď tento výsledok vypísať. Keď sa zamyslíme, ako inak by mal Kotlin poznať, že chceme sčítať dve premenné, keby sme napísali iba $ pred jednu premennú?

            Takáto funkcionalita sa nám často hodí pri výpise. Skúsme si rovno aj sčítať čísla priamo vo výraze:

            Klikni pre editáciu
            • val a = 10
              val b = 20
              println("Keď sčítame $a a $b, dostaneme ${a + b}")
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Toto je veľmi užitočná a prehľadná cesta, ako zostavovať reťazca. Ak chceme vypísať čísla, tak sa ju nevyhneme. Pre zlúčenie premenných obsahujúca reťazce s iným reťazcom môžeme použiť tzv. Konkatenaci (jednoducho + pre ich spojenie do jedného reťazca).

              val jmeno = "Bill"
              val prijmeni = "Gates"
              val celeJmeno = jmeno + " " + prijmeni

              Vlastnosť length

              Posledný, ale najdôležitejšie vlastnosť (pozor, nie metóda) je length, teda počet znakov. Vracia celé číslo, ktoré predstavuje počet znakov v reťazci. Za vlastnosti nepíšeme zátvorky, pretože nemajú parametre.

              Klikni pre editáciu
              • println("Zadajte vaše meno:")
                val jmeno = readLine()!!
                println("Dĺžka vášho mena je: ${jmeno.length}")
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                Je toho ešte veľa k vysvetľovaniu a sú ďalšie dátové typy, ktoré sme neprebrali. Aby sme však stále nepreberala len teóriu, ukážeme si už v nasledujúcej lekcii, Riešené úlohy k 3. lekcii Kotlin , podmienky a neskôr cykly, potom bude naša programátorská výbava dostatočne veľká na to, aby sme tvorili zaujímavé programy :)

                V nasledujúcom cvičení, Riešené úlohy k 3. lekcii Kotlin, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


                 

                Ako sa ti páči článok?
                Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                Predchádzajúci článok
                Riešené úlohy k 1.-2. lekciu Kotlinu
                Všetky články v sekcii
                Základné konštrukcie jazyka Kotlin
                Preskočiť článok
                (neodporúčame)
                Riešené úlohy k 3. lekcii Kotlin
                Článok pre vás napísal Samuel Kodytek
                Avatar
                Užívateľské hodnotenie:
                3 hlasov
                Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
                Aktivity