今回の問題を解いて理解を深めましょう。
問題
次のクラスを正しく動作させるためには、どのメソッドを完成させる必要があるでしょうか?正しい選択肢を選んでください。
class Calculator {
int add(int a, int b) {
return a + b;
}
double multiply(double a, double b) // ここを完成させる
{
// missing code
}
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // 出力: 8
System.out.println(calc.multiply(3.0, 4.0)); // 出力: 12.0
}
}
選択肢
- A. { return a * b; }
- B. { return (int) (a * b); }
- C. { return (float) a * b; }
- D. { return String.format(“%.2f”, a * b); }
答えと解説
回答を見る
答え
A. { return a * b; }
解説
基本説明
問題の文脈にあるように、メソッドmultiply
は二つのdouble型の引数を取り、
その積を返すためのメソッドです。戻り値の型もdouble型であるため、引数として与えられた
a
とb
を単純に乗算し、その結果を返すだけで十分です。
よって、正しい実装は{ return a * b; }
になります。
誤答理由
選択肢Bでは、return (int) (a * b);
とあり、結果をint型に型変換しています。
型変換を行うと整数部のみが返され、小数部が切り捨てられるため、double型の正確な計算結果を
返せません。
同様に選択肢Cでは(float) a * b;
としていますが、この場合も結果はfloat型になり、
double型として期待される精度を満たさない可能性があります。
選択肢Dは、String型を返すため、予めdouble型を返すと宣言された メソッドには相応しくないです。
つまずきポイント
初学者が間違いやすいポイントの一つとして、型変換に伴う精度の喪失があります。 例えば、多くの言語においてはdouble型やfloat型の違いによる計算誤差が生じ、 計算結果が不正確になってしまうことがあります。
また、特に戻り値の型を意識せずに実装を行うことがありますが、Javaでは メソッドの戻り値の型は極めて重要です。
発展知識
引数と戻り値に関する設計では、常にメソッド内での計算精度と返すべき値に 適したデータ型を考慮しなければなりません。
Javaでは初期のうちからわかりやすく型の重要性を示し、 特に数値を扱う際の精度の違いを知識として蓄えておくことが重要です。
現代的なプログラミングでは、非整数型の計算結果を扱うことが頻繁にあります。 これらの型と計算上の考慮すべき注意点を常に意識しておくと良いでしょう。