0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】Kotlin の拡張関数(Extension Function)徹底解説

Posted at

はじめに

Kotlin の強力な機能のひとつが 「拡張関数(extension function)」
既存のクラスを継承せずに 新しいメソッドを追加できる 機能です。

Android / Kotlin 開発で頻出する構文で、
標準ライブラリや Jetpack(Compose, Coroutine, Flow)でも頻繁に使われています。


拡張関数とは?

「あるクラスに、新しい関数を“後付け”する」 仕組みです。
既存クラスを変更・継承せずにメソッドを追加できます。


基本構文

fun String.addBrackets(): String {
    return "[$this]"
}

fun main() {
    val name = "Anna"
    println(name.addBrackets()) // → [Anna]
}

fun <ReceiverType>.<FunctionName>() の形式で定義します。
この場合 String がレシーバー型です。


レシーバー(Receiver)とは?

拡張関数は「レシーバーオブジェクト」に対して呼び出されます。
この this は「拡張されるクラス自身」を指します。

fun Int.double(): Int {
    return this * 2
}

println(5.double()) // → 10

ここで thisInt 型の 5 を指しています。


拡張関数の内部的な仕組み

拡張関数は 実際には静的関数(static function) です。
コンパイル時には次のようなコードに変換されます:

fun double(num: Int): Int = num * 2

つまり、「見た目はメソッド呼び出し」ですが、内部的にはただのトップレベル関数です。
➡️ 継承やオーバーライドはできません。


実用例:文字列処理をシンプルに

fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

println("hello@example.com".isEmail()) // true
println("invalid_email".isEmail()) // false

→ String 型にメール判定を追加。
業務ロジックでの「再利用」や「可読性」向上に最適です。


Android 開発での使用例

View の拡張関数

fun View.visible() {
    this.visibility = View.VISIBLE
}

fun View.gone() {
    this.visibility = View.GONE
}

// 使い方
button.visible()
progressBar.gone()

→ View の状態切り替えを直感的に記述可能。


Context の拡張関数

fun Context.toast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

// 使い方
context.toast("保存しました!")

Android プロジェクトではよく見かけるパターンです。
ActivityFragment に共通機能を簡潔に追加できます。


Null 安全との組み合わせ

拡張関数は nullable 型にも定義可能 です:

fun String?.isNullOrEmptySafe(): Boolean {
    return this == null || this.isEmpty()
}

val name: String? = null
println(name.isNullOrEmptySafe()) // → true

null チェックを忘れずに安全に書けます。


拡張プロパティ(Extension Property)

関数だけでなく「プロパティ」も拡張できます:

val String.firstChar: Char
    get() = this.first()

println("Kotlin".firstChar) // → K

ただし、拡張プロパティは 状態を保持できません(getter のみ)。


高度な使い方:ジェネリクスとラムダの組み合わせ

inline fun <T> T.applyIf(condition: Boolean, block: T.() -> Unit): T {
    if (condition) block()
    return this
}

val list = mutableListOf<Int>()
    .applyIf(true) { add(10) }
    .applyIf(false) { add(20) }

println(list) // → [10]

applyIf() のように条件付きで apply を呼ぶことも可能。
Kotlin 標準関数と同様の表現力を自作できます。


まとめ

ポイント 説明
定義構文 fun ReceiverType.functionName()
this の意味 拡張先オブジェクトを指す
継承・override 不可(静的解決)
用途 文字列処理・View操作・ユーティリティ関数など
nullable対応 String? のように安全に拡張可能
プロパティ拡張 val T.propertyName get() = ...

拡張関数は、Kotlin コードを「より自然な言葉」に近づけるための強力な構文です。
再利用性・可読性・安全性のすべてを高めてくれます。

もしプロジェクトで 「同じ型に対して似た処理を何度も書いている」 なら、
それは拡張関数にするチャンスです。


参考

  • Kotlin Official Docs – Extension Functions
  • Android Developers: Kotlin extensions

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?