0Pricing
Kotlin Academy · レッスン

演算子関数

plus、minusなどをオーバーロードします

「演算子関数」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

演算子オーバーロードとは

演算子オーバーロードを使うと、型を + や - のような記号に対応させられます。operator 修飾子と特別な名前を使って関数を定義します。

data class Point(val x: Int, val y: Int) {
    operator fun plus(o: Point) = Point(x + o.x, y + o.y)
}

fun main() {
    println(Point(1, 2) + Point(3, 4))
}

operator キーワード

operator 修飾子は、この関数が演算子を実装することをコンパイラーに伝えます。これがないと、a + b は動作しません。

data class Money(val amount: Int) {
    operator fun plus(o: Money) = Money(amount + o.amount)
}

fun main() {
    println(Money(5) + Money(3))
}

慣例的な名前

各演算子には固定の関数名が対応します。+ は plus、- は minus、* は times、/ は div、% は rem です。

data class Vec(val n: Int) {
    operator fun times(k: Int) = Vec(n * k)
}

fun main() {
    println(Vec(4) * 3)
}

マイナスと乗算

同じ型に複数の演算子を定義できます。

data class Point(val x: Int, val y: Int) {
    operator fun minus(o: Point) = Point(x - o.x, y - o.y)
    operator fun times(k: Int) = Point(x * k, y * k)
}

fun main() {
    println(Point(5, 5) - Point(1, 2))
    println(Point(2, 3) * 2)
}

単項演算子

単項マイナスには unaryMinus、単項プラスには unaryPlus を使用し、not は ! 演算子を実装します。

data class Temp(val c: Int) {
    operator fun unaryMinus() = Temp(-c)
}

fun main() {
    println(-Temp(10))
}

インクリメントとデクリメント

inc は ++ を、dec は -- を実装します。どちらも同じ型の新しい値を返します。

data class Counter(val n: Int) {
    operator fun inc() = Counter(n + 1)
}

fun main() {
    var c = Counter(0)
    c++
    println(c.n)
}

複合代入

plusAssign は可変レシーバーに対する += を実装します。plus しかない場合、+= は代わりに変数へ再代入します。

class Bag {
    val items = mutableListOf<String>()
    operator fun plusAssign(item: String) { items.add(item) }
}

fun main() {
    val bag = Bag()
    bag += "apple"
    println(bag.items)
}

異なる型を使う演算子

パラメーター型はレシーバー型と一致していなくても構いません。ここでは、点を Int 倍すると点が返されます。

data class Size(val w: Int, val h: Int) {
    operator fun times(factor: Int) = Size(w * factor, h * factor)
}

fun main() {
    println(Size(2, 3) * 4)
}

拡張関数としての演算子

自分が所有していない型に対しても、演算子を拡張関数として定義できます。

data class Point(val x: Int, val y: Int)

operator fun Point.plus(o: Point) = Point(x + o.x, y + o.y)

fun main() {
    println(Point(1, 1) + Point(2, 2))
}

演算子の連鎖

オーバーロードした演算子は組み込み演算子と同じように組み合わせて使え、通常の優先順位に従います。

data class N(val v: Int) {
    operator fun plus(o: N) = N(v + o.v)
    operator fun times(o: N) = N(v * o.v)
}

fun main() {
    val r = N(2) + N(3) * N(4)
    println(r.v)
}

戻り値の型は自由

演算子は任意の型を返せますが、同じ型を返すと直感的に使いやすく、連鎖もしやすくなります。

data class Vec(val x: Int, val y: Int) {
    operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}

fun main() {
    println(Vec(1, 2) + Vec(3, 4))
}

理解度チェック

演算子関数についての理解度を確認してください。

おさらい

演算子関数について学びました。

  • 関数に operator と慣例的な名前(plus、minus、times など)を付けます。
  • 単項演算子、インクリメント、複合代入演算子に対応できます。
  • 演算子はメンバーまたは拡張関数として定義できます。
  • 同じ型を返すと、演算子を直感的に連鎖できます。
data class P(val x: Int) {
    operator fun plus(o: P) = P(x + o.x)
}

fun main() {
    println((P(2) + P(3)).x)
}

よくある質問

「演算子関数」レッスンは無料ですか?

はい。「演算子関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「演算子関数」で何を学びますか?

plus、minusなどをオーバーロードします ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「演算子関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 演算子関数
  2. 比較演算子
  3. インデックスとInvoke
  4. ベストプラクティス
← Kotlin Academyに戻る