変数
Kotlinでは、変数の宣言においてイミュータブル(不変)とミュータブル(可変)の2種類のキーワードを使い分けます。これにより、安全かつ意図が明確なコードを書くことが可能になります。
val:再代入できない変数の宣言
fun main(){
val age:Int = 20
}
・valは、一度値を代入したら再代入できない変数です。
・valは、宣言時に必ず初期化が必要です。
・安全性が高いため、Kotlinでは基本的にvalの使用が推奨されます。
・Javaでいうfinalのような働きをします。
ただし、valで宣言したオブジェクトがミュータブル(可変)な場合は、その中身を変更することは可能です。
var:再代入可能な変数の宣言
fun main(){
var age:Int = 30
age = 31 //再代入可能:OK
}
・varは、値の再代入が必要なときに使います。
・状態が変わるようなデータにはこちらを使うのが適切です。
変数の名前(命名規則)
val userName:String = "Alice" // ✅ OK: 一般的なcamelCase
val totalCount:Int = 42 // ✅ OK: 複数単語もcamelCaseで表現
val `fun`:String = "Reserved" // ✅ OK: バッククォートで囲めば予約語も使える(非推奨)
val _internalId:Int = 123 // ✅ OK: アンダースコアで始まる名前は許容される(非推奨)
val $debugFlag:Boolean = true // ✅ OK: `$`も使えるが一般的ではない(避けるのが無難)
val camelCaseName:String = "Taro" // ✅ OK: KotlinではcamelCaseが標準
// val 1stUser:String = "Bob" // ❌ NG: 数字で始めることはできない
// val fun:String = "Reserved" // ❌ NG: Kotlinの予約語(キーワード)は使用不可
// val PascalCaseName:String = "NG" // ❌ NG: PascalCaseはクラス名やオブジェクト名に使う
・アルファベット(a~z、A~Z)、数字(0~9)、アンダースコア(_)、ドル記号($)を使用できます。
・小文字から始めるキャメルケース(例:userName, totalCount)が一般的な命名スタイルです。
・数字で始める名前は使用できません(例:1stUser はエラーになります)。
・予約語のキーワード(val, class, fun など)は変数名に使えません。ただし、どうしても使いたい場合は バッククォート(`)で囲むと回避可能です(例:val `class` = "value")。
変数の初期化
変数の初期化とは、変数を宣言すると同時に初期値を代入することです。Kotlinでは val(再代入不可)または var(再代入可)と型を組み合わせて宣言し、値を与えます。
val age1: Int = 20 // valは再代入できない
val name1: String = "あいうえお"
var age2: Int = 30 // varは再代入できる
var name2: String = "かきくけこ"
・val:一度初期化すると再代入できません(不変)
・var:後から値を変更できます(可変)
このように、意図に応じてvalとvarを使い分けることが、Kotlinで安全なコードを書く第一歩です。
定数
Kotlinでは、変数の値が絶対に変わらないことが確定している場合、const valを使って定数を宣言します。これにより、プログラム内でその値が変更されることはありません。
const val PI: Double = 3.14159 // 円周率
const val MAX_USERS: Int = 100 // 最大ユーザー数
・定数名は すべて大文字 で記述し、複数の単語はアンダースコア( _ )で区切るのが一般的です。
・const val は クラスや関数の外側(トップレベル)またはオブジェクト(object)内で宣言します。
・通常のクラスのプロパティや、関数の中などのローカル変数としては使えません。
const valとvalの違いについて
const val MAX_USERS: Int = 100 // ✅ コンパイル時定数(変更不可)
fun main() {
val currentUsers: Int = 100 // ✅ 実行時に代入されるが、再代入不可
// currentUsers = 200 → ❌ エラー(再代入できない)
}
・const val は 完全な定数(ビルド時に確定)で、関数やオブジェクトから値を受け取ることはできません。
・val は 一度しか代入できないが、定数ではない ため、関数の戻り値や条件に応じた値を保持する場面に適しています。
データ型
Kotlinでは、変数が扱うデータの「種類」に応じて適切なデータ型を指定する必要があります。型は、メモリの使い方や演算の方法を決定する重要な情報です。
代表的な9種類のデータ型
分類 | 型名 | 格納するデータ | 変数宣言の例 |
---|---|---|---|
整数 | Byte | とても小さな整数 | val glasses : Byte |
整数 | Short | 小さな整数 | val age : Short |
整数 | Int | 普通の整数 | val salary : Int |
整数 | Long | 大きな整数 | val worldPeople : Long |
少数 | Float | 少しあいまいでもよい少数 | val weight : Float |
少数 | Double | 普通の少数 | val pi : Double |
真偽値 | Boolean | trueかfalse | val isError : Boolean |
文字 | Char | 1つの文字 | val initial : Char |
文字列 | String | 文字の並び | val name : String |
Kotlinの基本データ型は大きく9種類に分類され、それぞれが格納する値の性質に応じて使い分けられます。
これらの型は、メモリ効率や処理速度、精度に影響するため、用途に応じて選択することが重要です。
Byte型、Short型、Int型、Long型
val glasses:Byte = 2
val age:Short = 18
val salary:Int = 152000
val worldPeople:Long = 6900000000L
整数を扱うデータ型には Byte・Short・Int・Long の4種類があります。主に使われるのは Int ですが、大きな数値を扱う場合は Long を、データ容量を抑えたい場合は Byte や Short を使います。
Float型、Double型
val weight:Float = 67.5F
val height:Double = 171.2
Kotlinでは、少数を扱う型として Float(単精度)と Double(倍精度)があります。より高い精度を必要とする計算には Double を使用します。
Boolean型
val isError:Boolean = true
val result :Boolean = false
Boolean 型は、真(true)または偽(false)の2つの値をとります。条件分岐やフラグ制御に頻繁に使われます。
Char型、String型
val zodiac:Char = '辰'
val name :String = "あいうえお"
文字は Char 型で、1文字をシングルクォート ' ' で囲んで表します。文字列は String 型で、複数文字をダブルクォート " " で囲みます。
特殊なデータ型
Kotlinでは、Javaにはない独自の型も用意されています。以下の型は、関数や汎用プログラミングで特に重要です。
Unit型
fun greet(name: String): Unit {
println("Hello, $name!")
}
fun main(){
greet("あいうえお")
}
Hello,あいうえお
・Unit は「戻り値が存在しない関数」の戻り値の型です。
・Javaでいう void に相当しますが、KotlinではUnitもれっきとした値型であり、型として扱えます。
・省略可能:Unit は書かなくても自動で補完されます。
Any型
fun printAny(value: Any) {
println(value)
}
・Any は すべてのクラスの最上位スーパータイプ(共通の親) です。
・Javaの Object に近い概念で、どんな型でも受け取れる関数を作るときに使います。
・ただし null は代入できない(→ nullを許容するには Any? にする必要があります)。
Null許容型とNull非許容型
Kotlinは、NullPointerException(通称NPE) を防ぐために、null安全の仕組みを備えています。
Null非許容型(デフォルト)
val name: String = "Taro"
// name = null → ❌ コンパイルエラー
・Kotlinではデフォルトで変数はnullを許容しません。
・Javaのような「突然のnull」でアプリが落ちる事故を防げます。
Null許容型(Nullable型)
val nickname: String? = null
・型の後ろに ? をつけると、nullの代入を許可できます。
・nullableな変数には、nullチェックが必須になります。
安全呼び出し演算子(?.)
val name: String? = "Taro"
val length = name?.length // → 4
val nullName: String? = null
val nullLength = nullName?.length // → null(エラーにはならない)
・name?.length は name が null でない場合だけ length を呼び出す。
・null の場合は何もせず null を返す(NPEを防止)。
・チェーン呼び出しも可能:user?.profile?.email
エルビス演算子(?:)
val name: String? = null
val displayName = name ?: "Unknown" // → "Unknown"
val input: String? = "Kotlin"
val output = input ?: "default" // → "Kotlin"
・name ?: "Unknown" は、name が null なら "Unknown" を使う。
・if文でnullをチェックするよりも簡潔で読みやすい。
・よく使われる場面:表示名、デフォルト設定、入力補完など。
非null断言演算子(!!)
val name: String? = "Taro"
val length = name!!.length // → 4(成功)
val nullName: String? = null
val nullLength = nullName!!.length // ❌ NullPointerException発生!
・!! は「絶対にnullじゃない」と 開発者が保証して使用する演算子。
・nullだった場合は即クラッシュ(例外発生)。
・原則として使用は避ける(テストや仮実装などの限定的な場面を除く)。
型推論
fun main(){
val age = 40 // Kotlinが自動でInt型と推論
val bigNumber = 40L // Long型と推論される(末尾にLがあるため)
val pi = 3.14 // Double型と推論される(デフォルトの小数型)
val ratio = 3.14f // Float型と推論される(末尾にfがあるため)
val name = "Taro" // String型と推論
val isActive = true // Boolean型と推論
}
・Kotlinは型推論をサポートしているため、明示的に型を書く必要はありません。
・必要に応じて型を明示することも可能です。
・整数リテラルは、特に指定がなければすべて Int 型として推論されます。
・Long 型にしたい場合は、リテラルに L を付ける必要があります。例えば、123L で Long 型になります。
・Byte 型や Short 型は自動推論されないため、必ず明示的に指定する必要があります。例えば、val x: Byte = 123 のように記述します。
・Double 型や Float 型はデフォルトで Double 型として推論されます。もし Float 型にしたい場合は、リテラルに F を付けます(例:123.45F)。
・Kotlinは型安全性を重視しており、異なる数値型間での暗黙的な型変換は行いません。例えば、Int 型の値を Long 型の変数に直接代入することはできません。その場合は、明示的なキャストを行う必要があります。