Person クラスを作る
名前と年齢が、いつまでも別々に旅をする
いま、人 1 人ぶんの情報は String name と int age という 2 本の変数です。この 2 本は、コードの上では何のつながりもありません。関係を知っているのは書いた人の頭の中だけです。
Java
String name = "太郎";
int age = 25;
send(name, age);
save(age, name); // 順番を取り違えた3 人ぶんになれば変数は 6 本、そこに住所が加われば 9 本です。メソッドに渡すたびに順番と個数を合わせる必要があり、型が違えばコンパイラが止めてくれますが、String が 2 本並んだ瞬間に何の守りもなくなります。
関係のある値を 1 つの型にまとめる
これを片付ける道具が class です。まとめてしまえば、持ち運ぶのは変数 1 本になります。クラスに入れるものは次の 3 つです。
Java
class TodoItem {
String title;
boolean done;
TodoItem(String title, boolean done) {
this.title = title;
this.done = done;
}
String label() {
return done ? "[済] " + title : "[ ] " + title;
}
}上から順に、持っているデータ (フィールド)、生まれるときの受け取り口 (コンストラクタ)、できること (メソッド) です。この 3 つが揃うと、title と done は二度と別々に旅をしません。使う側はこう書きます。
Java
TodoItem t = new TodoItem("牛乳を買う", false);
System.out.println(t.label()); // [ ] 牛乳を買うlabel() は引数を 1 つも取っていません。表示に必要な値は、自分の中にすでにあるからです。「引数で毎回渡す」から「自分が持っている」へ変わったのが、クラスを使う一番の変化です。
Java では本来
TodoItem.javaという別ファイルにクラスを分けます。ただしこの演習エディタは 1 ファイルしか扱えないので、Solutionクラスの中にstatic class TodoItem { ... }と入れ子で書きます。このstaticは「外側のSolutionに紐づく内側のクラス」という意味で、メソッドのstaticとは別の話です。
やってみよう
右のエディタで personIntroduction(String name, int age) を完成させます。ただし、受け取った 2 つをその場でつなぐのではなく、Person クラスを自分で組み立ててから使ってください。
Solution の中に入れ子で Person を書き、名前と年齢のフィールドを持たせ、コンストラクタで受け取り、自己紹介の文字列を返すメソッドを 1 つ足します。personIntroduction の仕事は、new で 1 人ぶん作って、そのメソッドを呼んで返すだけになります。返す書式は課題の要件どおりに、カッコと半角スペースの位置まで合わせてください。
緑になったら、Person を 2 人ぶん作って、それぞれのメソッドを呼んでみてください。同じクラスから生まれても、中身は互いに干渉しません。設計図は 1 枚、そこから作られる実体は何個でも、という関係が手で確かめられます。
要件
- クラス名は
Solution、メソッド名はpersonIntroduction、引数はString nameとint ageの 2 つにすること - メソッドの戻り値の型は
Stringで、"name (age)"の形式 (名前のあとに半角スペース、(、年齢、)を続ける) で返すこと Person内部クラスを定義し、new Person(name, age)でインスタンスを作ってintroduce()を呼び出す流れで実装すること
入出力例
personIntroduction("太郎", 25) → "太郎 (25)"
personIntroduction("花子", 30) → "花子 (30)"
personIntroduction("Alice", 18) → "Alice (18)"
personIntroduction("赤ちゃん", 0) → "赤ちゃん (0)"
personIntroduction("長寿さん", 100) → "長寿さん (100)"