引数を受け取るメソッド
何度呼んでも、同じ結果しか返ってこない
前のレッスンで作った printLine() は、いつ呼んでも同じ長さの線を引きます。表の幅に合わせて長さを変えたくなったら、どうしましょうか。printLine10() と printLine20() を別々に作る手はあります。ただし幅が変わるたびにメソッドが 1 つ増えていき、結局コピペに戻ってしまいます。
必要なのは、呼ぶ側から「今回は 10 本」と伝える口です。それが引数です。
() は、外から値を受け取る置き場
Java
public class Report {
public static void printLine(int width) {
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println();
}
}() の中の int width が引数の宣言です。int を 1 つ受け取り、中では width という名前で扱う、という意味になります。呼ぶときは printLine(10) と書けば 10 本、printLine(3) なら 3 本。メソッドは 1 つのままで、結果が呼ぶたびに変わります。
書き方の鉄則は、型を先に、名前をあとです。printLine(width) のように型を省くと、Java は width が何なのか分からないと言ってコンパイルを止めます。
渡っているのは値のコピー
Java の引数は値渡しです。呼び出し側の変数そのものではなく、その値のコピーが引数に入ります。
Java
public static void bump(int n) {
n = n + 1; // ここで増やしても
}
// 呼び出し側
int count = 3;
bump(count);
// count は 3 のままメソッドの中で引数を書き換えても、呼び出し側は無傷です。うっかり壊される心配がないので、安心して中でいじれます。
引数の名前と、呼び出し側の変数名も無関係です。呼ぶ側が count、受け取る側が n でもまったく問題ありませんし、たまたま両方 n でも別の入れ物として扱われます。渡っていくのは値だけで、名前は渡りません。
やってみよう
Solution.square(int n) を完成させましょう。int を 1 つ受け取り、その 2 乗を返します。
テストには -4 が混ぜてあります。マイナスとマイナスを掛けるとプラスになるので、答えは -16 ではなく 16 です。符号を特別扱いする分岐は要りません。
動いたら、引数の名前を n から value に変えて、それでもテストが通ることを確かめてください。名前は呼ぶ側とつながっていない、という感覚がここで掴めます。
要件
- クラス名は
Solution、メソッド名はsquareにすること - 引数は
int nの 1 つだけ、戻り値の型はintにすること - 戻り値は
nの 2 乗 (n * n) であること。負の数を渡されてもプラスの値を返すこと
入出力例
square(3) → 9
square(-4) → 16
square(0) → 0
square(1) → 1
square(10) → 100
square(-7) → 49