はじめに
Android開発を始める際、多くの人が「Kotlinって何?Javaじゃダメなの?」と疑問に思うでしょう。この記事では、Android開発でKotlinを使う理由から、実際のコードまで、初心者にも分かりやすく解説します。
1. なぜAndroid開発でKotlinが推奨されるのか?
Googleの公式サポート
2017年にGoogleがKotlinを正式サポート言語として発表し、2019年にはKotlin First(Kotlinを優先)の方針を打ち出しました。現在、新しいAndroidの機能やライブラリは、Kotlinを前提として設計されています。
Kotlinの具体的なメリット
1. コードの簡潔性
同じ処理でも、Kotlinはより短く書けます。
Java
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
}
Kotlin
data class User(var name: String, var age: Int)
2. Null安全性
Kotlinは言語レベルでNullPointerExceptionを防ぎます。
var text: String = "Hello"
// text = null // コンパイルエラー!
var nullableText: String? = "Hello"
nullableText = null // これはOK
3. Javaとの100%互換性
既存のJavaコードやライブラリをそのまま使えます。
2. Kotlinの基本構文
変数の宣言
val(値が変わらない)
val appName = "My App" // 文字列
val version = 1.0 // 数値(型推論)
val isDebug: Boolean = true // 明示的な型指定
// appName = "New App" // エラー:再代入不可
var(値が変わる)
var counter = 0
counter = 1 // OK:再代入可能
counter += 1 // OK:現在の値は2
使い分けのコツ:基本はval
を使い、値を変更する必要がある時だけvar
を使いましょう。
基本的なデータ型
val number: Int = 42 // 整数
val price: Double = 99.99 // 小数
val message: String = "Hello" // 文字列
val isValid: Boolean = true // 真偽値
文字列テンプレート
文字列の中に変数を埋め込めます。
val name = "太郎"
val age = 25
val introduction = "私の名前は${name}、${age}歳です。"
// または簡潔に
val greeting = "こんにちは、$nameさん!"
関数の定義
基本的な関数
fun greet(name: String): String {
return "こんにちは、${name}さん!"
}
// 使用例
val message = greet("花子")
戻り値がない関数
fun printUserInfo(name: String, age: Int) {
println("名前: $name, 年齢: $age")
}
単一式関数(簡潔な書き方)
fun add(a: Int, b: Int): Int = a + b
// 型推論を使ってさらに簡潔に
fun multiply(a: Int, b: Int) = a * b
デフォルト引数
fun createUser(name: String, age: Int = 20, city: String = "東京") {
println("名前: $name, 年齢: $age, 都市: $city")
}
// 使用例
createUser("太郎") // 年齢とcityはデフォルト値
createUser("花子", 25) // cityはデフォルト値
createUser("次郎", city = "大阪") // 名前付き引数
Null安全性の実践
Safe Call演算子(?.)
val text: String? = "Hello"
// 従来の書き方(Javaライク)
if (text != null) {
println(text.length)
}
// Kotlinの書き方
println(text?.length) // textがnullなら何もしない
Elvis演算子(?:)
val name: String? = null
val displayName = name ?: "名無し" // nameがnullなら"名無し"を使用
println(displayName) // "名無し"が出力される
コレクション(リスト、マップ)
リスト
// 変更不可能なリスト
val fruits = listOf("りんご", "バナナ", "オレンジ")
// 変更可能なリスト
val mutableFruits = mutableListOf("りんご", "バナナ")
mutableFruits.add("オレンジ")
// 要素へのアクセス
println(fruits[0]) // "りんご"
println(fruits.first()) // "りんご"
マップ
val userAges = mapOf(
"太郎" to 25,
"花子" to 30,
"次郎" to 22
)
println(userAges["太郎"]) // 25
制御構文
when式(Javaのswitchより強力)
fun getGrade(score: Int): String {
return when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
in 60..69 -> "D"
else -> "F"
}
}
// 使用例
println(getGrade(85)) // "B"
forループ
val numbers = listOf(1, 2, 3, 4, 5)
// 要素をそのまま取得
for (number in numbers) {
println(number)
}
// インデックスと要素を取得
for ((index, number) in numbers.withIndex()) {
println("$index: $number")
}
// 範囲を使ったループ
for (i in 1..5) {
println(i) // 1, 2, 3, 4, 5
}
3. Android開発でよく使うKotlinの機能
データクラス
プロパティだけを持つシンプルなクラスに最適です。
data class User(
val name: String,
val age: Int,
val email: String
)
// 自動で以下が生成される:
// - toString()
// - equals()
// - hashCode()
// - copy()
val user1 = User("太郎", 25, "taro@example.com")
val user2 = user1.copy(age = 26) // 一部だけ変更した新しいインスタンス
拡張関数
既存のクラスに新しい機能を追加できます。
// String型に新しい関数を追加
fun String.isValidEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
// 使用例
val email = "test@example.com"
if (email.isValidEmail()) {
println("有効なメールアドレスです")
}
ラムダ式
関数を変数のように扱えます。
val numbers = listOf(1, 2, 3, 4, 5)
// 偶数のみフィルタリング
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // [2, 4]
// 各要素を2倍にする
val doubled = numbers.map { it * 2 }
println(doubled) // [2, 4, 6, 8, 10]
4. Javaとの主な違い(Java経験者向け)
項目 | Java | Kotlin | 備考 |
---|---|---|---|
変数宣言 | int count = 0; |
var count = 0 |
セミコロン不要、型推論 |
定数 | final int MAX = 100; |
val MAX = 100 |
より簡潔 |
null許容 | すべての参照型 | String? |
明示的に指定 |
文字列結合 | "Hello " + name |
"Hello $name" |
文字列テンプレート |
インスタンス生成 | new User() |
User() |
newキーワード不要 |
getter/setter | 手動実装 | 自動生成 | プロパティアクセス |
5. 実践:簡単なAndroidアプリでの使用例
// ユーザー情報を管理するクラス
data class User(
val name: String,
val age: Int,
val email: String? // メールアドレスは任意(null許容)
)
class UserManager {
private val users = mutableListOf<User>()
fun addUser(name: String, age: Int, email: String? = null) {
val user = User(name, age, email)
users.add(user)
println("ユーザー追加: ${user.name}")
}
fun findAdults(): List<User> {
return users.filter { it.age >= 18 }
}
fun getUserSummary(user: User): String {
val emailInfo = user.email ?: "未設定"
return "名前: ${user.name}, 年齢: ${user.age}, メール: $emailInfo"
}
}
// 使用例
val manager = UserManager()
manager.addUser("太郎", 25, "taro@example.com")
manager.addUser("花子", 17) // メールアドレス未設定
val adults = manager.findAdults()
adults.forEach { user ->
println(manager.getUserSummary(user))
}
6. 学習のコツと次のステップ
効果的な学習方法
-
まずは
val
とvar
の使い分けから始める - null安全性を意識してコードを書く
- Kotlin Playgroundで実際にコードを試す
- Android Studioでサンプルプロジェクトを作成する
よくある初心者の間違い
// ❌ よくない例
var name: String? = "太郎"
if (name != null) {
println(name.length)
}
// ✅ Kotlinらしい書き方
val name: String? = "太郎"
name?.let { println(it.length) }
// または
println(name?.length)
推奨リソース
7. まとめ
今回学んだKotlinの基礎知識:
重要なポイント
-
変数宣言:
val
(不変)とvar
(可変)の使い分け -
Null安全性:
?
を使った明示的なnull許容型 -
関数定義:
fun
キーワードと簡潔な構文 -
制御構文:
when
式や拡張されたforループ - 実用的な機能: データクラス、拡張関数、ラムダ式
なぜKotlinを学ぶべきか
- 生産性向上: より少ないコードで同じ機能を実現
- 安全性: コンパイル時にエラーを検出
- 将来性: Googleが推進する現代的な言語
これらの基礎知識があれば、Android開発の実践的な部分に進む準備が整いました。次回は、これらのKotlin構文を使って、実際にシンプルなAndroidアプリを作成してみましょう。
この記事が役に立ったらいいね👍やストックをお願いします。
次回予告: 「第5回:初めてのAndroidアプリ作成 - Hello WorldからUI操作まで」では、今回学んだKotlinの知識を活用して、実際に動作するアプリを作成します。