Kotlin用語集【レベル1】~基礎文法+制御構造編~

記事内に商品プロモーションを含む場合があります

このサイトではKotlinの基本的文法を33個定義して練習問題を作成しています。

このページではレベル1の11個の基本的文法について、その言葉の意味や使用例を紹介します。

【レベル1のKotlinの基本的文法】
1.コメントの書き方
2.変数と定数
3.基本データ型
4.算術演算と論理演算
5.入力と出力
6.import文
7.配列
8.分岐処理(if、if~else、when)
9.繰り返し処理(for、while、do~while)
10.Null安全
11.スマートキャスト

【レベル2のKotlinの基本的文法】
関数の定義と呼び出し、関数の戻り値、関数のオーバーロード、ラベルとジャンプ、例外処理、クラスの定義と使用、インスタンス、コンストラクタ、プロパティ、クラスの継承、クラスの拡張

Kotlin用語集【レベル2】~オブジェクト指向編①~ このサイトではKotlinの基本的文法を33個定義して練習問題を作成しています。 このページではレベル2の11個の基本的文...

【レベル3のKotlinの基本的文法】
コレクションの基礎、リストコレクション(MutableList、ArrayList)、セットコレクション(HashSet、MutableSet、TreeSet)、マップコレクション(HashMap、MutableMap、TreeMap)

Kotlin用語集【レベル3】~コレクション編~ このサイトではKotlinの基本的文法を33個定義して練習問題を作成しています。 このページではレベル3の4個の基本的文法...

【レベル4のKotlinの基本的文法】
メンバ関数、ゲッターとセッター、カプセル化、クラスメンバ、抽象クラス、インターフェース、データクラス

Kotlin用語集【レベル4】~オブジェクト指向編②~ このサイトではKotlinの基本的文法を33個定義して練習問題を作成しています。 このページではレベル4の7個の基本的文法...

この用語集を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。またKotlinの公式サイトの情報も並行して活用しましょう。

初心者のためのKotlin練習問題集(全38問を無料公開中!) プログラミングは教科書を読んでいるだけでは習得できない! この記事では、Kotlinの学習を始めた初心者に役立つ練習問題を...

コメントの書き方





Kotlinの「コメントの書き方」とは何か、以下に紹介します。

「コメントの書き方」の解説

Kotlinでは、コードを理解しやすくし、他の開発者と協力するためにコメントを使用します。

コメントの基本的な書き方には、行コメントブロックコメントの2つがありますが、行コメントはコードの一部を説明する短いコメントに適しており、ブロックコメントは複数行に渡るコメントや詳細な説明に使用します。

「コメントの書き方」の使用例

行コメントは、//から行末までがコメントとして扱われます。主に短い説明やメモに使われます。

fun main() {
    println("Hello, World!") // この行は「Hello, World!」を出力します
}

ブロックコメントは、/*で始まり、*/で終わります。複数行にわたるコメントや詳細な説明を記述するのに適しています。

/*
 * これはブロックコメントの例です。
 * 複数行に渡るコメントを記述できます。
 */
fun main() {
    println("Hello, World!") 
}

変数と定数

Kotlinの「変数と定数」とは何か、以下に紹介します。

「変数と定数」の解説

Kotlinでは、プログラム内でデータを保持するために「変数」と「定数」が使用されます。

変数と定数は、それぞれ異なる特性を持ち、特定の用途に適しています。

【変数 (variable)】
変数はプログラムの実行中に値を変更できるデータのことです。変数を宣言するには、varキーワードを使用します。変数の値は、プログラムのどこかで再代入することができます。

var age = 25
age = 26 // 変数の値を変更

【定数 (constant)】
定数は、一度設定するとその値を変更できないデータのことです。定数を宣言するには、valキーワードを使用します。定数は、プログラムの実行中に値が変わることがないため、安全性が求められる状況で使用されます。

val pi = 3.14159
// pi = 3.14 // コンパイルエラー: val変数には再代入できません

【型推論と明示的な型指定】
Kotlinは強力な型推論機能を持っており、変数や定数の型を自動的に判断します。しかし、明示的に型を指定することも可能です。

var name = "John" // 型推論によりString型と判断
val age: Int = 30 // 明示的にInt型を指定

「変数と定数」の使用例

ここでは、変数と定数の具体的な使用例を示します。

fun main() {
    // 定数の宣言
    val pi: Double = 3.14159
    println("円周率: $pi") // 円周率: 3.14159 を出力

    // 変数の宣言
    var radius = 5
    println("半径: $radius") // 半径: 5 を出力

    // 計算結果を変数に格納
    var circumference = 2 * pi * radius
    println("円周の長さ: $circumference") // 円周の長さ: 31.4159 を出力

    // 変数の値を変更
    radius = 10
    circumference = 2 * pi * radius
    println("新しい半径: $radius") // 新しい半径: 10 を出力
    println("新しい円周の長さ: $circumference") // 新しい円周の長さ: 62.8318 を出力
}

この例では、円周率piを定数として宣言し、円の半径radiusを変数として宣言しています。radiusの値を変更することで、円周の長さcircumferenceも再計算され、新しい値が出力されます。

このように、変数と定数を適切に使い分けることで、プログラムの可読性と安全性を高めることができます。

基本データ型

Kotlinの「基本データ型」とは何か、以下に紹介します。

「基本データ型」の解説

Kotlinの基本データ型は、プログラム内で扱うデータの種類を定義するために使用されます。これらのデータ型は、数値や文字、真偽値などの基本的な値を扱うために使用されます。

Kotlinでは、以下のような基本データ型が提供されています。

【整数型】
Byte: 8ビット整数(-128から127)
Short: 16ビット整数(-32768から32767)
Int: 32ビット整数(-2147483648から2147483647)
Long: 64ビット整数(-9223372036854775808から9223372036854775807)

【浮動小数点数型】
Float: 32ビット浮動小数点数
Double: 64ビット浮動小数点数

【文字型】
Char: 16ビットUnicode文字

【真偽値型】
Boolean: 真(true)または偽(false

【文字列型】
String: 文字列

Kotlinは型推論をサポートしており、明示的に型を指定しなくてもコンパイラが自動的に適切な型を判断します。ただし、必要に応じて明示的に型を指定することも可能です。

「基本データ型」の使用例

以下に、Kotlinの基本データ型の使用例を示します。

fun main() {
    // 整数型の例
    val byteValue: Byte = 10
    val shortValue: Short = 20
    val intValue: Int = 100
    val longValue: Long = 1000L

    println("Byte value: $byteValue")
    println("Short value: $shortValue")
    println("Int value: $intValue")
    println("Long value: $longValue")

    // 浮動小数点数型の例
    val floatValue: Float = 10.5F
    val doubleValue: Double = 20.5

    println("Float value: $floatValue")
    println("Double value: $doubleValue")

    // 文字型の例
    val charValue: Char = 'A'
    println("Char value: $charValue")

    // 真偽値型の例
    val booleanValue: Boolean = true
    println("Boolean value: $booleanValue")

    // 文字列型の例
    val stringValue: String = "Hello, Kotlin!"
    println("String value: $stringValue")

    // 型推論の例
    val inferredInt = 42
    val inferredString = "Kotlin is fun!"

    println("Inferred Int value: $inferredInt")
    println("Inferred String value: $inferredString")
}

この例では、Kotlinの基本データ型を使用して変数を宣言し、それらの値を出力しています。

整数型、浮動小数点数型、文字型、真偽値型、文字列型のすべてが含まれています。また、型推論を使用して型を明示的に指定せずに変数を宣言する例も示しています。

算術演算と論理演算

Kotlinの「算術演算と論理演算」とは何か、以下に紹介します。

「算術演算と論理演算」の解説

【算術演算】
Kotlinでは、数値に対して標準的な算術演算がサポートされています。これらの演算は以下のように表記されます:

+ : 加算
- : 減算
* : 乗算
/ : 除算
% : 剰余

これらの演算子はそれぞれのデータ型に対応するメソッドに変換され、例えば a + ba.plus(b) に変換されます。

【論理演算】
論理演算は、ブール型(Boolean)の値に対して使用される演算で、以下の演算がサポートされています:

&& : 論理積(AND)
|| : 論理和(OR)
! : 否定(NOT)

これらの演算子は条件式で頻繁に使用され、真偽値を操作します。

【比較演算】
Kotlinでは、数値や文字列などを比較するために比較演算子も提供されています:

== : 等しい
!= : 等しくない
< : 小さい
> : 大きい
<= : 小さいか等しい
>= : 大きいか等しい

これらの比較演算子は、compareTo メソッドに変換されます。

「算術演算と論理演算」の使用例

以下に、算術演算と論理演算の具体的な使用例を示します。

fun main() {
    // 算術演算の例
    val a = 10
    val b = 20
    println("a + b = ${a + b}") // 加算
    println("a - b = ${a - b}") // 減算
    println("a * b = ${a * b}") // 乗算
    println("a / b = ${a / b}") // 除算
    println("a % b = ${a % b}") // 剰余

    // 論理演算の例
    val x = true
    val y = false
    println("x && y = ${x && y}") // 論理積
    println("x || y = ${x || y}") // 論理和
    println("!x = ${!x}") // 否定

    // 比較演算の例
    val c = 15
    val d = 20
    println("c == d = ${c == d}") // 等しい
    println("c != d = ${c != d}") // 等しくない
    println("c < d = ${c < d}") // 小さい
    println("c > d = ${c > d}") // 大きい
    println("c <= d = ${c <= d}") // 小さいか等しい
    println("c >= d = ${c >= d}") // 大きいか等しい
}

この例では、基本的な算術演算、論理演算、および比較演算を使用しています。これにより、Kotlinでの各演算の使用方法がわかりやすくなっています。

入力と出力

Kotlinの「入力と出力」とは何か、以下に紹介します。

「入力と出力」の解説

【入力(Input)】
Kotlinでは標準入力からデータを読み取るためにいくつかの方法が提供されています。

最も一般的なのはreadln()関数を使用する方法です。この関数は標準入力から1行のテキストを読み取り、それを文字列として返します。

また、JavaのScannerクラスを使用することも可能で、KotlinのJava互換性を活かしてScannerを使用して入力を読み取ることができます。

import java.util.Scanner

fun main() {
    val scanner = Scanner(System.`in`)
    println("Enter your name:")
    val name = scanner.nextLine()
    println("Hello, $name!")
}

Kotlinではreadln()を使用することで、より簡潔に入力を処理できます。

fun main() {
    println("Enter your name:")
    val name = readln()
    println("Hello, $name!")
}

【出力(Output)】
Kotlinの標準出力はprint()println()関数を使用して行われます。これらの関数はコンソールにデータを表示するために使用されます。

println()は出力の後に改行を追加しますが、print()は改行を追加しません。

fun main() {
    print("Hello, ")
    println("World!") // 改行付き
}

Kotlinでは、これらの関数を使ってさまざまなデータ型を出力することができます。例えば、整数、浮動小数点数、ブール値、文字列などです。

「入力と出力」の使用例

以下に、Kotlinの入力と出力の具体的な使用例を示します。

fun main() {
    // 入力の例
    println("Enter your age:")
    val age = readln().toInt()
    println("You are $age years old.")

    // 複数の入力を一度に処理する例
    println("Enter your first name and last name separated by space:")
    val (firstName, lastName) = readln().split(' ')
    println("Hello, $firstName $lastName!")

    // 出力の例
    val pi = 3.14159
    println("The value of pi is $pi")

    val isKotlinFun = true
    println("Is Kotlin fun? $isKotlinFun")
}

この例では、ユーザーから年齢と名前を入力として受け取り、それを出力しています。また、複数の入力を一度に処理する方法や、異なるデータ型を出力する方法も示しています。

import文

Kotlinの「import文」とは何か、以下に紹介します。

「import文」の解説

Kotlinのimport文は、他のパッケージやファイルからクラスや関数などの宣言を現在のファイルに取り込むために使用されます。これにより、完全修飾名を使わずに宣言にアクセスできるようになります。

【基本的なimport文】
特定のクラスや関数をインポートするためには、以下のようにimport文を使用します。

import org.example.Message

これにより、org.example.Messageクラスが現在のファイルでMessageとして使用できるようになります。また、ワイルドカード(*)を使用して、特定のパッケージ内のすべてのクラスや関数をインポートすることも可能です。

【デフォルトのimport】
Kotlinファイルでは、いくつかのパッケージがデフォルトでインポートされます。これにはkotlin.*kotlin.collections.*kotlin.io.*などが含まれます。

「import文」の使用例

以下に、import文の具体的な使用例を示します。

// 個々のクラスをインポート
import java.util.Date

// パッケージ全体をインポート
import kotlin.collections.*

// エイリアスを使用してインポート
import kotlin.io.println as kPrint

fun main() {
    val currentDate = Date()
    println("Current date: $currentDate") // java.util.Dateを使用

    val list = listOf("one", "two", "three")
    kPrint("List: $list") // kotlin.io.printlnをエイリアスとして使用
}

この例では、java.util.Dateをインポートし、Kotlinのコレクション全体をインポートしています。また、kotlin.io.println関数をkPrintという名前でインポートして使用しています。

配列

Kotlinの「配列」とは何か、以下に紹介します。

「配列」の解説

Kotlinの配列は、固定サイズの同じ型の要素を保持するデータ構造です。配列はArrayクラスを使用して作成され、arrayOf関数やコンストラクタを使って初期化できます。配列の各要素にはインデックスを使用してアクセスします。

【作成方法】
arrayOf関数を使用: val numbers = arrayOf(1, 2, 3, 4, 5)
・サイズと初期化関数を指定するコンストラクタを使用: val asc = Array(5) { i -> (i * i).toString() }

【プリミティブ型配列】
・Kotlinでは、プリミティブ型の配列も提供されています。
例えば、IntArrayDoubleArrayCharArrayなどです。これにより、パフォーマンスの最適化が図れます。

【要素のアクセスと変更】
・ インデックスを使用して配列の要素にアクセスし、変更することができます。numbers[0] = 10のように書きます。

【多次元配列】
・Kotlinでは、多次元配列もサポートしています。例えば、2次元配列はArray(2) { Array(2) { 0 } }のように作成します。

「配列」の使用例

以下に、Kotlinの配列の具体的な使用例を示します。

fun main() {
    // 単純な配列の作成と初期化
    val numbers = arrayOf(1, 2, 3, 4, 5)
    println("Numbers: ${numbers.joinToString()}") // 出力: Numbers: 1, 2, 3, 4, 5

    // 要素へのアクセスと変更
    numbers[0] = 10
    println("Modified Numbers: ${numbers.joinToString()}") // 出力: Modified Numbers: 10, 2, 3, 4, 5

    // プリミティブ型配列の作成
    val intArray = IntArray(5) { it * 2 }
    println("IntArray: ${intArray.joinToString()}") // 出力: IntArray: 0, 2, 4, 6, 8

    // 多次元配列の作成
    val matrix = Array(3) { Array(3) { 0 } }
    matrix[0][0] = 1
    println("Matrix: ${matrix.contentDeepToString()}") // 出力: Matrix: [[1, 0, 0], [0, 0, 0], [0, 0, 0]]

    // 配列の比較
    val anotherArray = arrayOf(1, 2, 3)
    println("Arrays equal: ${numbers.contentEquals(anotherArray)}") // 出力: Arrays equal: false

    // 配列の変換
    val list = numbers.toList()
    println("List from Array: $list") // 出力: List from Array: [10, 2, 3, 4, 5]
}

この例では、Kotlinの配列の作成、要素のアクセスと変更、プリミティブ型配列、多次元配列、配列の比較、配列からリストへの変換を示しています。

分岐処理(if、if~else、when)

Kotlinの「分岐処理(if、if~else、when)」とは何か、以下に紹介します。

「分岐処理(if文)」の解説

if文は、与えられた条件が真(true)である場合に特定のコードブロックを実行するための基本的な分岐処理です。

if文は式としても使うことができ、値を返すことが可能です。これは、他のプログラミング言語では一般的でない特徴です 。

「分岐処理(if文)」の使用例

以下に、if文の具体的な使用例を示します。

fun main() {
    val number = 10

    // 条件が真の場合に実行されるコードブロック
    if (number > 5) {
        println("Number is greater than 5")
    }

    // if文を式として使用する
    val result = if (number > 5) "Greater" else "Smaller or equal"
    println("Result: $result")
}

この例では、numberが5より大きいかどうかをチェックし、条件に応じてメッセージを出力しています。また、if文を式として使用して、条件に基づいて文字列を返しています 。

「分岐処理(if~else文)」の解説

if~else文は、条件が偽(false)の場合に別のコードブロックを実行するために使用されます。

この文も式として使用することができ、条件に基づいて異なる値を返します 。

「分岐処理(if~else文)」の使用例

以下に、if~else文の具体的な使用例を示します。

fun main() {
    val score = 85

    // 条件が偽の場合に実行されるコードブロック
    if (score >= 90) {
        println("Excellent")
    } else {
        println("Good")
    }

    // if-else文を式として使用する
    val grade = if (score >= 90) "A" else "B"
    println("Grade: $grade")
}

この例では、scoreが90以上かどうかをチェックし、条件に応じて異なるメッセージを出力しています。

また、if-else文を式として使用して、条件に基づいて評価を返しています 。

「分岐処理(when文)」の解説

when文は、複数の条件に基づいて異なるコードブロックを選択するための柔軟な分岐処理です。

JAVAのswitch文に似ていますが、より強力で表現力があります。when文も式として使用でき、最初にマッチするブランチの値を返します 。

「分岐処理(when文)」の使用例

以下に、when文の具体的な使用例を示します。

fun main() {
    val day = 3

    // when文を使用した分岐処理
    when (day) {
        1 -> println("Monday")
        2 -> println("Tuesday")
        3 -> println("Wednesday")
        else -> println("Other day")
    }

    // when文を式として使用する
    val dayName = when (day) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        else -> "Other day"
    }
    println("Day name: $dayName")
}

この例では、dayの値に基づいて異なるメッセージを出力しています。また、when文を式として使用して、条件に基づいて曜日名を返しています 。

繰り返し処理(for、while、do~while)

Kotlinの「繰り返し処理(for、while、do~while)」とは何か、以下に紹介します。

「繰り返し処理(for文)」の解説

for文は、コレクションや範囲の要素を一つずつ取り出して処理するために使用されます。

Kotlinのfor文は、Javaや他の多くの言語とは異なり、インデックスを使った古典的なforループよりも、反復可能なオブジェクトを直接扱うのが一般的です。

基本的な構文は以下の通りです。

for (item in collection) {
    // itemを使った処理
}

ここで、collectionはリスト、配列、範囲などの反復可能なオブジェクトです。また、itemは現在のループの反復ごとにcollectionから取り出された要素を表します。

「繰り返し処理(for文)」の使用例

以下は、リスト内の各要素を出力するfor文の例です。

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    for (number in numbers) {
        println(number)
    }
}

範囲(range)を使った例もあります。

fun main() {
    for (i in 1..5) {
        println(i)
    }
}

配列を使用する場合も同様です。

fun main() {
    val names = arrayOf("Alice", "Bob", "Charlie")
    for (name in names) {
        println(name)
    }
}

「繰り返し処理(while文)」の解説

while文は、指定した条件が真(true)である限り、ブロック内のコードを繰り返し実行します。条件がfalseになると、ループを終了します。

基本的な構文は以下の通りです。

while (条件) {
    // 繰り返し実行する処理
}

条件はループの先頭で評価されるため、条件が最初からfalseの場合、ブロック内のコードは一度も実行されません。

while文の使用時の注意点

  • 無限ループに注意すること:条件が常に真である場合、ループは無限に続きます。
  • 変数の更新を忘れないこと:ループ内で条件を変えるための変数を適切に更新する必要があります。

「繰り返し処理(while文)」の使用例

以下は、カウンタを使って0から4までの数値を出力するwhile文の例です。

fun main() {
    var i = 0
    while (i < 5) {
        println(i)
        i++
    }
}

「繰り返し処理(do~while文)」の解説

do-while文は、まずブロック内のコードを1回実行し、その後条件を評価します。条件が真であれば、ブロックを繰り返し実行します。この構文により、ブロック内の処理が必ず1回は実行されることが保証されます。

基本的な構文は以下の通りです。

do {
    // 繰り返し実行する処理
} while (条件)

while文との違い

  • do-while文は、少なくとも一度はブロック内のコードが実行される点が特徴です。
  • while文は条件が先に評価されるため、条件が最初からfalseの場合、ブロック内のコードは一度も実行されません。

「繰り返し処理(do~while文)」の使用例

以下は、カウンタを使って0から4までの数値を出力するdo-while文の例です。

fun main() {
    var i = 0
    do {
        println(i)
        i++
    } while (i < 5)
}

Null安全

Kotlinは、Null参照を避けるために設計された「Null安全」機能を提供します。これは、プログラム中にNull参照例外(NullPointerException)が発生するリスクを最小限に抑えるためのものです。

Null安全の概念を理解し、適切に利用することで、より堅牢で安全なコードを書くことができます。

「Null安全」の解説

Null安全の概要

Kotlinでは、変数にNullを許容するかどうかを明示的に指定します。これは、型に「?」を付けることで表現されます。

たとえば、String型の変数にはNullを代入できませんが、String?型の変数にはNullを代入できます。

var nonNullableString: String = "Hello" // Nullを許容しない変数
var nullableString: String? = "Hello"  // Nullを許容する変数
nullableString = null // これは許容される

安全呼び出し演算子(?.)

安全呼び出し演算子(?.)を使用することで、変数がNullでない場合にのみそのメソッドやプロパティにアクセスできます。

もし変数がNullであれば、その呼び出し全体がNullを返します。

val length = nullableString?.length // nullableStringがNullでない場合にlengthプロパティにアクセス

Elvis演算子(?:)

Elvis演算子(?:)を使用することで、Nullである場合にデフォルト値を返すことができます。

val length = nullableString?.length ?: 0 // nullableStringがNullの場合は0を返す

非Nullアサーション(!!)

非Nullアサーション(!!)を使用すると、変数がNullでないことを保証します。ただし、変数が実際にNullである場合、NullPointerExceptionが発生します。

val length = nullableString!!.length // nullableStringがNullでないことを保証

「Null安全」の使用例とその解説

使用例1: 安全呼び出し演算子を使った例

以下は、安全呼び出し演算子(?.)を使った例です。nullableStringがNullでない場合にのみlengthプロパティにアクセスします。

fun main() {
    var nullableString: String? = "Hello, Kotlin"
    // 安全呼び出し演算子を使って文字列の長さを取得
    println(nullableString?.length) // 出力: 13

    nullableString = null
    // nullableStringがNullなので、lengthプロパティにアクセスせずNullを返す
    println(nullableString?.length) // 出力: null
}

使用例2: Elvis演算子を使った例

次に、Elvis演算子(?:)を使って、Nullの場合にデフォルト値を返す例です。

fun main() {
    var nullableString: String? = "Hello, Kotlin"
    // nullableStringがNullでない場合はその長さを、Nullの場合は0を返す
    val length = nullableString?.length ?: 0
    println(length) // 出力: 13

    nullableString = null
    // nullableStringがNullなので、0を返す
    val lengthWhenNull = nullableString?.length ?: 0
    println(lengthWhenNull) // 出力: 0
}

使用例3: 非Nullアサーションを使った例

最後に、非Nullアサーション(!!)を使って、変数がNullでないことを保証する例です。ただし、変数が実際にNullである場合、例外が発生することに注意してください。

fun main() {
    var nullableString: String? = "Hello, Kotlin"
    // 非Nullアサーションを使って文字列の長さを取得
    println(nullableString!!.length) // 出力: 13

    nullableString = null
    // nullableStringがNullのため、NullPointerExceptionが発生
    try {
        println(nullableString!!.length)
    } catch (e: NullPointerException) {
        println("Caught NullPointerException") // 出力: Caught NullPointerException
    }
}

スマートキャスト

Kotlinの「スマートキャスト」とは、条件によって型チェックを行い、自動的に安全なキャストを行う機能のことです。

この機能により、手動でキャストを行う必要が減り、コードが簡潔かつ安全になります。

「スマートキャスト」の解説

スマートキャストの概要

スマートキャストは、Kotlinコンパイラが条件分岐による型チェックを認識し、その結果を基に安全に型を変換する機能です。これにより、明示的なキャスト(asキーワードなど)を使用せずに、条件に基づいて型が自動的にキャストされます。

例えば、ある変数が特定の型であるかを確認した後、その変数をその型として扱うことができます。これにより、コードの安全性が高まり、キャストに関するエラーが減少します。

スマートキャストの仕組み

スマートキャストは主にisキーワード(Javaのinstanceofに相当)を使用して行われます。

条件分岐内で型チェックを行った場合、その後のブロック内では自動的にキャストが適用されます。

if (obj is String) {
    // objはString型として扱われる
    println(obj.length)
}

この例では、objString型であることが確認されると、objString型としてスマートキャストされ、その後の処理でStringのメソッドやプロパティにアクセスできます。

「スマートキャスト」の使用例とその解説

使用例1: スマートキャストによる文字列処理

以下の例では、Any型のオブジェクトを受け取り、それがString型である場合にスマートキャストを利用して文字列の長さを取得しています。

fun printStringLength(obj: Any) {
    if (obj is String) {
        // objがString型にスマートキャストされる
        println("String length: ${obj.length}") // 文字列の長さを出力
    } else {
        println("Not a String")
    }
}

fun main() {
    val sampleText = "Kotlin"
    printStringLength(sampleText) // 出力: String length: 6
    printStringLength(123)        // 出力: Not a String
}

この例では、objString型であることを確認した後、そのままString型としてlengthプロパティにアクセスしています。

使用例2: when式でのスマートキャスト

when式でもスマートキャストは有効に機能します。以下の例では、when式を使ってさまざまな型に対して異なる処理を行っています。

fun handleInput(input: Any) {
    when (input) {
        is String -> println("String with length: ${input.length}") // String型としてスマートキャスト
        is Int -> println("Integer with value: $input")             // Int型としてスマートキャスト
        is Double -> println("Double with value: $input")           // Double型としてスマートキャスト
        else -> println("Unknown type")
    }
}

fun main() {
    handleInput("Hello")  // 出力: String with length: 5
    handleInput(42)       // 出力: Integer with value: 42
    handleInput(3.14)     // 出力: Double with value: 3.14
    handleInput(true)     // 出力: Unknown type
}

この例では、when式の各分岐内で型チェックを行い、それに応じた処理を行っています。各分岐内では、inputが対応する型にスマートキャストされます。

使用例3: 安全なキャストとスマートキャストの併用

安全なキャスト(as?)とスマートキャストを組み合わせることで、さらに柔軟なコードを書くことができます。

fun printIfString(obj: Any) {
    val str = obj as? String
    if (str != null) {
        // strがString型にスマートキャストされる
        println("String value: $str, length: ${str.length}")
    } else {
        println("Not a String")
    }
}

fun main() {
    printIfString("Kotlin") // 出力: String value: Kotlin, length: 6
    printIfString(123)      // 出力: Not a String
}

この例では、安全なキャストを行い、nullでないことを確認した後、スマートキャストを利用して文字列の長さを取得しています。

問題集Top 用語集2>>

この記事への意見・コメント

この用語集を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。またKotlinの公式サイトの情報も並行して活用しましょう。