【第19章】プライマリコンストラクタやイニシャライザについて詳しく解説

【第19章】プライマリコンストラクタとイニシャライザについて詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのプライマリコンストラクタやイニシャライザを記述する方法を解説するピヨ!

この第19章では、プログラミング言語であるKotlinのプライマリコンストラクタやイニシャライザについて、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのプライマリコンストラクタやイニシャライザについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※またこの記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】コンストラクタについて

コンストラクタについて

ではまず、Kotlinのコンストラクタが何なのかを勉強していきましょう。

コンストラクタとは?

コンストラクタとは、クラスがインスタンス化される際に呼び出される「特別な関数」のようなもので、クラスがインスタンス化される際に必ず自動で処理が実行されます。

コンストラクタには2つある

コンストラクタには、プライマリコンストラクタとセカンダリコンストラクタの2種類があります。

この記事ではプライマリコンストラクタについて勉強しますが、プライマリコンストラクタは「主要なコンストラクタ」という意味になります。

セカンダリコンストラクタは次章で勉強していきます。

リンコ
リンコ

プライマリコンストラクタとセカンダリコンストラクタの2つあるピヨ!

【Kotlin】プライマリコンストラクタについて

プライマリコンストラクタについて

ではこの章の本題の、プライマリコンストラクタについて勉強していきましょう。

クラスの定義と同時に実行される

プライマリコンストラクタは、クラスの定義と同時に実行される処理です。

プライマリコンストラクタが実行されると、パラメータの引き渡しなどのプロパティの初期化処理が実行されます。

インスタンス化の際に行いたい処理も記述しておくことができます。

コードを簡潔に記述できるようになる

後程、プライマリコンストラクタを使っているコードと使っていないコードを見比べてみますが、プライマリコンストラクタを使うことで、コードが簡潔に記述できるようになります。

リンコ
リンコ

プライマリコンストラクタはクラスがインスタンス化される際に必ず自動で処理が実行されるピヨ!

【Kotlin】プライマリコンストラクタを使ってみよう

プライマリコンストラクタを使ってみよう

では実際に、プライマリコンストラクタのコードを勉強していきましょう。

プライマリコンストラクタの書式

プライマリコンストラクタを使う際の書式は以下のようになります。

fun main() {
  val インスタンス名 = クラス名(引数1, 引数2...)
}

class クラス名 constructor(var プロパティ名: 型名 = 値,var プロパティ名: 型名 = 値,...) {
  処理内容
}

クラスの定義で「constructor」と記述する

クラスを定義する際に、クラス名の右側に「constructor」と記述することでプライマリコンストラクタを使うことができます。

※ただし「constructor」は省略も可能です。省略した記述の仕方は後程勉強していきます。

constructorの「()」でプロパティの定義をする

constructorと記述している右側の「()」で、プロパティの定義をすることができます。

前章まではプロパティを1行1行記述して定義していましたが、プライマリコンストラクタを使うことで、クラスの定義と複数のプロパティの定義がまとめて1行で記述できるようになっています。

インスタンス化の際に引き渡したい値を「()」に記述する

main関数内の、クラスのインスタンス化とパラメータの初期値の設定もまた、同時にできるようになっています。

クラスをインスタンス化する際に、main関数でのクラス名の「()」に値を記述することで、プライマリコンストラクタが呼ばれた時に「()」内の値をクラスに引き渡し、プロパティの値を初期化します。

リンコ
リンコ

「()」内に値やパラメータを記述することでコードが簡潔になるピヨ!

プライマリコンストラクタを使ったコード

書式がわかったところで、実際にプライマリコンストラクタを使ったコードを見ていきましょう。

サンプルコード

以下のサンプルコードは、前章でも使ったリンコに挨拶をさせるコードです。

fun main() {
  val rinko = Rinko("リンコ", 10)
  rinko.greet()
}

class Rinko constructor(var name: String = "",var age: Int = 0) {
  fun greet() {
    println("${name}です。${age}歳です。")
  }
}

出力

サンプルコードを実行すると、以下のように出力されます。

リンコです。10歳です。

プライマリコンストラクタを使っていない状態のコード

続いて、プライマリコンストラクタを使っていない状態のコードを見てみましょう。

サンプルコード

以下のサンプルコードは、先程のコードと同じですがプライマリコンストラクタを使っていない状態のコードです。

fun main() {
  val rinko = Rinko()
  rinko.name = "リンコ"
  rinko.age = 10
  rinko.greet()
}

class Rinko {
  var name = ""
  var age = 0
  fun greet() {
    println("${name}です。${age}歳です。") 
  }
}

出力

コードの記述は違いますが、以下のように先程と同じように出力されます。

リンコです。10歳です。

このように、プライマリコンストラクタを使っているのと使っていないのでは、コードの長さがだいぶ変わってきます。

プライマリコンストラクタを使った方が、かなり短くてすっきりしたコードになっていることがわかります。

またこのコードで言うと、main関数の「Rinko(“リンコ”, 10)」という記述の部分でコンストラクタが呼び出されていて、この記述でクラスのインスタンス化と、名前と年齢をセットする処理が同時に実行されています。

リンコ
リンコ

見比べるとコードの長さが全然違うことがわかるピヨ!

【Kotlin】constructorの記述は省略可能

constructorの記述は省略可能

プライマリコンストラクタを使うためには、クラスの定義をする際「constructor」と記述するとしましたが、記述は省略することが可能です。

というよりかは、Kotlin側もプログラマもわかりきったことなので、省略して記述することが一般的になっています。

constructorの記述を省略したサンプルコード

constructorの記述を省略したコードは以下のようになります。

fun main() {
  val rinko = Rinko("リンコ", 10)
  rinko.greet()
}

class Rinko (var name: String = "",var age: Int = 0) {
  fun greet() {
    println("${name}です。${age}歳です。")
  }
}

上記を見るとわかるように、省略の方法は「constructor」という記述を丸々省略するだけですね。

出力

以下のように、省略したとしても同じように出力されることがわかります。

リンコです。10歳です。

【Kotlin】プライマリコンストラクタの呼び出し方はいろいろある

プライマリコンストラクタの呼び出し方はいろいろある

ここまではプライマリコンストラクタの定義方法を勉強してきました。ここでは、プライマリコンストラクタの呼び出し方法について詳しく勉強していきます。

上記までの例では「val rinko = Rinko(“リンコ”, 10)」という呼び出し方をしていました。

この「()」の中身を変えて、様々な方法で呼び出すことができますので、この呼び出し方を勉強していましょう。

値だけを記述

val rinko = Rinko("リンコ", 10)

こちらは、上記の例と同じですね。値だけを記述することで、コードが簡潔になるメリットがあります。

変数名を明示

val rinko = Rinko(name = "リンコ",age = 10)

こちらは変数名を明示することにより、どの変数にどの値をセットしたかが呼び出し側のコードを見るとわかるようになるメリットがあります。

引き渡すパラメータの順番は好きなように変えられる

val rinko = Rinko(age = 10, name = "リンコ")

これはパラメータを上記までの例とは逆にしています。何種類ものパラメータを受け取るコンストラクタがある場合、順番を覚えるのは大変なので、変数名を指定していれば順番を覚えていなくてもOKということです。

1つのパラメータの記述を省略

val rinko = Rinko(name = "リンコ")

上記のように変数ageの記述を省略することもできます。エラーは起きないですがこの場合は、クラス側のコンストラクタの変数ageの定義の通りに値がセットされるようになります。

リンコ
リンコ

使い方によって呼び出し方を変えると便利ピヨ!

【Kotlin】イニシャライザとは?

イニシャライザとは?

最後に、コンストラクタと深く関わりのある「イニシャライザ」という処理について勉強していきます。

他の処理を含めることができる

コンストラクタの記述の箇所にイニシャライザの処理を記述することで、コンストラクタとは別に他の処理を含めることができます。

コンストラクタが呼ばれたと同時に処理を実行

イニシャライザは、コンストラクタが呼ばれたと同時に、イニシャライザブロック内に記載した処理が同時に実行されるようになっています。

コンストラクタの実行と同時に他に何か処理を実行させたい時は、イニシャライザを使うと便利です。

イニシャライザブロックに関しては、以下で勉強していきます。

リンコ
リンコ

イニシャライザはコンストラクタと同時に処理をさせたい時に使うピヨ!

【Kotlin】イニシャライザを使ってみよう

イニシャライザを使ってみよう

では実際に、イニシャライザの使い方を勉強していきましょう。

イニシャライザの書式

イニシャライザの書式は以下のようになります。

class クラス名 (var プロパティ名: 型名 = 値,var プロパティ名: 型名 = 値,...) {
  init {
    イニシャライザブロック内での処理内容
  }
  処理内容
}

イニシャライザを使いたい時は「init」と記述

上記のように、イニシャライザを使いたい時はプライマリコンストラクタの後に「init」と記述します。

initの{}で囲われた部分をイニシャライザブロックと言う

initの後の{}で囲われた部分を「イニシャライザブロック」と言います。

コンストラクタが呼ばれたと同時に、イニシャライザブロック内に記述した処理が同時に実行されるようになります。

リンコ
リンコ

イニシャライザを使う時は「init{}」の中に処理を記述するピヨ!

イニシャライザを使ったコードを記述してみよう

書式がわかったところで、イニシャライザを使ったコードを実際に記述してみましょう。

サンプルコード

以下のサンプルコードでは、イニシャライザが呼ばれたタイミングで、文字を出力するようにしています。

fun main() {
  val rinko = Rinko("リンコ", 10)
  rinko.greet()
}
class Rinko(val name: String, var age: Int) {
  init {
    println("コンストラクタのイニシャライザが呼ばれました")
  }
  fun greet() {
    println("${name}です。${age}歳です。")
  }
}

出力

サンプルコードを実行すると、以下のように出力されます。

コンストラクタのイニシャライザが呼ばれました
リンコです。10歳です。

このコードの流れは以下のようになります。

  1. 「val rinko = Rinko(“リンコ”, 10)」でインスタンス化
  2. コンストラクタの呼び出し
  3. プライマリコンストラクタのイニシャライザの処理
  4. 「rinko.greet()」の処理の実行
リンコ
リンコ

プライマリコンストラクタの呼び出しからイニシャライザの実行の処理の流れはしっかり理解しておくピヨ!

まとめ

まとめ

この記事では、プログラミング言語であるKotlinのプライマリコンストラクタやイニシャライザについて勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • プライマリコンストラクタはクラスがインスタンス化される際に必ず自動で処理が実行される
  • クラスの定義で「constructor」と記述するが、省略するのが一般的
  • プライマリコンストラクタの呼び出し方は、臨機応変に様々な呼び出し方ができる
  • イニシャライザはコンストラクタと同時に処理を実行させたい時に使う
  • イニシャライザを使いたい時は、イニシャライザブロック内に記述する

今回勉強した「プライマリコンストラクタ」や「イニシャライザ」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「セカンダリコンストラクタ」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました