Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Kotlin入門】⑥継承・例外処理


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210627142712p:plain

おはようございます。Shotaです。

今日はKotlin文法の「継承」と「例外処理」について解説します。



継承

継承はすでにあるクラスの仕組みを別のクラスから再利用するための仕組みです。Kotlinの親クラスはAnyなので、全てのクラスにAnyが継承されています。Anyにはequals()hashCode()toString()などが定義されています。

public open class Any {
    public open operator fun equals(other: Any?): Boolean

    public open fun hashCode(): Int

    public open fun toString(): String
}

継承するクラスにはopenを書きます。classにはデフォルトでfinalが定義されているので継承できないように設計されているからです。また、継承先では:を使って継承クラスを指定しクラスを宣言します。

class Kotlin

fun main() {
    val kotlin = Kotlin()
    println(kotlin.toString()) //アドレスが表示される
}

▼実行結果

Kotlin@54bedef2

下のプログラムはClass1のクラスを継承したClass2クラスを実装したものになります。特定のクラスを継承したクラスのインスタンスを作って実行すると、継承元のクラスと作成したクラスの処理が同時に出力されます。

// 継承
open class Class1 {
    init {
        println("Hello Kotlin")
    }
}

class Class2: Class1() {
    val arg = 10
} 

fun main() {
    val ins = Class2()
    println(ins.arg)
}

▼実行結果

Hello Kotlin
10


オーバーライド

親クラスにメソッドがある場合のオーバーライドについて説明します。クラスがfinalであると同様に、その関数もfinalとなるので関数に対してもopenを指定する必要があります。

関数に対してオーバライドする場合はoverrideを使います。

open class Language {
    open fun hello() {
        println("Hello Language")
    }
}

class Kotlin: Language() {
    override fun hello() {
        println("Hello Kotlin")
    }
}

fun main() {
    val kotlin = Kotlin()
    kotlin.hello()
}

▼実行結果

Hello Kotlin


abstractの利用

また、abstractを用いて抽象化クラスとして宣言できます。クラスだけではなく、関数やプロパティなども抽象化できます。

abstract class Language {
    abstract fun hello()
}

class Kotlin: Language() {
    override fun hello() {
        println("Hello Kotlin")
    }
}

fun main() {
    val kotlin = Kotlin()
    kotlin.hello()
}

▼実行結果

Hello Kotlin


例外処理

プログラミングにおいてエラーを避けることは難しいですが、エラーが発生した時に例外をあえて発生させることで、エラーを停止して例外処理として実行できます。例外を発生させるためにはthrowを利用し、例外を処理するためにはtry-catchを使用します。また、tryは式なので結果を受け取ることができます。

Throwableは全てのエラーもしくは例外の基本的なクラスで、throwあるいはtry-catchThrowableインスタンスを作ります。

実際に例外を発生させていきます。

fun main() {
    throw Exception("exception")
}

▼実行結果

Exception in thread "main" java.lang.Exception: exception

throwを利用して例外が発生し、プログラムを強制的に終了できます。Nothingを返し、到達し得ないのがthrowなのでNothingを利用して表現されています。

では、次のプログラムではどうでしょうか?

fun main() {
    try {
        val num = 9
        println(num / 0)
    } catch(e: Exception) {
        println(e.message)
    }
}

▼実行結果

main.kt:4:17: warning: division by zero
        println(num / 0)
                ^
/ by zero

上記のプログラムは整数を0で割った時に例外が発生してプログラムが強制終了するプログラムです。また、スタックトレースが表示されます。スタックトレースとは例外発生したファイルや行を示し、問題を特定するのに役立ちます。

例外が発生するとプログラムは強制終了するのが通例ですが、上記のプログラムではtry-catchで例外ハンドリングしているので強制終了されず例外のメッセージが表示されます。tryは何かしらの処理を記述し、catchで例外ハンドリングをします。


まとめ

今回の記事では、Kotlinで「継承」や「例外処理」について簡単に解説しました。

今回の記事はこれで終了です。