Product クラスを定義せよ
問題のポイント
ここで初めて「クラス」を自分で定義する。
プログラミングの中でも重要な概念、それがクラス。
「商品名」と「在庫数」──この2つの情報を1つのまとまりにする、それがクラスの役目だ。データを扱うとき、“構造”を自分で作れるようになるかどうかで、
「ただ書ける人」と「設計できる人」に分かれる。
まず、日本語で考えろ
- 商品は「名前」と「在庫数」のセットである
- それを1つのクラス(Product)で表現したい
- クラスには以下が必要:
- フィールド:名前・在庫数
- コンストラクタ:2つの値を受け取る
- ゲッターメソッド:それぞれの値を返す
コメントを書け
// 商品名(name)と在庫数(stock)を保持するクラス
// コンストラクタで2つの値を受け取る
// getName と getStock メソッドで値を返す
コメントに従ってコードを書け
public class Product {
private String name;
private int stock;
// コンストラクタ
public Product(String name, int stock) {
this.name = name;
this.stock = stock;
}
// 商品名を返す
public String getName() {
return name;
}
// 在庫数を返す
public int getStock() {
return stock;
}
}
コードの解説
private String name; private int stock;
このクラスが持つ“データの中身”を定義している。
外部から直接いじらせないようにprivate
を付けているのがポイント。
public Product(String name, int stock)
クラスを使ってインスタンス(実体)を作るときに呼ばれるのがコンストラクタ。
受け取った値をフィールドに代入することで、初期化が完了する。
this.name = name;
左側がフィールド、右側が引数。名前が同じなのでthis
を使って区別する。
getName()
/getStock()
外部からname
やstock
を参照できるようにするためのメソッド。
値は読み取れるけど、直接変更はできない──これが安全設計の基本。
つまづきやすいポイント
this
ってなんだ?メソッドの引数
name
と、フィールドname
が同じ名前になっているから、this.name
という形で「こっちはフィールドの方ね」と明示する。
この区別をしないと、引数のname
をname
に代入して終わることになる(=意味がない)。なぜ
private
にするのか?クラスの中のデータを外部から勝手に書き換えられないようにするため。
これは「カプセル化」と呼ばれるオブジェクト指向の基本思想。
データは守り、操作はメソッドを通して行う。
teshのひとこと
配列やリストで“並べる”だけじゃ、まだプレイヤーだ。
クラスを書き始めたとき、おまえは“設計者”になる。データをどうまとめるか?
どうやって隠すか? どうやって外から触らせるか?それを考えるようになったとき、コードはただの作業じゃなくなる。
Just keep typing, baby.
「何をひとつと見なすか」──そこにおまえの設計が現れる。
他のステップや学習順序を確認したい場合は、
[配列修羅道:全体のステップ構成] をチェックしてくれ。