【第16章】main関数とは?関数の定義について詳しく解説

【第16章】main関数とは?関数の定義について詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのmain関数や関数の定義について勉強するピヨ!

この第16章では、プログラミング言語であるKotlinのmain関数や関数の定義について、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのmain関数や関数の定義について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

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

スポンサーリンク

【Kotlin】関数とは?

関数とは?

main関数や関数定義の勉強をする前に、この2つに共通している「関数」とはそもそもいったい何なんでしょうか?まずは関数について勉強し、理解していきましょう。

処理をまとめたもの

関数は、一言で言うと「処理をまとめたもの」です。

任意の名前を付けた関数の中に複数の処理を記述することで、その処理が1つのセットとわかるようにしたものになります。

関数の組み合わせでプログラムはできている

またKotlinのプログラムは、いくつもの関数の組み合わせでできています。

もちろん関数の組み合わせだけでできているわけではないですが、Kotlinのプログラムではかなり重要な要素になっているので、しっかり勉強して理解していきましょう。

リンコ
リンコ

関数は処理をまとめたものピヨ!

【Kotlin】main関数とは?

main関数とは?

関数が処理をまとめたものということはわかりましたね。では続いてmain関数とは何か勉強していきましょう。

関数の1つ

main関数も関数の1つであり「main」というのが関数の名前になります。

Kotlinのプログラムは、必ずこの「main関数」から始まります。

main関数から必ず始まるというのはKotlinの仕様なので、もし記述がないとエラーが起きてしまいます。

Kotlinの中で一番大事な関数

またmain関数はKotlinのプログラムの中で一番大事な関数になります。

今まで勉強してきたコードも、main関数の中に記述することで初めて動作します。

よってmain関数の名前を変更してしまうと、動作しなくなるので注意しましょう。

リンコ
リンコ

main関数が存在していることでKotlinのプログラムは動くピヨ!

main関数を見てみよう

main関数についてなんとなく理解したところで、どんなコードになるのか見てみましょう。

サンプルコード

以下のサンプルコードでは、main関数を定義してその中でリンコに挨拶をさせています。

関数の定義の仕方は以下で勉強していきますが、とりあえずmain関数がどのようなものかなんとなく見てみましょう。

fun main() {
  println("こんにちは、リンコピヨ!")
}

出力

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

こんにちは、リンコピヨ!

【Kotlin】関数定義とは?

関数定義とは?

ではここから本題の関数定義について勉強していきます。

関数を自分で作ること

Kotlinでは、main関数などあらかじめ準備されている関数を組み合わせてプログラムを組んでいます。

では、自分がやりたいと思っていることを行う関数が、Kotlinで準備されていない場合はどうすればいいでしょうか?

そんな時に関数定義を行います。関数定義は、自分自身でオリジナルの関数を作ることを言います。

main関数の外に記述する

また関数定義は、main関数の外側で行います。

main関数の外側で関数定義をし、定義した関数が必要になった時に、main関数内で関数を呼び出す処理を行います。

リンコ
リンコ

自分でオリジナルの関数を作ることを関数定義というピヨ!

【Kotlin】関数定義をしてみよう

関数定義をしてみよう

関数について理解が深まってきたたところで、実際に関数定義の行い方を勉強していきましょう。

関数定義の書式

関数定義の書式は以下のようになります。以下の書式は一例になりますが、他の書式もKotlinを勉強していく中でしっかりと理解していきましょう。

fun 関数名(パラメータの変数名: パラメータの型) : 関数が返す変数の型 {
  return 関数が返す値
}

最初にfunをつける

関数定義では「fun」というキーワードで記述を始めます。

「fun」は「function」の略で、日本語にすると「関数」になります。

funの後にスペースを空けて関数名を記述するようにします。

関数名の暗黙のルール

関数の名前は、基本的にどのような名前をつけてもオッケーです。

ただし暗黙のルール的なものがあり、プログラマーは関数名を誰が見てもわかりやすいようにします。

また関数名の先頭は小文字、単語の先頭は大文字にします。

関数名の右側の()にパラメータを定義する

関数名の右側に()を記述し、その()内に関数が受け取るパラメータの定義をします。

パラメータを記述しておくことで、実行される際に値を受け取り、値を処理に使うことができます。

このパラメータの変数名も自由につけることができますが、わかりやすい変数名にしましょう。

またパラメータの変数の型はなんでもオッケーです。

この辺りは文字だけでは難しいので、以下で実際に関数定義を体験しながら理解していきましょう。

リンコ
リンコ

関数定義は「fun」から始まり、関数名はわかりやすいものをつけるピヨ!

実際に関数定義をしてみよう

では実際に関数定義を記述してみましょう。

サンプルコード

以下のサンプルコードでは、main関数の下でgetFiveTimes関数を定義し、引数として10を引き渡しています。実行するとどうなるのか、見ていきましょう。

fun main() {
  val value2: Int = getFiveTimes(10)  //ここが関数の呼び出し
  println(value2)
}

// 下記が関数定義
fun getFiveTimes(value: Int) : Int { // 引数の10が変数valueに代入される
  return value * 5 // 10×5の結果がreturnでmain関数の方に戻り、変数value2に代入される
}

出力

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

50
リンコ
リンコ

このコードの流れは、以下のようになっているピヨ!

  1. 「getFiveTimes(10)」で関数を呼び出す際に、パラメータの「10」を引き渡す。
  2. 関数の定義の「fun getFiveTimes(value: Int) : Int {」の部分でInt型のvalueが10を受け取る。
  3. 「return value * 5」でvalueが10になるので「10かける5」の「50」をリターンする。
  4. 「50」がmain関数の「val value2: Int = getFiveTimes(10)」に戻り、変数value2に格納される。
  5. println(value2)で50が出力される。

関数定義の流れは少しややこしいけど、理解すると簡単ですので繰り返し勉強し、理解していくピヨ!

【Kotlin】型推論で関数定義をより簡潔に

型推論で関数定義をより簡潔に

Kotlinでは型推論を使ってコードを簡潔に記述できる仕組みがありますが、関数定義でも同じように型推論が使えます。

型推論した関数定義の書式

以下が型推論した関数定義の書式になります。

fun 関数名(パラメータの変数名: パラメータの型) = 関数が返す値

実際に型推論した関数定義をしてみよう

では実際に型推論で関数定義をしてみましょう。

サンプルコード

以下のサンプルコードは、上記の整数を5倍にする関数を型推論を使って記述しています。どれくらい簡潔になっているか確認してみましょう。

fun main() {
  val value2: Int = getFiveTimes(10)
  println(value2)
}
fun getFiveTimes(value: Int) = value * 5

出力

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

50

このように、呼び出す側のmain関数は同じですが、関数定義では「{}」と「return」が省いて記述できています。

そして「=」が追加され「=の右側を左側に代入する」といった流れになっています。

また型推論により「: Int」も省くことができています。これはvalueがInt型だったり、掛けている数字も5で整数というところから、あきらかにInt型なので省くことができるようになっています。

リンコ
リンコ

関数定義も型推論で簡潔に記述できるピヨ!

【Kotlin】複数のパラメータを受け取ることも可能

複数のパラメータを受け取ることも可能

上記までは、1つの値を受け取って、1つの値を返す関数でした。ですが複数のパラメータを受け取ることも可能です。

複数のパラメータで関数定義の書式

複数のパラメータを受け取るための書式は、以下のようになります。通常の書式と、型推論を使って簡潔に記述した書式、両方を見ていきます。

// 通常の書式
fun 関数名(パラメータの変数名1: パラメータの型1, パラメータの変数名2: パラメータの型2) : 関数が返す変数の型 {
  return 関数が返す値
}
// 型推論の書式
fun 関数名(パラメータの変数名1: パラメータの型1, パラメータの変数名2: パラメータの型2) = 関数が返す値

「,」で区切る

このように、受け取るパラメータの変数名と型を「,」で区切るだけで複数のパラメータを受け取ることができます。

いくつでもオッケー

またパラメータは2つでも3つでも、いくつでも受け取ることが可能になります。

実際に複数のパラメータで関数定義をしてみよう

では実際に、複数のパラメータで関数定義をしてみましょう。

サンプルコード

以下のサンプルコードでは、2つのパラメータを受け取り足し算をするプログラムになっています。

fun main () {
  val answer: Int = getAdd(3,5) //関数の呼び出し
  println(answer)
}

// 型推論での関数定義
fun getAdd(num1: Int, num2: Int) = num1 * num2

出力

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

15

上記では、整数の3と5を引き渡し、2つの整数を足し算した後リターンし、変数answerに代入されprintln関数で出力されています。

リンコ
リンコ

複数のパラメータを使うことで、より複雑なプログラムが記述できるピヨ!

【Kotlin】値を返さない場合は「Unit」を使う(省略可能)

値を返さない場合は「Unit」を使う(省略可能)

呼び出し側に値を返す必要がない場合は、関数内にreturnを入れる必要はありません。

その場合は「Unit型」というものを使います。

Unitを使った関数定義の書式

Unitを使った関数定義の書式は以下になります。

fun 関数名(パラメータの変数名: パラメータの型) : Unit {
  処理内容
}

このように値を返す関数定義の際の「関数が返す変数の型」を記述していた個所に「Unit」と記述します。

「Unit」は「何も値を返さない」という意味で、これによりreturn文も記述しなくてよくなります。

実際にUnitを使った関数定義をしてみよう

では実際に、Unitを使った関数定義をしてみましょう。

サンプルコード

以下のサンプルコードでは、関数の呼び出しで3つの整数を関数に引き渡し、関数定義をする際にそのままprintln関数で整数を計算し出力しています。

fun main() {
  getAdd(1,5,10)  //ここが関数の呼び出し
}

// 下記が関数定義
fun getAdd(a: Int, b: Int, c: Int) : Unit { 
  println("パラメータとして、${a}と${b}と${c}を受け取りました。")
  println("この値の合計は${a + b + c}です。")
}

出力

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

パラメータとして、1と5と10を受け取りました。
この値の合計は16です。

Unitを省略した関数定義をしてみよう

ただしこの「Unit」は省略可能で、型が記述されていなければ「何も値を返さない」というのは、Kotlinのコンパイラもプログラマーにもわかりきったことなので、プログラマーがほとんど記述することはありません。

サンプルコード

以下のサンプルコードは、上記のコードの「Unit」が記述されていないバージョンです。

fun main() {
  getAdd(1,5,10)  //ここが関数の呼び出し
}

// 下記が関数定義( 「: Unit」の記述がなくなっています)
fun getAdd(a: Int, b: Int, c: Int) { 
  println("パラメータとして、${a}と${b}と${c}を受け取りました。")
  println("この値の合計は${a + b + c}です。")
}

出力

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

パラメータとして、1と5と10を受け取りました。
この値の合計は16です。

このように「: Unit」の記述を消しても、まったく同じように出力されることがわかりました。

リンコ
リンコ

Unitは記述しなくてもオッケーだけど、念のため覚えておくピヨ!

【Kotlin】可変長引数とは?

可変長引数とは?

さて、これまでのコードでは1回の関数の呼び出しだけだったので、パラメータの数を気にする必要はありませんでした。

しかし複数回関数を呼び出す必要があり、毎回パラメータの数が違う場合はどうすればいいでしょうか?

このような時に「可変長引数」を使います。可変長引数がどのようなものか勉強していきましょう。

「vararg」と記述する

Kotlinではパラメータとなる変数名の前に「vararg」というキーワードを記述することによって「可変長引数」として扱われるようになります。

配列のようなもの

パラメータにvarargと記述するだけで可変長引数となり、パラメータを受け取る変数と型は1つ記述し、呼び出し側のパラメータの値は関数によってバラバラでもよくなります。

パラメータはいくつでもいいですが、受け取る側の変数は1つというところから、可変長引数は「配列」のようなものになります。

リンコ
リンコ

可変長引数は配列のようなものピヨ!

【Kotlin】可変長引数を使った関数定義をしてみよう

可変長引数を使った関数定義をしてみよう

最後に、可変長引数を使った関数定義をしてみましょう。

可変長引数を使った関数定義の書式

可変長引数の書式は以下のようになります。

fun 関数名(vararg パラメータの変数名: パラメータの型) {
  処理内容
}

実際に可変長引数を使った関数定義をしてみよう

では実際に、可変長引数を使った関数定義をしてみましょう。

サンプルコード

以下のサンプルコードでは、4回関数の呼び出しをしていて、それぞれでパラメータの数を変えています。

fun main() {
  getAdd(3,5)
  getAdd(4,6,8)
  getAdd(1,10,15,20)
  getAdd(5,5,5,5,5)
}

// numsにパラメータを代入
fun getAdd(vararg nums: Int) {
// 変数resultに0を代入
  var result = 0
// numsの値を繰り返し変数xに代入し、result+xの結果をresultに代入
  for(x in nums) result += x
  println("すべての整数を足し算した結果:${result}")
}

出力

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

すべての整数を足し算した結果:8
すべての整数を足し算した結果:18
すべての整数を足し算した結果:46
すべての整数を足し算した結果:25

このようにパラメータの数がバラバラでも「vararg」を使うことによって、問題なく処理が実行されます。

リンコ
リンコ

可変長引数を使うことで、パラメータの数が違う関数の呼び出しもスムーズに記述できるピヨ!

まとめ

まとめ

この記事では、プログラミング言語であるKotlinのmain関数や関数の定義について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • 関数は処理をまとめたもの
  • main関数はKotlinの中で一番大事な関数
  • オリジナルの関数を作ることを関数定義という
  • 関数名はわかりやすい名前にする
  • 可変長引数で複雑なコードも記述できる

今回勉強した「main関数」や「関数の定義」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「クラス」について勉強していくピヨ!

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

コメント

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