
こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、KotlinでのAnyクラスと3つの関数について解説するピヨ!
この第26章では、プログラミング言語であるKotlinのAnyクラスと3つの関数について、一緒に勉強していきましょう。
この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのAnyクラスについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。
※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。
【Kotlin】Anyクラスとは?
クラスについては、これまでの章で勉強していきましたね。ではAnyクラスとはなんなんでしょうか?
基底クラスの親
Anyクラスは、簡単に言うと基底クラスの親クラスです。
これまでの章の例で言うと、Rinkoクラスの親(基底クラス)はBirdクラスです。その親のBirdクラスのまた親がAnyクラスになります。
これまでクラスの勉強やコードを記述する上でAnyという記述はどこにもなかったですが、これは自動的にKotlinがAnyクラスを継承してくれていたからです。
Anyの記述は省略できる
これまでの勉強でAnyという記述もなく、自動的にKotlinがAnyクラスを継承してくれているという説明をした通り、Anyという文言は特に記述する必要もなく、記述を省略することができます。
ただしKotlinの全てのクラスは、継承元をたどっていくと必ず「Anyクラス」にたどり着く、全てのクラスの祖先はAnyクラスだということは覚えておきましょう。

Anyクラスは基底クラスの親ピヨ!
【Kotlin】Anyクラス継承の省略後と省略前を比べてみよう
Anyクラスがどういったものか勉強したところで、実際にAnyクラスの継承の記述を見てみましょう。
Anyクラスが省略されているコードと省略されていないコードを見比べて、どう違うのかを確認していきます。
Anyクラスの省略後のコードを見てみよう
まずはAnyクラスが省略されている、今まで勉強してきて見慣れているコードを見ていきます。
サンプルコード
以下がAnyクラスの記述が省略されている状態のサンプルコードです。
fun main() { val bird = Bird("緑") bird.fly() } open class Bird(val color: String){ open fun fly(){ println("${color}の鳥が飛んでいるピヨ!") } }
出力
サンプルコードを実行すると、以下のように出力されます。
緑の鳥が飛んでいるピヨ!
Anyクラスの省略前のコードを見てみよう
続いて、Anyクラスを省略前のコードを見てみましょう。どのような記述をするのでしょうか?
サンプルコード
以下がAnyクラスの記述が省略されていない状態のサンプルコードです。
fun main() { val bird = Bird("緑") bird.fly() } open class Bird(val color: String) : Any() { open fun fly(){ println("${color}の鳥が飛んでいるピヨ!") } }
出力
サンプルコードを実行すると、先程の省略後のコードの出力と同じ結果になりましたね。
緑の鳥が飛んでいるピヨ!
省略後と省略前で、何が違うのでしょうか?
省略前の基底クラスのコードには「 : Any()」の記述があります。これはBirdクラスがAnyクラスを継承していることを意味しています。
ですが省略後のコードでも、BirdクラスがAnyクラスを継承していることには変わりなく、ただ記述が省略されているだけということがわかります。

Anyクラスの記述は省略できるので、特に意識することはないピヨ!
【Kotlin】Anyクラスの3つの関数について
このように記述していてもしていなくても予め定義されているAnyクラスですが、このクラスには3つの関数が実装されています。
open fun toString(): String open operator fun equals(other: Any?): Boolean open fun hashCode(): Int
この3つの関数がAnyクラスに実装されているということは、Kotlinで作成するすべてのクラスにも自動的にこの関数が存在するということになります。
ここからは、この3つの関数について勉強していきます。
「toString関数」について
まず1つ目のtoString関数について勉強していきます。
Anyクラスはすべて文字列化するための「toString関数」を持っていて「println」 で出力する際などに、暗黙的に呼ばれている関数です。
サンプルコード
以下の2つの例の1つ目は暗黙的、2つ目は明示的に「toString関数」を呼び出していますが、どちらも結果は同じになります。
// 暗黙的に「toString関数」を呼び出している val num1: Double = 1.11 println(num1) // 明示的に「toString関数」を呼び出している val num2: Double = 2.22 println(num2.toString())
出力
暗黙的でも明示的でも、どちらも動作は同じで「toString関数」が使われているため、問題なく出力されていることがわかります。
1.11 2.22
「equals関数」について
続いて、2つ目のequals関数について勉強していきます。
equals関数は、比較のための関数です。演算子の「==」を使い比較する際などに暗黙的に呼ばれている関数になります。
サンプルコード
以下の2つの例の1つ目は暗黙的、2つ目は明示的に「equals関数」を呼び出していますが、どちらも結果は同じになります。
// 暗黙的に「equals関数」を呼び出している val greetings1 = "リンコです!" val greetings2 = "リンコです!" if(greetings1 == greetings2) { println("どちらも同じ「リンコです!」ピヨ!") } else { println("リンコです!じゃないピヨ!") } // 明示的に「equals関数」を呼び出している val greetings3 = "リンコです!" val greetings4 = "リンコです!" if(greetings3.equals(greetings4)) { println("どちらも同じ「リンコです!」ピヨ!") } else { println("リンコです!じゃないピヨ!") }
出力
暗黙的でも明示的でも、どちらも動作は同じで「equals関数」が使われているため、問題なく出力されていることがわかります。
どちらも同じ「リンコです!」ピヨ! どちらも同じ「リンコです!」ピヨ!
「hashCode関数」について
最後に、3つ目のhashCode関数について勉強していきます。
第14章のSetや第15章で学んだMapという機能を勉強した時に、「ハッシュ」という言葉について軽く勉強したと思います。
そのSetやMapというコレクションにデータを格納する際に、Anyクラスが持つ「hashCode関数」が裏側で呼び出されているのです。
ここについては少し難しいので、ここではKotlinの全てのクラスで「hashCode関数」が存在していて、いろいろな場面で使われているという認識だけ持っておきましょう。

Anyクラスには3つの関数が実装されていることは簡単に覚えるピヨ!
まとめ
この記事では、プログラミング言語であるKotlinのAnyクラスと3つの関数について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。
- Anyクラスは基底クラスの親で、省略できるので特に記述する必要はない
- Anyクラスには3つの関数が実装されている
- printlnで出力する際などに暗黙的に呼ばれる文字列化のための「toString関数」
- ==で比較する際などに暗黙的に呼ばれる比較のための「equals関数」
- コレクションにデータを格納する際に呼ばれる「hashCode関数」
今回勉強した「Anyクラスと3つの関数」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

次回の記事では「スマートキャスト」について勉強していくピヨ!
プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!
コメント