Kotlin で変数を作成して使用する

1. 始める前に

スマートフォンで使用するアプリには、同じ状態を維持する部分と変化する(変更できる)部分があります。

たとえば、設定アプリのカテゴリの名前([ネットワークとインターネット]、[接続済みのデバイス]、[アプリ] など)は変化しません。

設定アプリのスクリーンショットに、デバイス上の設定を変更するためのさまざまなメニュー オプションが表示されています。画面に表示されているメニュー項目は、[ネットワークとインターネット]、[接続済みのデバイス]、[アプリ]、[通知]、[電池]、[ストレージ]、[音とバイブレーション]、[ディスプレイ] です。

一方、ニュースアプリでは、記事(記事の名前、提供元、投稿時刻、画像)が頻繁に変化します。

時間の経過とともにコンテンツが変化するコードを記述するにはどうすればよいでしょうか。新しい記事の投稿は毎日分単位で行われるため、そのたびにアプリのコードを書き換えることはできません。

この Codelab では、変数を使用するコードの記述方法を学びます。これにより、新しい命令セットを記述せずにプログラムの特定の部分を変更できるようになります。前の Codelab と同様に、ここでも Kotlin プレイグラウンドを使用します。

作成するアプリの概要

  • 変数を使用する簡単な Kotlin プログラム。

学習内容

  • 変数を定義してその値を更新する方法。
  • Kotlin の基本的なデータ型から変数に適したデータ型を選択する方法。
  • コードにコメントを追加する方法。

必要なもの

  • インターネットに接続でき、ウェブブラウザがインストールされたパソコン。

2. 変数とデータ型

コンピュータ プログラミングには、変数という概念があります。変数とは、単一のデータを格納するためのコンテナです。これは、値が格納されている箱と考えることができます。箱には、変数名のラベルが付けられています。箱を変数名で参照することで、変数内に格納されている値にアクセスできます。

この図は、変数が箱のようにデータを格納できることを示しています。name と記載された箱があります。箱の外側には value というラベルがあります。値から箱に向かって伸びている矢印は、値が箱に格納されることを示しています。

値を直接使用できるにもかかわらず、値を箱に保存し、箱を変数名で参照するのはなぜでしょうか。それは、コードのすべての命令で値を直接使用した場合、その特定のケースでしかプログラムが動作しなくなるためです。

変数の有用性は、次のように例えるとわかりやすくなります。最近会った人に手紙を送る場合を考えてみましょう。

Lauren 様

本日はオフィスでお会いできて光栄でした。金曜日にお会いできるのを楽しみにしております。

よろしくお願いいたします。

この手紙の内容自体は問題ありませんが、Lauren 氏とやり取りする特定の状況でのみ有効です。そのため、内容が少し異なるだけの手紙を、複数の人宛に何通も書く必要があります。このような場合は、手紙のテンプレートを 1 つ作成して、変更する可能性のある部分を空白にしておくと効率的です。

____ 様

本日は _____ でお会いできて光栄でした。____ にお会いできるのを楽しみにしております。

よろしくお願いいたします。

各空白に入る情報の種類を指定することもできます。これにより、手紙のテンプレートが想定どおりに使用されるようになります。

{ name } 様

本日は { location } でお会いできて光栄でした。{ date } にお会いできるのを楽しみにしております。

よろしくお願いいたします。

概念的には、アプリの作成も同じように考えることができます。一部のデータにはプレースホルダがありますが、アプリのそれ以外の部分は変化しません。

この図は、ニュースアプリのサンプルを示しています。画面のコンテンツはウェルカム メッセージから始まり、名前の部分はユーザーの実際の名前が入るようにプレースホルダとなっています。次に、「Latest news for you」というテキストが表示されています。このテキストは、アプリにどのような記事が読み込まれた場合でも変化しません。次に、新しい記事ごとに行があり、そこに記事の画像、名前、日付、提供元のプレースホルダがあります。記事のリストの下部には、「View more articles」というボタンがあります。

上記のニュースアプリの図では、「Welcome」のテキスト、「Latest news for you」という見出し、「View more articles」ボタンのテキストは常に同じです。一方、ユーザー名や各記事のコンテンツは変化する可能性があるため、変数を使用することで、各情報を適切に格納できます。

この図では、3 つの箱が横に並んで表示されています。最初の箱は name です。その横に「Alex」というラベルがあります。「Alex」から箱に向かって矢印が伸びており、これは値「Alex」が name という箱に格納されていることを意味しています。2 つ目の箱は article1Name です。その横に「New movie coming out(新作映画の公開)」というラベルがあります。この文字列から 2 つ目の箱に矢印が伸びています。これは、値「New movie coming out(新作映画の公開)」が article1Name という箱に格納されていることを意味しています。3 つ目の箱は article1Date です。その横に「June 9」というラベルがあります。「June 9」から 3 つ目の箱に矢印が伸びています。これは、値「June 9」が article1Date という箱に格納されていることを意味します。

Alex というユーザーの場合にのみ、またはタイトルと公開日が同じニュース記事の場合にのみ機能するように、ニュースアプリのコード(命令)を記述する必要はありません。代わりに、namearticle1Namearticle1Date などの変数名を参照してコードを記述することで、アプリの柔軟性を高めることができます。これにより、コードの汎用性が高まり、ユーザー名や記事の詳細が異なる場合など、さまざまなユースケースに対応できるようになります。

変数を使用したアプリの例

次のアプリの例で、変数を使用できる場所を見てみましょう。

この Google マップアプリのスクリーンショットには、Googleplex の場所の詳細が表示されています。Googleplex は社屋で、Google のグローバル本社であると説明されています。この場所は、9,831 件のクチコミによって 4.2 という評価を受けています。住所は、1600 Amphitheatre Pkwy, Mountain View, CA 94043 です。この画面には、この場所をリストに保存するためのオプションがあります。

マップアプリでは、個々の場所(レストランや店舗など)の詳細画面が表示されることがあります。上記の Google マップアプリのスクリーンショットには、Google の本社(Googleplex)の詳細情報が表示されています。アプリに変数として格納されるデータは次のとおりです。

  • 場所の名前
  • 場所の評価
  • 場所のクチコミの数
  • ユーザーがこの場所を保存(またはブックマーク)したかどうか
  • 場所の住所
  • 場所の説明

これらの変数に格納されているデータを変更することで、地図アプリで他の場所の詳細情報も柔軟に表示できるようになります。

データ型

アプリのどの要素を変数にするかを決める際には、それらの変数に格納できるデータ型を指定することが重要です。Kotlin には、よく使われる基本的なデータ型がいくつかあります。以下の表では、行ごとに各データ型を示しています。データ型ごとに、格納できるデータの種類の説明と、値の例を記載しています。

Kotlin のデータ型

格納できるデータの種類

リテラル値の例

String

テキスト

"Add contact"
"Search"
"Sign in"

Int

整数

32
1293490
-59281

Double

小数

2.0
501.0292
-31723.99999

Float

小数(Double より精度が低くなります)。番号の末尾に f または F が含まれています。

5.0f
-1630.209f
1.2940278F

Boolean

true または false。取り得る値が 2 つしかない場合は、このデータ型を使用します。truefalse は、Kotlin のキーワードです。

true
false

Kotlin の一般的なデータ型をいくつか確認したところで、先ほど場所の詳細ページで特定した各変数に適しているデータ型を考えてみましょう。

この Google マップアプリのスクリーンショットには、Googleplex の場所の詳細が表示されています。Googleplex は社屋で、Google のグローバル本社であると説明されています。この場所は、9,831 件のクチコミによって 4.2 という評価を受けています。住所は、1600 Amphitheatre Pkwy, Mountain View, CA 94043 です。この画面には、この場所をリストに保存するためのオプションがあります。

  • 場所の名前はテキストなので、データ型が String. の変数に保存できます。
  • 場所の評価は小数(4.2 個の星など)であるため、Double として保存できます。
  • 場所のレビュー数は整数であるため、Int として保存する必要があります。
  • ユーザーがこの場所を保存したかどうかについては、有効な値は 2 つ(保存済みまたは未保存)であるため、truefalse でそれぞれの状態を表すことができる Boolean として保存されます。
  • 場所の住所はテキストであるため、String にする必要があります。
  • 場所の説明もテキストなので、String にします。

次の 2 つのシナリオでさらに練習しましょう。各アプリで使用されている変数とデータ型を特定してください。

  1. 動画を視聴するアプリ(YouTube アプリなど)には、動画の詳細画面があります。変数はどこで使用されているでしょうか。また、それらの変数のデータ型は何でしょうか。

このスクリーンショットは、YouTube アプリで再生中の動画を示しています。この動画の名前は「Android Developers has reached 1M subscribers!」です。この動画は、Android Developers という YouTube チャンネルに投稿されたものです。動画の視聴回数は 6,900 回、高評価数が 541 件で、コメント数は 68 件です。

正解は 1 つではありませんが、動画視聴アプリでは変数を次のデータに使用できます。

  • 動画の名前String
  • チャンネルの名前String
  • 動画の視聴回数Int
  • 動画の高評価数Int
  • 動画のコメント数Int
  1. Gmail などのメールアプリでは、受信トレイ画面に最新の受信メールが表示されます。変数はどこで使用されているでしょうか。また、それらの変数のデータ型は何でしょうか。

この Gmail アプリのスクリーンショットには、ユーザーの受信トレイにあるメールの一覧が表示されています。受信トレイには現在 1 件のメール(送信者は Mary Joe)があります。メールの件名は「This weekend」です。メールにスターを付けるオプションがあります。

ここでも、正解は 1 つではありません。メールアプリでは、変数を次のデータに使用できます。

  • 送信者の名前String
  • メールの件名String
  • メールにスターが付いているかどうか(Boolean
  • 受信トレイ内の新着メールの数Int

試してみる

  1. スマートフォンでお気に入りのアプリを開きます。
  2. アプリの特定の画面上で、変数が使用されていると思われる場所を特定します。
  3. それらの変数のデータ型を推測します。
  4. そのアプリのスクリーンショットと、変数が使用されていると思われる場所の説明を添えて、ソーシャル メディアで回答を共有しましょう。その際にはハッシュタグ #AndroidBasics を使用してください。

ここまで、変数とデータ型の基本について学びました。次のセクションでは、コード内での変数とデータ型の使用方法について詳しく説明します。

3.変数を定義して使用する

変数の定義と使用

変数を使用するには、まずコードで変数を定義する必要があります。これは、前回の Codelab で学んだ、関数を呼び出す前に関数を定義する作業と似ています。

変数を定義するときは、変数を一意に識別するために名前を付けます。また、データ型を指定して格納するデータの種類を決定します。最後に、変数に格納する初期値を指定できますが、これは必須ではありません。

変数を定義したら、プログラム内でその変数を使用できるようになります。変数を使用するには、コード内に変数名を記述します。これにより、コード内のその時点における変数値を使用することが Kotlin コンパイラに伝えられます。

たとえば、ユーザーの受信トレイにある未読メッセージの件数の変数を定義するとします。この変数の名前を count とします。変数内に 2 などの値を保存することで、ユーザーの受信トレイ内に 2 件の未読メッセージがあることを表現できます(変数には別の数値を格納することもできますが、この例では数値 2 を使用します)。

count と記載された箱があります。箱の外側には 2 というラベルがあります。値から箱に向かって伸びている矢印は、値が箱に格納されることを示しています。

コードで未読メッセージの件数にアクセスする必要がある場合は、そのたびにコードに「count」と入力します。命令を実行すると、Kotlin コンパイラはコード内の変数名を確認し、その場所に変数値を使用します。

このプロセスを説明するための、より具体的な専門用語があります。

は、値を持つ小さなコード単位です。式は、変数や関数呼び出しなどで構成できます。次のケースでは、式count 変数という 1 つの変数で構成されています。この式の値は 2 です。

この図では、値の横に式が表示されています。expression ラベルがあり、その下に count と表示されています。その右側に value ラベルがあり、その下に 2 と表示されています。

評価とは、式の値を決定することを意味します。この場合、式は 2 と評価されます。コンパイラは、コード内の式を評価し、プログラムで命令を実行するときにその値を使用します。

この図は、式の count が 2 と評価されることを示しています。count という変数名が 値 2 の横に表示されています。count 変数は丸で囲まれ、count 変数から値 2 に向かって矢印が伸びています。矢印には「evaluates to(評価)」というラベルが付けられています。

次のセクションでは、Kotlin プレイグラウンドでプログラムを実行して、実際の動作を確認します。

  1. ウェブブラウザで Kotlin プレイグラウンドを開きます。
  2. Kotlin プレイグラウンドの既存のコードを、次のプログラムに置き換えます。

このプログラムは、初期値が 2count という変数を作成し、count 変数の値を出力して使用します。ここでは、コード構文をすべて理解していなくても問題ありません。その部分については後のセクションで詳しく説明します。

fun main() {
    val count: Int = 2
    println(count)
}
  1. プログラムを実行します。出力は次のようになります。
2

変数の宣言

実行したプログラムのコードの 2 行目には、次のように記述されています。

val count: Int = 2

このステートメントにより、数値 2 を保持する count という整数変数が作成されます。

count と記載された箱があります。箱の外側には 2 というラベルがあります。値から箱に向かって伸びている矢印は、値が箱に格納されることを示しています。

Kotlin で変数を宣言する構文(または形式)に慣れるまでには、時間がかかることがあります。次の図は、変数の詳細を配置する場所と、スペースと記号の位置を示しています。

この図は、Kotlin で変数を宣言する構文を示しています。変数宣言は val という単語で始まり、その後にスペースが続いています。その右側に name というラベルの付いたボックスがあります。name ボックスの右側にコロン記号があります。コロンの後にはスペースがあり、その後に data type というラベルの付いたボックスがあります。その右側にスペース、等号、さらにもう 1 つのスペースがあります。その右側に、initial value というラベルの付いたボックスがあります。

count 変数の例では、変数宣言が val という単語で始まっていることがわかります。変数名は count です。データ型は Int で、初期値は 2 です。

この図は、「val count: Int = 2」というコード行を示しています。コードの各部分を指す矢印は、それぞれの役割を説明しています。name というラベルは、コード内の count という単語を指しています。data type というラベルは、コード内の Int という単語を指しています。initial value というラベルは、コード内の数字 2 という数字を指しています。

変数宣言の各部分について、以下で詳しく説明します。

新しい変数を定義するキーワード

新しい変数を定義するには、まず Kotlin キーワード val(value(値)の略)を記述します。これにより、Kotlin コンパイラはこのステートメント内に変数宣言があることを認識します。

変数名

関数と同様、変数にも名前を付けます。変数宣言内で、val キーワードの後に変数名を指定します。

この図は、Kotlin で変数を宣言する構文を示しています。変数宣言は val という単語で始まり、その後にスペースが続いています。その右側に name というラベルの付いたボックスがあります。name ボックスが緑色の枠線と背景でハイライト表示され、変数宣言のこの部分が強調されています。name ボックスの右側にコロン記号があります。コロンの後にはスペースがあり、その後に data type というラベルの付いたボックスがあります。その右側にスペース、等号、さらにもう 1 つのスペースがあります。その右側に、initial value というラベルの付いたボックスがあります。

変数名は自由に設定できます。ただし、Kotlin キーワードを変数名として使用することはおすすめしません。

コードを読みやすくするため、変数が保持するデータを表す名前を選択することをおすすめします。

関数名と同じように、変数名はキャメルケースの命名規則に従って付ける必要があります。変数名の最初の単語はすべて小文字にします。名前に複数の単語が含まれる場合、単語の間にスペースを入れず、その他の単語はすべて大文字で始める必要があります。

変数名の例:

  • numberOfEmails
  • cityName
  • bookPublicationDate

前述のコード例では、count が変数名です。

val count: Int = 2

変数のデータ型

変数名の後に、コロン、スペース、および変数のデータ型を追加します。前述のとおり、Kotlin の基本的なデータ型には StringIntDoubleFloat,Boolean などがあります。データ型の詳細については、このコースで後ほど説明します。データ型は、ここに示したとおりに正確なスペルで入力し、それぞれ大文字で始めます。

この図は、Kotlin で変数を宣言する構文を示しています。変数宣言は val という単語で始まり、その後にスペースが続いています。その右側に name というラベルの付いたボックスがあります。name ボックスの右側にコロン記号があります。コロンの後にはスペースがあり、その後に data type というラベルの付いたボックスがあります。data type ボックスが緑の枠線と背景でハイライト表示され、変数宣言のこの部分が強調されています。data type ボックスの右側には、スペース、等号、さらに別のスペースがあります。その右側に、initial value というラベルの付いたボックスがあります。

count 変数の例では、Int が変数のデータ型です。

val count: Int = 2

代入演算子

変数宣言では、等号(=)をデータ型の後に記述します。この等号は代入演算子と呼ばれます。代入演算子によって、値が変数に代入されます。つまり、等号の右側にある値が、等号の左側にある変数に格納されます。

この図は、「val count: Int = 2」というコード行を示しています。2(等号の右側)から count という単語(等号の左側)に向かって矢印が伸びています。これは、値 2 が count 変数に格納されていることを示しています。

変数の初期値

変数の値とは、変数に格納されている実際のデータのことです。

この図は、Kotlin で変数を宣言する構文を示しています。変数宣言は val という単語で始まり、その後にスペースが続いています。その右側に name というラベルの付いたボックスがあります。name ボックスの右側にコロン記号があります。コロンの後にはスペースがあり、その後に data type というラベルの付いたボックスがあります。data type ボックスの右側には、スペース、等号、さらに別のスペースがあります。その右側に、initial value というラベルの付いたボックスがあります。initial value ボックスが緑の枠線と背景でハイライト表示され、変数宣言のこの部分が強調されています。

count 変数の例では、数値 2 が変数の初期値です。

val count: Int = 2

これを「count 変数が 2 に初期化される」と表現することもあります。これは、変数が宣言されたときに、変数に格納される最初の値が 2 であることを意味します。

初期値は、変数に対して宣言されたデータ型によって異なります。

この Codelab の前半で確認した以下の表をもう一度見てみましょう。3 列目は、各型の変数に格納できる値の例を示しています。これらの値は、固定値または定数値(常に同じ値)であるため、リテラルと呼ばれます。たとえば、整数 32 の値は常に 32 となります。一方、変数は値が変更される可能性があるため、リテラルではありません。こうしたリテラル値は、文字列リテラル、整数リテラル、ブール値リテラルなど、型に基づいて区別される場合もあります。

Kotlin のデータ型

格納できるデータの種類

リテラル値の例

String

テキスト

"Add contact"
"Search"
"Sign in"

Int

整数

32
1293490
-59281

Double

小数

2.0
501.0292
-31723.99999

Float

小数(Double より精度が低くなります)。番号の末尾に f または F が含まれています。

5.0f
-1630.209f
1.2940278F

Boolean

true または false。取り得る値が 2 つしかない場合は、このデータ型を使用します。truefalse は、Kotlin のキーワードです。

true
false

変数のデータ型に応じて、適切で有効な値を指定することが重要です。たとえば、Kotlin コンパイラでエラーとなるため、Int 型の変数内に "Hello" のような文字列リテラルを格納することはできません。

変数を使用する

Kotlin Playground で実行した元のプログラムは以下のようなものでした。コードの 2 行目で、2 の値を持つ count という新しい整数変数が作成されることを学習しました。

fun main() {
    val count: Int = 2
    println(count)
}

次に、コードの 3 行目を見てみましょう。このコードでは、count 変数を出力します。

println(count)

count という単語が引用符で囲まれていないことに注意してください。これは文字列リテラルではなく、変数名です(文字列リテラルは単語が引用符で囲まれています)。プログラムを実行すると、Kotlin コンパイラは丸かっこ内の式(count)を println() 命令に対して評価します。式は 2 と評価されるため、入力として 2 を使用して println() メソッドが呼び出されます(println(2))。

したがって、プログラムの出力は次のようになります。

2

出力に含まれる数値自体はそれほど有用ではありません。出力に詳細なメッセージを表示して、2 が何を表しているかを理解できるようにすると便利です。

文字列テンプレート

以下のようにすることで、出力に表示されるメッセージの有用性が高まります。

You have 2 unread messages.

より有用性の高いメッセージを出力するには、以下の手順を実行します。

  1. 次のコードを使用して、Kotlin プレイグラウンドのプログラムを更新します。println() 呼び出しでは、count 変数名を含む文字列リテラルを渡します。テキストは引用符で囲んでください。これを実行しても期待どおりの結果は得られませんが、その問題は後で修正します。
fun main() {
    val count: Int = 2
    println("You have count unread messages.")
}
  1. プログラムを実行すると、次のような出力が表示されます。
You have count unread messages.

これは文として意味をなしていません。変数名ではなく、count 変数の値をメッセージに表示する必要があります。

  1. プログラムを修正するには、count 変数の前にドル記号 $ を追加します("You have $count unread messages.")。テンプレート式(この場合は $count)が含まれるため、これは文字列テンプレートです。テンプレート式とは、文字列内で、値に評価されて置き換えられる式のことです。この場合、テンプレート式 $count2 と評価され、式が置かれている文字列で 2 に置き換えられます。
fun main() {
    val count: Int = 2
    println("You have $count unread messages.")
}
  1. プログラムを実行すると、意図したとおりの出力が表示されます。
You have 2 unread messages.

これで、ユーザーにとってはるかにわかりやすい文を生成できました。

  1. 次に、count 変数の初期値を別の整数リテラルに変更します。たとえば、数値 10 を指定して、プログラムの他の部分はそのままにします。
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. プログラムを実行します。出力は適宜変更されるため、プログラムで println() ステートメントを変更する必要はありません。
You have 10 unread messages.

文字列テンプレートがいかに便利であるか理解できたと思います。ここでは、コードに文字列テンプレートを 1 回だけ記述しました("You have $count unread messages.")。count 変数の初期値を変更しても println() ステートメントが引き続き機能するようになったため、コードの柔軟性が向上しました。

この点をさらに強調するために、以下の 2 つのプログラムを比較してみましょう。1 つ目のプログラムでは、文字列リテラルを使用し、文字列の中に未読メッセージの正確な数を直接指定しています。このプログラムは、ユーザーの未読メッセージが 10 件の場合にのみ機能します。

fun main() {
    println("You have 10 unread messages.")
}

2 つ目のプログラムでは、変数と文字列テンプレートを使用してコードをより多くのシナリオに適応させることができるため、プログラムの柔軟性が向上します。

fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}

型推論

以下に、変数を宣言する際に記述するコードを削減するためのヒントをご紹介します。

型推論とは、コード内で型を明示的に記述しなくても、Kotlin コンパイラが変数のデータ型を推論(または判断)できる機能のことです。つまり、変数の初期値を指定すれば、変数宣言のデータ型を省略できるということです。Kotlin コンパイラは初期値のデータ型を調べ、変数にその型のデータが格納されると想定します。

型推論を使用した変数宣言の構文は次のとおりです。

この図は、Kotlin で型推論を使用して変数を宣言する構文を示しています。変数宣言は val という単語で始まり、その後にスペースが続いています。その右側に name というラベルの付いたボックスがあります。name ボックスの右側には、スペース、等号、さらに別のスペースがあります。その右側に、initial value というラベルの付いたボックスがあります。

count の例に戻ると、プログラムにはもともと次のコード行が含まれていました。

val count: Int = 2

しかし、このコード行は次のように、コロン記号(:)と Int データ型を省略して記述することもできます。更新された構文では、入力する単語が少なく、2 の値で count という Int 変数を作成した場合と同じ結果が得られます。

val count = 2

Kotlin コンパイラは、2(整数)を変数 count に格納するという意図を読み取り、count 変数の型が Int であると推論します。これは Kotlin コードを簡潔に記述する方法の一例です。

この例では、Int 型の変数についてのみ説明しましたが、型推論のコンセプトは Kotlin のすべてのデータ型に適用されます。

整数の基本的な数学演算

値が 2Int 変数と、値が "2"String 変数の違いは何でしょうか。どちらも出力されると同じように見えます。

整数を(String ではなく)Int として格納することの利点は、Int 変数で数学演算(加算、減算、除算、乗算など)を実行できることです(その他の数学演算については演算子を参照)。たとえば、2 つの整数変数を加算して合計を取得できます。整数を String として格納するほうが合理的な場合もありますが、このセクションの目的は、Int 変数を使ってできることを紹介することです。

  1. Kotlin プレイグラウンドに戻り、コードエディタ内のすべてのコードを削除します。
  2. 新しいプログラムを作成して、受信トレイ内の未読メール数を表す整数変数を定義し、5 などの値に初期化します。別の数を選択することもできます。受信トレイ内の既読メール数を示す 2 つ目の整数変数を定義します。100 などの値に初期化します。別の数を選択することもできます。2 つの整数を足して、受信トレイ内のメールの合計数を出力します。
fun main() {
    val unreadCount = 5
    val readCount = 100
    println("You have ${unreadCount + readCount} total messages in your inbox.")
}
  1. プログラムを実行すると、受信トレイ内のメールの合計数が表示されます。
You have 105 total messages in your inbox.

文字列テンプレートの場合、1 つの変数名の前に $ 記号を追加できることを学びました。式が複雑な場合は、式を中かっこで囲み、その前に $ 記号を付けます(${unreadCount + readCount})。中かっこ内の式(unreadCount + readCount)は 105 と評価されます。次に文字列内で、値 105 に置き換えられます。

この図では、値の横に式が表示されています。expression ラベルがあり、その下に「unreadCount + readCount」と表示されています。その右側に value ラベルがあり、その下に 105 と表示されています。

  1. このトピックの理解をさらに深めるために、名前と初期値が異なる複数の変数を作成し、テンプレート式を使用してメッセージを出力します。

たとえば、次の出力が表示されるようにプログラムを変更します。

100 photos
10 photos deleted
90 photos left

ここではプログラムを記述する方法の 1 つを紹介しましたが、記述方法は他にもあります。

fun main() {
    val numberOfPhotos = 100
    val photosDeleted = 10
    println("$numberOfPhotos photos")
    println("$photosDeleted photos deleted")
    println("${numberOfPhotos - photosDeleted} photos left")
}

4. 変数を更新する

アプリの実行中に、変数の値の更新が必要になる場合があります。たとえば、ショッピング アプリでは、ユーザーがショッピング カートにアイテムを追加すると、カートの合計額が増えます。

ショッピングのユースケースを簡略化して、シンプルなプログラムを作成しましょう。以下のロジックは、Kotlin ではなく人間の言語で書かれています。コードの記述方法の要点を説明することから、これは疑似コードと呼ばれますが、コードの詳細がすべて含まれているわけではありません。

プログラムの主な機能は次のとおりです。

  • 0 で始まる cartTotal 整数変数を作成します。
  • ユーザーがショッピング カートに 20 ドルのセーターを追加します。
  • cartTotal 変数を、ショッピング カート内の商品の現在の金額である 20 に更新します。
  • カート内の商品の合計額(cartTotal 変数)を出力します。

コードをさらに簡素化するため、ここではユーザーがショッピング カートに商品を追加した場合のコードは記述しません(プログラムがユーザー入力にどのように応答するかについては、後のユニットで学習します)。そのため、cartTotal 変数を作成、更新、出力する部分に焦点を当てます。

  1. Kotlin プレイグラウンドの既存のコードを、以下のプログラムに置き換えます。プログラムの 2 行目で、cartTotal 変数を値 0 に初期化します。初期値を指定することで型推論が行われるため、Int データ型を指定する必要はありません。プログラムの 3 行目で、代入演算子(=)を使用して cartTotal 変数を 20 に更新します。プログラムの 4 行目で、文字列テンプレートを使用して cartTotal 変数を出力します。
fun main() {
    val cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. プログラムを実行すると、コンパイル エラーが発生します。
  2. エラーの内容は、「val には再代入できない」というものです。このエラーの原因はプログラムの 3 行目にあります。ここで cartTotal 変数を 20. に変更しようとしましたが、val cartTotal には初期値(0)が代入されているため、別の値(20)を再代入することはできません。
Val cannot be reassigned

変数の値を更新する必要がある場合は、Kotlin キーワード varval ではなく)を使用して変数を宣言します。

  • val キーワード - 変数の値を変更しない場合に使用します。
  • var キーワード - 変数の値を変更する可能性がある場合に使用します。

val の場合、変数は読み取り専用であるため、変数の値を読み取るか、値にアクセスすることしかできません。一度値を設定した後で、その値の編集や変更を行うことはできません。var の場合、変数は可変です。つまり、値を変更できるということです。

val は固定値var は変数と考えると、違いを覚えやすくなります。Kotlin では、可能であれば var キーワードではなく val キーワードを使用することをおすすめします。

  1. プログラムの 2 行目にある cartTotal の変数宣言を更新し、val の代わりに var を使用するようにします。コードは次のようになります。
fun main() {
    var cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. プログラムの 3 行目のコードの構文に注意してください。ここで変数を更新します。
cartTotal = 20

既存の変数(cartTotal)に新しい値(20)を代入するには、代入演算子(=)を使用します。変数はすでに定義されているため、var キーワードを再度使用する必要はありません。

この図は、「cartTotal = 20」というコード行を示しています。20(等号の右側)から carTotal という単語(等号の左側)向かって矢印が伸びています。これは、値 20 が cartTotal 変数に格納されていることを示しています。

箱の例えを使って、cartTotal というラベルが付いた箱に値 20 が格納されている状態をイメージします。

cartTotal と記載された箱があります。箱の外側には 20 というラベルがあります。値から箱に向かって伸びている矢印は、値が箱に格納されることを示しています。

次の図は、変数を更新するための一般的な構文を示したものです。この変数は、コードの前の行ですでに宣言されています。更新する変数の名前でステートメントを開始します。それに続けて、スペース、等号、スペースの順で追加します。その後で、更新後の変数の値を記述します。

この図は、Kotlin で変数を更新する構文を示しています。コード行は、name というラベルの付いたボックスで始まっています。name ボックスの右側には、スペース、等号、さらに別のスペースがあります。その右側に、updated value というラベルの付いたボックスがあります。

  1. プログラムを実行すると、コードが正常にコンパイルされます。出力は次のようになります。
Total: 20
  1. プログラムの実行中に変数の値がどのように変化するかを確認するには、最初に cartTotal 変数を宣言し、その後でこの変数を出力します。変更後のコードは以下のようになります。3 行目に新しい println() ステートメントが追加されました。また、コードの 4 行目にも空白行が追加されています。空白行は、コンパイラによるコードの理解には影響しません。関連するコードブロックごとに区切ることでコードが読みやすくなる場合には、空白行を追加します。
fun main() {
    var cartTotal = 0
    println("Total: $cartTotal")

    cartTotal = 20
    println("Total: $cartTotal")
}
  1. プログラムを再度実行すると、出力は次のようになります。
Total: 0
Total: 20

最初はショッピング カートの合計額が 0 となり、その後 20 に更新されています。これで、変数を正常に更新できました。cartTotal を読み取り専用変数(val を使用)から可変変数(var を使用)に変更したことで、この更新が可能になりました。

値の変更を想定している場合のみ、var を使用して変数を宣言してください。それ以外の場合は、デフォルトで val を使用して変数を宣言する必要があります。これにより、コードの安全性が高まります。val を使用することで、プログラム内で想定していない変数が更新されることを防止できます。val に値が代入された後は、常にその値が維持されます。

インクリメント演算子とデクリメント演算子

変数の値を更新するには、変数を var として宣言する必要があることを学びました。この知識を、先ほど使用したメール メッセージの例に適用してみましょう。

  1. Kotlin プレイグラウンドのコードを次のプログラムで置き換えます。
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. プログラムを実行します。次のように出力されます。
You have 10 unread messages.
  1. val キーワードを var キーワードに置き換えて、count 変数を可変変数にします。このプログラムを実行しても、出力が変更されることはありません。
fun main() {
    var count: Int = 10
    println("You have $count unread messages.")
}
  1. ただし、これで count を別の値に更新できるようになりました。たとえば、ユーザーの受信トレイに 1 通の新着メールが届いたら、count を 1 つ増やすことができます(メールの受信を表すコードを記述する必要はありません。インターネットからのデータの取得は、さらに後のユニットで学習する高度なトピックです)。現時点では、次のコード行で 1 ずつ増加する count 変数に注目してください。
count = count + 1

等号の右側の式は count + 1 で、11 と評価されます。これは、count の現在の値が 10(プログラムの 2 行目)であり、10 + 111 となるためです。その後、代入演算子を使用して、値 11count 変数に代入(格納)されます。

この図は、「count = count + 1」というコード行を示しています。「count + 1」という式が丸で囲まれています。丸で囲まれた式(等号の右側)から、単語 count(等号の左側)に向かって矢印が伸びています。これは、「count + 1」という式の値が count 変数に格納されていることを示しています。

このコード行を、プログラムの main() 関数の一番下に追加します。コードは次のようになります。

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
}

count 変数の更新後、この変数を使用するコードを追加していないため、このプログラムを実行しても出力は前と同じになります。

  1. 変数の更新後に未読メッセージの数を出力する print ステートメントを追加します。
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
    println("You have $count unread messages.")
}
  1. プログラムを実行します。2 番目のメッセージで count が更新され、メッセージ数が 11 件と表示されます。
You have 10 unread messages.
You have 11 unread messages.
  1. 変数を 1 だけ増やしたい場合、インクリメント演算子++)を使用することでコードを簡略化できます。インクリメント演算子は、2 つのプラス記号で構成されています。これらの記号を変数名の直後に使用することで、その変数の現在の値に 1 を加算したうえで新しい値を変数に格納するようコンパイラに指示できます。次の 2 行のコードは等価ですが、インクリメント演算子(++)を使用したほうが入力の手間が少なくなります。
count = count + 1
count++

コードにこの変更を加えてから、プログラムを実行します。変数名とインクリメント演算子の間にはスペースを入れないでください。

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count++
    println("You have $count unread messages.")
}
  1. プログラムを実行します。出力結果は同じですが、これで新しい演算子について学習できました。
You have 10 unread messages.
You have 11 unread messages.
  1. 次に、プログラムの 4 行目を変更して、count 変数名の後にデクリメント演算子--)を追加します。デクリメント演算子は、2 つのマイナス記号で構成されています。デクリメント演算子を変数名の後に配置することで、変数の値を 1 だけ減算したうえで新しい値を変数に格納するようコンパイラに指示できます。
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count--
    println("You have $count unread messages.")
}
  1. プログラムを実行します。次のように出力されます。
You have 10 unread messages.
You have 9 unread messages.

このセクションでは、インクリメント演算子(++)とデクリメント演算子(--)を使用して可変変数を更新する方法を学習しました。具体的には、count++count = count + 1count--count = count - 1 がそれぞれ等価であることを確認しました。

5. 他のデータ型

Codelab の前半では基本的なデータ型(StringIntDoubleBoolean)の概要を学び、直前には Int データ型を実際に使用しました。次に、他のデータ型について学習します。

Kotlin のデータ型

格納できるデータの種類

String

テキスト

Int

整数

Double

小数

Boolean

true または false(取り得る値は 2 つのみ)

Kotlin プレイグラウンドでこれらのプログラムを試して、出力を確認します。

Double

小数値を格納できる変数が必要な場合は、Double 変数を使用します。有効な範囲については、こちらの表で格納できる 10 進数字をご覧ください。

目的地に移動する際に、途中で 2 か所に立ち寄るため、行程が 3 つの部分に分かれるとします。このプログラムでは、目的地に到着するまでの残りの距離の合計を表示します。

  1. Kotlin プレイグラウンドに次のコードを入力します。コードの各行で何が行われているか理解できるでしょうか。
fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = 0.0
    println("$totalTripLength miles left to destination")
}

行程の各部分の距離を表すために、trip1trip2trip3 という 3 つの変数を宣言しています。これらの変数には小数値が格納されるため、すべて Double 変数としています。変数の値はプログラムの過程で変化しないため、val を使用して各変数を宣言しています。このプログラムでは totalTripLength という 4 つ目の変数も作成し、現在 0.0 に初期化しています。プログラム最終行では、totalTripLength の値を含むメッセージを出力します。

  1. totalTripLength 変数が 3 つの行程の長さの合計となるようにコードを修正します。
val totalTripLength: Double = trip1 + trip2 + trip3

3.20 + 4.10 + 1.729.02 になるため、等号の右側の式は 9.02 と評価されます。9.02 の値は totalTripLength 変数に格納されます。

この図は、「val totalTripLength: Double = trip1 + trip2 + trip3」というコード行を示しています。「trip1 + trip2 + trip3」という式が丸で囲まれています。丸で囲まれた式(等号の右側)から、totalTripLength という単語(等号の左側)に向かって矢印が伸びています。これは、「trip1 + trip2 + trip3」 という式の値が totalTripLength 変数に格納されていることを示しています。

プログラム全体のコードは次のようになります。

fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. プログラムを実行します。次のように出力されます。
9.02 miles left to destination
  1. 型推論が行われるため、変数宣言から不要な Double データ型を削除するようコードを修正します。Kotlin コンパイラは、初期値として提供される小数に基づいて、これらの変数が Double データ型であると推論できます。
fun main() {
    val trip1 = 3.20
    val trip2 = 4.10
    val trip3 = 1.72
    val totalTripLength = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. コードを再度実行し、コードが引き続きコンパイルされることを確認します。出力は同じになりますが、これでコードが簡素化されました。

String

テキストを格納できる変数が必要な場合は、String 変数を使用します。String のリテラル値は "Hello Kotlin" のように引用符で囲みますが、Int および Double のリテラル値は引用符で囲みません。

  1. このプログラムをコピーして、Kotlin プレイグラウンドに貼り付けます。
fun main() {
    val nextMeeting = "Next meeting is:"
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}

nextMeeting 変数と date 変数という 2 つの String 変数が宣言され、その後で reminder という 3 つ目の String 変数が宣言されています。これは、nextMeeting 変数と date 変数をつなぐように設定されています。

このように + 記号を使用して 2 つの文字列を結合することを、「連結」と呼びます。次の図に示すように、式 nextMeeting + date の結果は "Next meeting is:January 1" となります。

この図は、式「nextMeeting + date」が「Next meeting is:January 1」と評価されることを示しています。式「nextMeeting + date」は丸で囲まれ、そこから値「Next meeting is:January 1」に向かう矢印があります。矢印には「evaluates to(評価)」というラベルが付けられています。

"Next meeting is:January 1" は、プログラムの 4 行目にある代入演算子を使用して reminder 変数に格納されます。

  1. プログラムを実行すると、次のように出力されます。
Next meeting is:January 1

2 つの文字列を連結する場合、文字列の間にスペースは追加されません。出力される文字列のコロンの後にスペースを入れる場合は、いずれかの文字列にスペースを追加する必要があります。

  1. nextMeeting 変数を更新して、文字列の末尾の閉じ引用符の前にスペースを追加します(または、date 変数の先頭にスペースを追加することもできます)。プログラムは次のようになります。
fun main() {
    val nextMeeting = "Next meeting is: "
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}
  1. プログラムをもう一度実行すると、出力メッセージのコロンの後にスペースが表示されます。
Next meeting is: January 1
  1. コードを変更して、reminder 変数に格納される式に別のテキストを連結(追加)します。

+ 記号を使用して、reminder 文字列の末尾に文字列リテラル "at work" を追加します。

  1. プログラムを実行します。

次のように出力されます。

Next meeting is: January 1 at work

次のコードは、この動作を実装する方法の一つを示しています。

fun main() {
    val nextMeeting = "Next meeting is: "
    val date = "January 1"
    val reminder = nextMeeting + date + " at work"
    println(reminder)
}

nextMeetingdate は既存の文字列変数の名前であるため、引用符で囲みません(それぞれの値はテキストなので引用符で囲みます)。逆に、リテラル "at work" は事前に変数で定義されていないため、他の文字列に連結する文字列であることをコンパイラが認識できるように、このテキストを引用符で囲みます。

技術的には、個別の変数を使用する代わりに、全文を表す 1 つの String 変数を宣言することによって、同じ内容を出力できます。ただし、この演習の目的は、String 変数を宣言および操作する方法、特に別々の文字列を連結する方法を示すことです。

  1. 文字列を含むコードには、エスケープ シーケンスが使用されていることがあります。エスケープ シーケンスとは、バックスラッシュ記号(\)で始まる文字のことです。バックスラッシュはエスケープ バックスラッシュとも呼ばれます。

次の例では、文字列リテラル内に \" が使用されています。このコードをコピーして Kotlin プレイグラウンドに貼り付けます。

fun main() {
    println("Say \"hello\"")
}

前に、文字列リテラルを二重引用符で囲むことを学びました。しかし、文字列に " 記号を使用したい場合はどうすればよいでしょうか。その場合は、文字列内で二重引用符の前にバックスラッシュ記号を追加して、\" とする必要があります。さらに、文字列全体を二重引用符で囲むことを忘れないでください。

  1. プログラムを実行して出力を表示します。出力は次のようになります。
Say "hello"

println() ステートメント内で hello の前後に \" を追加したため、出力では、hello が引用符で囲まれます。

Kotlin でサポートされているその他のエスケープ シーケンスについては、エスケープ シーケンスに関するドキュメント ページをご覧ください。たとえば、文字列に改行を入れる場合は、\n のように、文字 n の前に \ 記号を使用します。

これで、文字列の連結と、文字列内のエスケープ シーケンスについて学習しました。次に、この Codelab で扱う最後のデータ型に進みます。

Boolean

Boolean データ型は、変数が true または false で表される 2 つの値しか持たない場合に便利です。

たとえば、デバイスの機内モードのオン / オフ、アプリの通知の有効 / 無効などを表す変数があります。

  1. Kotlin プレイグラウンドに次のコードを入力します。プログラムの 2 行目で、notificationsEnabled という Boolean 変数を宣言して true に初期化します。技術的には、宣言の : Boolean は省略できるため、削除しても構いません。プログラムの 3 行目で、notificationsEnabled 変数の値を出力します。
fun main() {
    val notificationsEnabled: Boolean = true
    println(notificationsEnabled)
}

プログラムを実行すると、次のように出力されます。

true
  1. プログラムの 2 行目で、Boolean の初期値を false に変更します。
fun main() {
    val notificationsEnabled: Boolean = false
    println(notificationsEnabled)
}

プログラムを実行すると、次のように出力されます。

false
  1. 他のデータ型を Strings に連結することもできます。たとえば、BooleansStrings に連結できます。+ 記号を使用して、notificationsEnabled ブール値の値を "Are notifications enabled? " 文字列の末尾に連結(追加)します。
fun main() {
    val notificationsEnabled: Boolean = false
    println("Are notifications enabled? " + notificationsEnabled)
}

プログラムを実行して、連結の結果を確認します。プログラムの出力は次のようになります。

Are notifications enabled? false

このように、Boolean 変数の値は true または false に設定できます。Boolean 変数を使用すると、Boolean 変数の値が true の場合は一連の命令を実行し、Boolean の値が false の場合はそれらの命令をスキップするシナリオをコーディングすることも可能になります。Booleans については今後の Codelab で詳しく説明します。

6. コーディング規則

前の Codelab では、Google が推奨し、他のプロのデベロッパーも従っている一貫した方法で Android コードを記述するための Kotlin スタイルガイドを紹介しました。

学習した新しいトピックに関連して、次のような形式やコーディング規則にも従う必要があります。

  • 変数名はキャメルケースで記述し、先頭は小文字にします。
  • 変数宣言でデータ型を指定する際には、コロンの後にスペースを入れます。

この図は、「val discount: Double = .20」というコード行を示しています。space というラベルが付いた矢印が、コロン記号と Double データ型の間のスペースを指しています。

  • 代入(=)、加算(+)、減算(-)、乗算(*)、除算(/)などの演算子の前後にはスペースが必要です。

この図は、「var pet = "bird"」というコード行を示しています。space というラベルが付いた矢印が、等号の前後のスペースを指しています。

この図は、「val sum = 1 + 2」というコード行を示しています。space というラベルが付いた矢印が、プラス記号の前後のスペースを指しています。

  • 複雑なプログラムを記述する場合は、1 行あたり 100 文字を上限とすることが推奨されています。これにより、横方向にスクロールしなくても、プログラム内のすべてのコードをパソコンの画面で簡単に読むことができます。

7. コードでのコメント

コーディングの際には、コードの目的を説明するコメントを追加することもおすすめします。これにより、他の人がコードを簡単に理解できるようになります。スラッシュ記号を 2 つ(//)記述すると、その行のそれ以降のテキストはコメントと見なされ、コードとして解釈されないようになります。通常は、2 つのスラッシュ記号の後にスペースを追加します。

// This is a comment.

コメントはコード行の途中から開始することもできます。次の例では、height = 1 は通常のコーディング ステートメントです。// の後の部分(Assume the height is 1 to start with)はすべてコメントとして解釈され、コードの一部とは見なされません。

height = 1 // Assume the height is 1 to start with.

1 行につき 100 文字を超える長いコメントでコードを詳細に説明する場合は、複数行コメントを使用します。複数行コメントを開始するには、スラッシュ(/)とアスタリスク記号(*)を使って /* と記述します。コメントの各行の先頭にアスタリスクを追加し、コメントの最後にアスタリスクとスラッシュ記号(*/)を記述します。

/*
 * This is a very long comment that can
 * take up multiple lines.
 */

次のプログラムには、コードの内容を説明する単一行コメントと複数行コメントが含まれています。

/**
 * This program displays the number of messages
 * in the user's inbox.
 */
fun main() {
    // Create a variable for the number of unread messages.
    var count = 10
    println("You have $count unread messages.")

    // Decrease the number of messages by 1.
    count--
    println("You have $count unread messages.")
}

前述のように、コードに空の行を追加して、関連するステートメントをグループ化し、コードを読みやすくすることができます。

  1. 以前に使用したコード スニペットにコメントを追加します。
  2. プログラムを実行して、コメントが出力に影響せず、動作が変更されていないことを確認します。

8. おわりに

お疲れさまでした。この Codelab では、Kotlin の変数の概要、変数がプログラミングで役立つ理由、変数を作成、更新、使用する方法について学習しました。また、IntDoubleStringBoolean など、Kotlin のさまざまな基本データ型を確認しました。さらに、val キーワードと var キーワードの違いについても学習しました。

デベロッパーになるためには、これらの概念をすべて理解しておく必要があります。

それでは次の Codelab でお会いしましょう。

まとめ

  • 変数とは、単一のデータを格納するコンテナです。
  • 変数を使用する前に、変数を宣言する必要があります。
  • 変数の値が代入されると変更できなくなる読み取り専用の変数を定義するには、val キーワードを使用します。
  • 可変または変更可能な変数を定義するには、var キーワードを使用します。
  • Kotlin では、可能であれば var ではなく val を使用することをおすすめします。
  • 変数を宣言するには、val キーワードまたは var キーワードで開始してから、変数名、データ型、初期値を指定します(例: val count: Int = 2)。
  • 型の推論では、初期値を指定している場合、変数宣言のデータ型を省略できます。
  • Kotlin の一般的な基本データ型には、IntStringBooleanFloatDouble があります。
  • 変数の宣言時や更新時に値を代入するには、代入演算子(=)を使用します。
  • 更新できるのは、var を使用して可変変数として宣言された変数のみです。
  • 整数変数の値を 1 ずつ増減するには、インクリメント演算子(++)またはデクリメント演算子(--)を使用します。
  • 文字列を連結するには、+ 記号を使用します。IntBoolean などの他のデータ型の変数を Strings に連結することもできます。

詳細