Kotlinのthis・superキーワードとは?意味と使い分けを初心者向けにわかりやすく解説
生徒
「Kotlinでthisやsuperって出てきたんですが、何に使うんですか?」
先生
「いい質問です。thisは『自分自身』、superは『親クラスの機能』を使うときに使います。具体例を見てみましょう!」
生徒
「親クラスとか、自分自身って、どう区別するんですか?」
先生
「それでは、順番に説明をしていきますね。」
1. thisキーワードとは?自分を指す言葉
thisは、「いま動いている自分自身のインスタンス」を指す特別なキーワードです。Kotlinでは自分のプロパティや関数にアクセスするとき、多くの場合はthisを省略できますが、はっきり示したいときや読みやすさを上げたいときにthisを書きます。初心者の方は「this=このオブジェクト」と覚えると迷いません。
まずは最小の例で、プロパティ参照とメソッド呼び出しの両方を確認してみましょう。
class Person(val name: String) {
fun greet() {
// 自分のプロパティへアクセス(thisは省略可能)
println("こんにちは、" + this.name + "さん!")
// 自分の別メソッドを呼び出す(明示すると読みやすい)
this.showSignature()
}
fun showSignature() {
println("(発信者: " + this.name + ")")
}
}
fun main() {
val person = Person("太郎")
person.greet()
}
こんにちは、太郎さん!
(発信者: 太郎)
上の例では、this.nameが「自分のnameプロパティ」を指し、this.showSignature()で「自分のメソッド」を呼び出しています。thisを付けることで、「いま参照しているのは自分の中身」だと読み手に伝えやすくなります。Kotlinの基本として、クラス内でthisは常に現在のインスタンスを表す、という点をまず押さえておきましょう。
2. thisを使う理由は?名前のあいまいさを避けるため
コンストラクタの引数とプロパティの名前が重なるとき、thisが重要になります。たとえば:
class Person(val name: String) {
var greeting = ""
fun updateGreeting(name: String) {
this.greeting = "こんにちは、${name}さん(本当は${this.name})"
}
}
このようにnameだけだと引数を指しますが、this.nameはプロパティを指すため、正しく区別できます。
3. superキーワードとは?親クラスを指す言葉
superは、「親(スーパークラス)の機能にアクセスする」ためのキーワードです。たとえば、親クラスの関数を呼び出したいときに使います。
open class Animal {
open fun sound() = println("いきものの音")
}
class Dog : Animal() {
override fun sound() {
super.sound()
println("ワンワン!")
}
}
fun main() {
Dog().sound()
}
いきものの音
ワンワン!
この場合、super.sound()によって親の処理を呼び出し、その後自分の処理を追加しています。
4. thisとsuperの違い
this=そのクラス自身(自分)super=親クラス(スーパークラス)
この違いをイメージするには、家族の会話のように考えると分かりやすいです。thisは自分、superは親の意見や動作を受け継ぐときに使います。
5. Kotlin初心者が使ってみたい実践例
たとえば次のような例では、thisとsuperの使い分けが自然です:
open class Vehicle(val name: String) {
open fun move() = println("${name}が進みます")
}
class Car(name: String) : Vehicle(name) {
override fun move() {
super.move()
println("${this.name}(車)が走行中")
}
}
super.move()で親の動きを呼び出し、追加処理として「車が走行中」と出します。
6. 使い分けのポイント:いつthis?いつsuper?
this=自分のプロパティや関数、引数と混同されやすい変数名のときsuper=親クラスの処理を残しつつ、自分の処理を追加したいとき
この使い分けを覚えると、継承やインスタンスのコードがとても読みやすくなります。
まとめ
Kotlinのthisとsuperは、オブジェクト指向プログラミングにおけるとても大切なキーワードです。thisは「自分自身」、superは「親クラス」を指す言葉であり、どちらもクラスや継承を使った開発で頻繁に登場します。
初心者にとっては、コードを読んでいると突然現れるこれらの単語に戸惑うかもしれません。しかし、基本的な使い方を覚えれば、コードの見通しもぐんと良くなり、保守もしやすくなります。
thisの使いどころ
自分のクラスのプロパティや関数を明示的に指すとき、特に関数の引数とプロパティ名が同じになっているときは、thisを使うことで誤解を防ぐことができます。これにより、意図した処理が正しく行われ、コードの可読性も向上します。
superの役割とは?
superは、親クラスに定義された関数やプロパティを呼び出すときに使います。Kotlinでは継承がサポートされており、親クラスの振る舞いを引き継ぎつつ、自分のクラスで上書き(オーバーライド)するケースも多くあります。そのとき、親の処理を呼んでから自分の処理を足すという場面でsuperは非常に便利です。
実際に書いて試してみよう
ここでthisとsuperの使い方を同時に使った簡単なサンプルを見てみましょう。
open class Animal(val type: String) {
open fun introduce() {
println("私は${type}です。")
}
}
class Cat(type: String, val name: String) : Animal(type) {
override fun introduce() {
super.introduce() // 親クラスのintroduce()を呼ぶ
println("私の名前は${this.name}です。") // 自分のプロパティにアクセス
}
}
fun main() {
val cat = Cat("ネコ", "ミケ")
cat.introduce()
}
私はネコです。
私の名前はミケです。
上記の例では、super.introduce()で親のメッセージを出し、this.nameで自分のプロパティにアクセスしています。こうすることで、継承関係を意識した柔軟なコードが書けるようになります。
今後のKotlin学習にもつながる知識
今回紹介したthisとsuperは、Kotlinだけでなく、Javaや他のオブジェクト指向言語でも基本となる概念です。特にAndroidアプリ開発では、これらを活用する機会がとても多いため、早い段階で慣れておくと、実践的なコードも理解しやすくなります。
また、Kotlinではラムダ式やインナークラスなどの場面でもthisやsuperが使われることがあるため、今回の内容を土台にして、さらに応用的なテーマへと理解を広げていけます。
生徒
「thisは『自分』で、superは『親』っていうのがやっと分かってきました!」
先生
「その調子です。関数の中でthisを使えば、自分のプロパティと引数を区別できますし、superは親クラスの処理を引き継ぐのに使えますよ。」
生徒
「Catクラスでsuperとthisを両方使うの、ちょっと感動しました。親の機能も使えて、子どもとして名前も言えるって感じがしました!」
先生
「まさにその通りです。これがクラスの継承やオブジェクト指向の基本ですから、今後いろんな場面で出てくるのでしっかり使い慣れていきましょうね。」
理解度のクイズ問題
空欄の★に当てはまる内容を答えてください。
open class Animal(val name: String) {
open fun speak() {
println("${name}が鳴いています")
}
}
class Cat(name: String) : Animal(name) {
override fun speak() {
super.speak()
println("${this.name}はニャーと鳴きます")
}
}
superは親クラスの関数やプロパティを使いたいとき。
・thisは自身のプロパティや関数を明示したいときに使う。
・関連キーワード:Kotlin 基本文法、継承、オーバーライド、クラス設計、初心者、親子関係、インスタンスメソッド。