Kotlinの変数宣言は、安全性・可読性・バグの予防を重視して設計されています。
Java経験者には一見シンプルに見えますが、「val / var」「null安全」「初期化ルール」など、思想レベルでの違いを理解することが重要です。
以下では 基礎 → 実務で重要な仕様 → 注意点 の順で解説します。
目次
Kotlinの変数宣言の基本構文
Kotlinの変数宣言は、必ず val または var から始まります。
val name: String = "Kotlin"
var age: Int = 25
基本構文は次の通りです。
val / var 変数名: 型 = 初期値
- 型は省略可能(型推論あり)
- 初期値は「使用前に必ず代入」されている必要があります
val と var の正確な違い
val(再代入不可)
val count = 10
// count = 20 // コンパイルエラー
val は 変数への再代入ができません。
これは「値が不変」という意味ではなく、参照が固定されるという意味です。
val list = mutableListOf(1, 2, 3)
list.add(4) // OK(中身は変更可能)
val= 参照の再代入不可- オブジェクト自体のミュータビリティとは別概念
var(再代入可能)
var count = 10
count = 20 // OK
状態が変化する必要がある場合のみ使用します。
実務での基本指針
「原則 val、必要なときだけ var」
これはKotlin開発における標準的な考え方です。
型推論(型を省略できる理由)
Kotlinは強力な型推論を持っています。
val message = "Hello" // String
val number = 100 // Int
val rate = 1.5 // Double
コンパイラが自動的に型を決定します。
型を明示するべき場面
val price: Long = 100
- 数値型を意図的に指定したいとき
- APIや公開コードで可読性を高めたい場合
- 初期値が
nullの場合(型推論できない)
初期化ルール(ローカル変数とプロパティの違い)
ローカル変数(関数内)
- 使用前に必ず代入されていればOK
valは1回だけ代入可能
val result: Int
result = 10
println(result) // OK
クラスのプロパティ
クラスプロパティは、インスタンス生成までに必ず初期化される必要があります。
- 宣言時に初期化
- コンストラクタで受け取る
initブロックで初期化
lateinit と by lazy(遅延初期化)
lateinit(var専用)
lateinit var userName: String
使用条件
varであること- 非null型であること
- プリミティブ型ではないこと
lateinit var age: Int // NG
by lazy(val専用)
val config by lazy {
loadConfig()
}
- 初回アクセス時に初期化
- スレッドセーフな実装が標準
null安全と変数宣言(Kotlin最大の特徴)
Kotlinでは nullはデフォルトで許可されません。
val text: String = "Hello"
// text = null // エラー
nullを許可する場合
val text: String? = null
? を付けた型のみ null を代入できます。
null安全演算子
安全呼び出し ?.
val length = text?.length
エルビス演算子 ?:
val length = text?.length ?: 0
非null断言 !!(非推奨)
val length = text!!.length
nullの場合は即クラッシュするため、原則使いません。
const val(コンパイル時定数)
const val MAX_COUNT = 100
使用条件
- トップレベル
- object 内
- companion object 内
class Api {
companion object {
const val BASE_URL = "https://example.com"
}
}
- コンパイル時に値が確定できる型のみ使用可能
複数の変数宣言について
Kotlinではセミコロンを使えば同一行に複数文を書けます。
val a = 1; val b = 2
ただし、可読性の観点から分けて書くのが一般的です。
Javaとの違い
| Java | Kotlin |
|---|---|
int a = 10; | val a = 10 |
final int a = 10; | val a = 10 |
String s = null; | ❌ 不可 |
String? s = null | ⭕ |
Kotlinは null安全を言語レベルで強制する点が大きな違いです。
ただし Java 相互運用では null が混入する可能性があるため、実務では防御的な扱いが必要です。
まとめ
valは 再代入不可(参照固定)- 基本は val、状態が変わる場合のみ var
- null は明示的に許可しない限り使えない
lateinit/by lazyは用途が異なる- Kotlinは 事故を減らす設計思想の言語
以上、Kotlinの変数宣言についてでした。
最後までお読みいただき、ありがとうございました。










