Java資格の勉強中に覚えるのがややこしく感じた、signature(以下、シグニチャまたはシグネチャ)について調べてまとめてみました。
Signature (シグニチャ / シグネチャ) とは
シグニチャはメソッド名と引数の数、引数の型、引数の順番が含まれています。
※引数の数、引数の型、引数の順番をまとめて引数のリストともいいます。
シグニチャクイズ
図にするとそういえばそうだわと思えるものの文章とかたくさん並んでいると混乱します。
理解を深めるためにクイズ形式でシグニチャに慣れてみます。
(Eclipseなどでコードを実際に実行しながら確認してみると理解が深まります。下記コードはpaiza.ioでも動くように書いています。)
問題1 シグニチャが同じか同じでないか
下記のコードがあったとして、3つのシグニチャは同じか同じでないかクイズです。
class Main {
//1つめのシグニチャ A
static int signature1(int a, int b){
return Math.max(a, b);
}
//2つめのシグニチャ B
static int signature1(int c, int d){
return Math.max(c, d);
}
//3つめのシグニチャ C
static double signature1(int a, int b){
return Math.max(a, b);
}
public static void main(String[] args){
System.out.println(signature1(5,3));
}
}
答え
シグニチャA、B、Cはすべて同じシグニチャです。
解説
シグニチャはメソッド名と引数の数、引数の型、引数の順番で判断します。
シグニチャ A signature1(int a, int b)
1つめのシグニチャ A はメソッド名が「signature1」引数の数は「2つ」引数の型は「2つともint」引数の順番は「int int」となります。
シグニチャ B signature1(int c, int d)
2つめのシグニチャ B もメソッド名が「signature1」引数の数は「2つ」引数の型は「2つともint」引数の順番は「int int」なので同じシグニチャです。
シグニチャ Bの相違点である引数の名前(cとd)は異なっても同一シグニチャとみなされます。
シグニチャ C signature1(int a, int b)
3つめのシグニチャ C はAとまったく同じシグニチャです。
シグニチャ C の相違点は戻り値(double)ですが、戻り値が異なってもシグニチャには関係ありません。
問題 2 異なるシグニチャにしてみる
問題1 のコードを実行するとコンパイルエラーになります。
(例:method siguniture1(int,int) is already defined in class Main)
せっかくなのでコンパイルエラーにならないようにシグニチャを書き換えてみましょう。
答え (参考)
class Main {
//1つめのシグニチャ A
static int signature1(int a){
return Math.max(a, 5);
}
//2つめのシグニチャ B
static double signature1(double c, int d){
return Math.max(c, d);
}
//3つめのシグニチャ C
static double signature1(int a, double b){
return Math.max(a, b);
}
public static void main(String[] args){
System.out.println(signature1(3));
System.out.println(signature1(5.0,3));
System.out.println(signature1(5,3.0));
}
}
解説
メソッド名を変えることもシグニチャを変える方法ですが、今回は引数のリストを変更してみました。
※同じメソッド名でも引数のリストが異なるメソッドを複数定義することをオーバーロードといいます。オーバーロードにもいろいろ学ばなければいけないことがありますが、シグニチャを理解していないと定義が難しいということだけ今回は触れておきます。
似ていてシグニチャも関連するオーバーライドという言葉もあって初心者にはややこしいこと限りなしです。
シグニチャ A signature1(int a)
引数の数を1つに変更しました。
シグニチャ B signature1(double c, int d)
引数の型を「doubleとint」に変更しました。
シグニチャ C signature1(int a, double b)
引数の型を「intとdouble」に変更しました。
シグニチャ Bとは引数の順番が異なるので、同じ、引数の型を使っていても異なるシグニチャとみなされます。
ゴールデンウィークも資格取得に向けて勉強してみましたが、あまり成長を感じずでやる気減少中です。