teruroom's diary

ほぼ 8歳602ヶ月‏ の てるるーむ のプログラミングダイアリー

はじめてのkotlin関数

コトリン関数ことはじめ

 kotlin(コトリン)の関数について説明します。コトリンの関数はクラス内のメソッドではありません。クラスと同列の独立したコトリンの構成要素です。コトリンの関数はクラス内にしか記述できないということはありません。
 これはちょうどスクリプト型のプログラミング言語JavaScriptの関数定義と同じです。コトリンと同じJVM言語であるスカラ(Scala)では関数はクラス(class)やトレイト(trait)やオブジェクト(object)内にしか定義できません。しかし、コトリンの関数はクラス内にも定義できますし、クラスの外でクラスと同列に定義することができるのです。

基本的なコトリンの関数の定義

 コトリンの基本的な関数は「fun」キーワードに続いて関数名を記述して定義します。引数は関数名に続いて括弧「()」内にパスカル記法で記述します。すなわち「引数名: 型名」のように記述します。複数の引数がある場合には、カンマ「,」で区切って記述します。
 また、戻り値の型は括弧「()」に続いてコロン「:」を記述し、その後に型名を記述します。
 さらに関数の処理は中括弧「{}」内に記述します。
 コトリン関数のもっとも簡単な具体例は以下の関数「ごあいさつ()」のようになります。

関数「ごあいさつ()」のコード例
fun ごあいさつ( お名前: String, メッセージ: String ): String {
  return お名前 + "さん!" + メッセージ
}

fun main( args: Array<String> ) {
  println( ごあいさつ( "高畑美月", "こんにちわ~!" ) )
}
関数「ごあいさつ()」の実行結果
高畑美月さん!こんにちわ~!

戻り値をダイレクト指定する関数の定義

 コトリンの関数は戻り値をイコール記号「=」の後に直接記述することもできます。
 関数「掛け算()」のコード例を見てください。中括弧「{}」内に処理を記述するかわりに「=」を記述し、その後に関数の戻り値の計算式「x * y」を記述しています。

変数の文字列への埋め込み

 なお、「main()」関数内の「println()」関数内の「${}」は中括弧「{}」内の変数を文字列内に埋め込むための記述方法です。ここでは関数「掛け算()」を文字列内に埋め込んでいます。関数「掛け算()」の戻り値が文字列内に埋め込まれてコンソールに表示されます。
 ここで中括弧「{}」は変数が式や関数の場合に記述します。変数のみの場合には中括弧「{}」を省略して「$x」や「$y」のように記述します。

関数「掛け算()」のコード例
fun 掛け算( x: Int, y: Int ) = x * y

fun main( args: Array<String> ) {
  println( "77 に 11 を掛けると ${掛け算( 77, 11 )} になります。" )
}
関数「掛け算()」の実行結果
77 に 11 を掛けると 847 になります。

戻り値のない関数の定義

 戻り値がない関数はコトリンでは型名に「Unit」キーワードを記述します。なお、戻り値がない関数はこの「Unit」キーワードを省略することもできます。
 関数「掛け算結果表示その1()」は型名に「Unit」キーワードを記述した例です。関数「掛け算結果表示その2()」は戻り値の型を省略した例です。

関数「掛け算結果表示1()」および「掛け算結果表示2()」のコード例
fun 掛け算結果表示その1( x: Int, y: Int ): Unit {
  println( "$x$y を掛けると ${ x * y } になります。" )
}

fun 掛け算結果表示その2( x: Int, y: Int ) {
  println( "$x$y を掛けると ${ x * y } になります。" )
}

fun main( args: Array<String> ) {
  掛け算結果表示その1( 99, 222 )
  掛け算結果表示その2( 111, 777 )
}
関数「掛け算()」の実行結果
99 に 222 を掛けると 21978 になります。
111 に 777 を掛けると 86247 になります。

クラス内の関数定義

 コトリンの関数はクラス内で定義することができます。クラス内でも独立した関数と同じように定義します。
 クラス内に関数を定義した場合にはクラスのインスタンスを生成してから、インスタンスを介して関数を呼び出します。具体的にはクラスのインスタンスの続いてドット「.」記号を記述し、その後に関数名と引数値を与えます。

クラスのインスタンス

 クラスのインスタンスを生成するにはクラス名につづいて括弧「()」内にコンストラクタ引数値を与えます。Javaのように「new」演算子は不要です。具体的には「クラス名( コンストラクタ引数値, ・・・)」のように記述します。これはちょうど同じJVM言語のスカラにおけるケースクラスのようなインスタンス化の記述方法になります。
 生成したインスタンスが不変変数キーワード「val」で定義されたインスタンス変数に代入するか、あるいは、「クラス名( コンストラクタ引数値, ・・・)」の記述のままでインスタンスを表します。
 クラスのインスタンスを複数回使う場合には、インスタンス変数にいったん代入し、インスタンスを一回しか使わないない場合には、インスタンス変数に代入せずにそのまま利用するとよいでしょう。
 下記のコード例では、クラス「計算クラス()」のインスタンスをいったん不変変数「掛け算」に代入し、「掛け算. 掛け算結果を表示する( 1234, 55 )」のように関数「掛け算結果を表示する()」を呼び出しています。また、インスタンスを不変変数に代入せずに「計算クラス().掛け算結果を表示する( 3333, 4444 )」のようにダイレクトに関数「掛け算結果を表示する()」を呼び出しています。

関数「掛け算結果を表示する()」のコード例
class 計算クラス() {
    fun 掛け算結果を表示する( x: Int, y: Int ): Unit {
      println( "$x$y を掛けると ${ x * y } になります。" )
    }    
}

fun main( args: Array<String> ) {
  掛け算結果表示その1( 99, 222 )
  掛け算結果表示その2( 111, 777 )
  
  val 掛け算 = 計算クラス()
  掛け算. 掛け算結果を表示する( 1234, 55 )
  計算クラス().掛け算結果を表示する( 3333, 4444 )
}
関数「掛け算結果を表示する()」の実行結果
1234 に 55 を掛けると 67870 になります。
3333 に 4444 を掛けると 14811852 になります。

この記事のコード例

 ここで紹介したコード例を以下の https://ideone.com/z4ZhYe で公開しています。ここで実行結果も「stdout」に表示されていますので参考になると思います。
 下記「ideone」の一番右の「fork」アイコンをクリックするとあなたご自身のコードとして編集の上、[Run]ボタンの押下でコンパイルし、実行することができます。