カテゴリー
Kotlin言語

ゼロから始めるAndroidアプリ(Kotlin編)Unit1 – 4 第1回:Kotlinで処理を書く

Android Developers > スタートガイド > Kotlin と Android をゼロから学ぶ > Unit1 – Kotlin を用いた Android の基本Unit1-4 第1回 の内容をまとめたものです(翻訳ではありません)


Unit1 – 4 の内容

  • Androidアプリとしてサイコロプログラムを作成する
    • Kotlinのみでクラスを使ったプログラムを作成する
    • Androidアプリにボタンを追加する
    • ボタンを押したときの処理を記述する
  • Kotlinコード作成はブラウザベースのKotlin実行環境を使うと便利(もちろんAndroid Studioで行うことも可能)

Unit1 – 4 の 第1回

第1回の内容は以下の通りです

  • まず Kotlin のみで乱数を生成するプログラムを作る
  • 変数とメソッドを持つクラスを作る
  • 作ったクラスからオブジェクトインスタンス(object instance)を生成して、変数(プロパティ)を書き換えたり、メソッドを使ったりしてみる

Step1 のKotlinコード

IntRange 型をつかいます

fun main() {
    val diceRange = 1..6
    val randomNumber = diceRange.random()
    println("Random number: ${randomNumber}")
}
  • val による変数宣言のしかた(Kotlinによる型推論)
  • 1..6 は IntRange型
  • IntRange では random() メソッドが使える

Step2 のKotlinコード

はじめての class ですね

fun main() {
    val myFirstDice = Dice()
    println(myFirstDice.sides)
    myFirstDice.roll()
}

class Dice {
    var sides = 6

    fun roll() {
        val randomNumber = (1..6).random()
        println(randomNumber)
    }
}
  • クラスは class クラス名 { 内容 }class キーワードを使って宣言すればよい
  • クラス名はPascalCaseで、変数名や関数名はcamelCaseで書く。関数名は動作をあらわす動詞からはじめるとよい
  • クラス内にまとめる変数をプロパティと言う
    • 書き方は普通の変数宣言と同じ val 変数名 = 値
  • クラス内の関数がメソッド。fun キーワードを使った書き方も通常の関数と同じ
    • 引数がなくても関数名のあとには()をつける
    • クラスの中に関連する機能をまとめることをカプセル化(encapsulation)という
    • クラスには「属性と動作」が「変数と関数」という形でまとめられている
  • インスタンスの生成は val 変数名 = クラス名()
    • クラスから生成されたインスタンスはオブジェクトです
    • インスタンスを生成するときはクラス名の後ろに()を忘れずにつける
  • プロパティにアクセスするには「インスタンス名.プロパティ名」、メソッドにアクセスするには「インスタンス名.メソッド名()」とする
    • この表し方を dot notation(ドット表記)という
  • IntRange型の変数をつくらなくても、いきなり (1..6).random() で乱数を返すことも可能

Step3 のKotlinコード

関数で return しますね

fun main() {
    val myFirstDice = Dice()
    val diceRoll = myFirstDice.roll()
    println("Your ${myFirstDice.sides} sided dice rolled ${diceRoll}!")
}


class Dice {
    var sides = 6

    fun roll(): Int {
        val randomNumber = (1..6).random()
        return randomNumber
    }
}
  • return を使ってメソッドが値を返すようにできる
  • 関数名のあとに戻り値の型を指定できる
  • “文字列” の中で ${変数} とすることで文字列の中に変数の内容を埋め込むことが可能(文字列テンプレート)
  • 文字列テンプレートには ${インスタンス変数.プロパティ} としてプロパティの値を埋め込むことも可能

Step4 のKotlinコード

クラスのプロパティ(変数)にアクセス!

fun main() {
   
    val myFirstDice = Dice()
    val diceRoll = myFirstDice.roll()
    println("Your ${myFirstDice.sides} sided dice rolled ${diceRoll}!")

    myFirstDice.sides = 20
    println("Your ${myFirstDice.sides} sided dice rolled ${myFirstDice.roll()}!")
}

class Dice {
    var sides = 6

    fun roll(): Int {
        val randomNumber = (1..sides).random()
        return randomNumber
    }
}
  • プロパティの値を変更するとメソッドの戻り値が変化する
  • 文字列テンプレートには ${インスタンス変数.メソッド()} としてメソッドの戻り値を埋め込むことも可能

Step5 のKotlinコード

クラスをちょっと改造してみますね

fun main() {
    val myFirstDice = Dice(6)
    val diceRoll = myFirstDice.roll()
    println("Your ${myFirstDice.numSides} sided dice rolled ${diceRoll}!")
   
    val mySecondDice = Dice(20)
    println("Your ${mySecondDice.numSides} sided dice rolled ${mySecondDice.roll()}!")
}

class Dice (val numSides: Int) {

    fun roll(): Int {
        val randomNumber = (1..numSides).random()
        return randomNumber
    }
}
  • クラスには関数の引数のように変数に値を渡す書き方ができる
  • 引数のように書かれた変数は、クラスのプロパティと同じように扱える

Step6 のKotlinコード

return のところがすっきり

fun main() {
    val myFirstDice = Dice(6)
    println("Your ${myFirstDice.numSides} sided dice rolled ${myFirstDice.roll()}!")
   
    val mySecondDice = Dice(20)
    println("Your ${mySecondDice.numSides} sided dice rolled ${mySecondDice.roll()}!")
}

class Dice (val numSides: Int) {

    fun roll(): Int {
        return (1..numSides).random()
    }
}
  • return のところで乱数を作ってそのまま返してもよい

Step7 ここまでのKotlinコードまとめ

できました!今回はこれで完成ですね

fun main() {
    val myFirstDice = Dice(6)
    val diceRoll = myFirstDice.roll()
    println("Your ${myFirstDice.numSides} sided dice rolled ${diceRoll}!")
    
    val mySecondDice = Dice(20)
    println("Your ${mySecondDice.numSides} sided dice rolled ${mySecondDice.roll()}!")
}

class Dice (val numSides: Int) {

    fun roll(): Int {
        return (1..numSides).random()
    }
}