Javaを使用してコンソールで操作するBMI計算機アプリケーションを作成する方法を解説します。この記事では、オブジェクト指向プログラミングの原則を活用し、レコードクラスを使用した効率的なデータ構造の実装から、BMI計算ロジックの構築、そしてユーザーインターフェースの作成を紹介します。
はじめに
この記事のコードをコピペしてEclipseで出力結果を確認してみよう!
コンソールで操作するBMI計算機アプリ作成
以下のメモ帳アプリを作成します。
BMI計算機へようこそ!
身長(cm)を入力してください: 175
体重(kg)を入力してください: 70
あなたのBMIは 22.86 です。
カテゴリー: 普通体重
コード例
- クリックするとコードが表示されます。
BMICalculator.javaでメインアプリケーションロジックとユーザーインターフェースを実装
import java.util.Scanner;
/**
* BMI計算機のメインクラス
*/
public class BMICalculator {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.println("BMI計算機へようこそ!");
System.out.print("身長(cm)を入力してください: ");
double height = scanner.nextDouble();
System.out.print("体重(kg)を入力してください: ");
double weight = scanner.nextDouble();
var person = new Person(height, weight);
double bmi = BMIUtil.calculateBMI(person);
String category = BMIUtil.getBMICategory(bmi);
System.out.println("あなたのBMIは " + String.format("%.2f", bmi) + " です。");
System.out.println("カテゴリー: " + category);
} catch (Exception e) {
System.out.println("エラーが発生しました: " + e.getMessage());
}
}
}
BMIUtil.javaでBMI計算とカテゴリー判定を実装
/**
* BMI計算のユーティリティクラス
*/
public class BMIUtil {
/**
* BMIを計算する
* @param person 人物データ
* @return 計算されたBMI値
*/
public static double calculateBMI(Person person) {
return person.weight() / Math.pow(person.getHeightInMeters(), 2);
}
/**
* BMI値からカテゴリーを判定する
* @param bmi BMI値
* @return BMIカテゴリー
*/
public static String getBMICategory(double bmi) {
return switch ((int) bmi) {
case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 -> "低体重";
case 19, 20, 21, 22, 23, 24 -> "普通体重";
case 25, 26, 27, 28, 29 -> "過体重";
default -> "肥満";
};
}
}
Person.javaでレコードクラスを使用し、効率的な個人データ構造を実装
/**
* 人物データを表すレコードクラス
*/
public record Person(double height, double weight) {
/**
* コンストラクタ
* @param height 身長(cm)
* @param weight 体重(kg)
*/
public Person {
if (height <= 0 || weight <= 0) {
throw new IllegalArgumentException("身長と体重は正の値でなければなりません。");
}
}
/**
* 身長をメートル単位で返す
* @return 身長(m)
*/
public double getHeightInMeters() {
return height / 100;
}
}
BMICalculator.javaの解説
パッケージのインポート:
import java.util.Scanner;
これは、ユーザーからの入力を受け取るために必要なScannerクラスをインポートしています。
クラスの定義:
public class BMICalculator {
// ...
}
BMICalculatorという名前の公開クラスを定義しています。これがプログラムのメインクラスになります。
mainメソッド:
public static void main(String[] args) {
// ...
}
これはプログラムのエントリーポイントです。Javaプログラムはここから実行を開始します。
try-with-resources文:
try (Scanner scanner = new Scanner(System.in)) {
// ...
} catch (Exception e) {
// ...
}
これは例外処理とリソース管理を行います。Scannerオブジェクトを自動的に閉じる機能も含まれています。
ユーザー入力の受け取り:
System.out.print("身長(cm)を入力してください: ");
double height = scanner.nextDouble();
System.out.print("体重(kg)を入力してください: ");
double weight = scanner.nextDouble();
ユーザーに身長と体重の入力を促し、scanner.nextDouble()メソッドで数値を読み取ります。
Personオブジェクトの作成:
var person = new Person(height, weight);
入力された身長と体重を使って新しいPersonオブジェクトを作成します。
BMIの計算とカテゴリーの取得:
double bmi = BMIUtil.calculateBMI(person);
String category = BMIUtil.getBMICategory(bmi);
BMIUtilクラスの静的メソッドを使用して、BMIを計算し、そのカテゴリーを取得します。
結果の表示:
System.out.println("あなたのBMIは " + String.format("%.2f", bmi) + " です。");
System.out.println("カテゴリー: " + category);
計算されたBMI値(小数点以下2桁に整形)とカテゴリーを表示します。
例外処理:
catch (Exception e) {
System.out.println("エラーが発生しました: " + e.getMessage());
}
プログラム実行中にエラーが発生した場合、ユーザーにエラーメッセージを表示します。
このプログラムは、ユーザーから入力を受け取り、BMIを計算し、結果を表示するという一連の流れをオブジェクト指向的に実装しています。また、例外処理を使用してエラーにも対応しており、堅牢なプログラムとなっています。
BMIUtil.javaの解説
クラスの定義:
public class BMIUtil {
// ...
}
BMIUtilという名前の公開クラスを定義しています。これはBMI計算に関連するユーティリティメソッドを含むクラスです。
calculateBMIメソッド:
public static double calculateBMI(Person person) {
return person.weight() / Math.pow(person.getHeightInMeters(), 2);
}
- このメソッドは静的(static)メソッドで、クラスのインスタンスを作成せずに呼び出すことができます。
- Personオブジェクトを引数として受け取り、BMIを計算して返します。
- 計算式は 体重(kg) / (身長(m)の2乗) です。
- Math.powメソッドは、指定された数値を指定された指数で累乗します。
getBMICategoryメソッド:
public static String getBMICategory(double bmi) {
return switch ((int) bmi) {
case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 -> "低体重";
case 19, 20, 21, 22, 23, 24 -> "普通体重";
case 25, 26, 27, 28, 29 -> "過体重";
default -> "肥満";
};
}
- これも静的メソッドです。
- BMI値を引数として受け取り、対応するカテゴリーを文字列で返します。
- この方法は拡張switch文を使用しています(Java 14以降の機能)。
- switch式は、BMI値の整数部分に基づいてカテゴリーを決定します。
->
はラムダ式を示し、各ケースに対する返り値を指定しています。
- BMIカテゴリーの分類:
- 0-18: 低体重
- 19-24: 普通体重
- 25-29: 過体重
- 30以上: 肥満
Javadocコメント:
/**
* BMI計算のユーティリティクラス
*/
/**
* BMIを計算する
* @param person 人物データ
* @return 計算されたBMI値
*/
/**
* BMI値からカテゴリーを判定する
* @param bmi BMI値
* @return BMIカテゴリー
*/
これらはJavadocコメントで、クラスやメソッドの説明、パラメータ、戻り値などを記述します。これらのコメントは自動的にドキュメントを生成するのに使用されます。
このクラスは、BMIの計算とカテゴリー判定という2つの主要な機能を提供しています。これらのメソッドは静的であるため、他のクラスから簡単に呼び出すことができ、BMI関連の操作を集中管理できる設計になっています。
Person.javaの解説
レコードクラスの定義:
public record Person(double height, double weight) {
// ...
}
- これはレコードクラスの定義です(Java 16以降の機能)。
- レコードは不変のデータ構造を簡潔に表現するための特殊なクラスです。
height
とweight
はコンポーネントと呼ばれ、自動的にprivateフィールドとpublicアクセサメソッドが生成されます。
コンストラクタ:
public Person {
if (height <= 0 || weight <= 0) {
throw new IllegalArgumentException("身長と体重は正の値でなければなりません。");
}
}
- これはコンパクトコンストラクタと呼ばれる特殊なコンストラクタです。
- コンストラクタ内で入力値の検証を行っています。
- 身長または体重が0以下の場合、IllegalArgumentExceptionをスローします。
カスタムメソッド:
public double getHeightInMeters() {
return height / 100;
}
- これはカスタムメソッドです。
- 身長をセンチメートルからメートルに変換して返します。
Javadocコメント:
/**
* 人物データを表すレコードクラス
*/
/**
* コンストラクタ
* @param height 身長(cm)
* @param weight 体重(kg)
*/
/**
* 身長をメートル単位で返す
* @return 身長(m)
*/
これらはJavadocコメントで、クラスやメソッドの説明、パラメータ、戻り値などを記述します。
レコードクラスの特徴:
- 自動生成されるメソッド:
equals()
,hashCode()
,toString()
, および各フィールドのgetter(例:height()
,weight()
)が自動的に生成されます。 - 不変性: レコードのフィールドは自動的に
final
になります。 - 簡潔性: 通常のクラスと比べて、はるかに少ないコードで同様の機能を実現できます。
このレコードクラスは、人物の身長と体重のデータをカプセル化し、そのデータの整合性を保証するための基本的な検証を行っています。また、BMI計算に必要な身長のメートル単位への変換メソッドも提供しています。
レコードクラスを使用することで、データ中心のクラスを簡潔に表現でき、ボイラープレートコード(定型的に書かれるコード)を減らすことができます。これは特にデータ転送オブジェクト(DTO)や値オブジェクトの実装に適しています。
まとめ
- BMICalculator.javaでメインアプリケーションロジックとユーザーインターフェースを実装
- BMIUtil.javaでBMI計算とカテゴリー判定のユーティリティメソッド
- Person.javaでレコードクラスを使用し、効率的な個人データ構造を実装
- 例外処理とtry-with-resources文を使用した堅牢なエラーハンドリング
- Javadocコメントを通じて、ドキュメンテーションの重要性と方法
- レコードクラスの特徴と利点を理解し、適切な使用方法
このBMI計算機アプリケーションの作成を通じて、Javaプログラミングの高度な概念と実践的なスキルを身につけることができます。クラス設計、データのカプセル化、ユーザー入力の処理、計算ロジックの実装など、実際のアプリケーション開発で必要となる重要な要素を学ぶことができます。
特に、レコードクラスの使用は、Javaの最新機能を活用した効率的なコーディングの例を示しています。これにより、コードの簡潔さと可読性の向上を実現しています。
また、追加の機能(例:履歴保存、グラフ表示、複数の計算方法など)を実装することで、さらに複雑なアプリケーションへと発展させることができます。
コメント