Javaはクラスでプログラムを構成するのですが、初学者の方はクラスの感覚をつかみかねている方が多いと感じます。特にプログラミングを学校の講義でのみ学習されている方やVBAなど手続き型ベースで実装されてきている方にとって、クラスでデータ構造を表現するのは難しいようです。こんな風に:
先生!クラスって要るんですか?
なんですと!
要るに決まってるじゃないですか!!!
私も実は…
クラスが無くてもプログラムが作れるんじゃないかって思うんですけど…
配列でデータは表現できるし…
と、いう具合にJavaで配列は理解できてもクラスでつまづかれる方が多いです。
クラスを使うメリットが分からないから、クラスが要らないのではと考えてしまうんですね…(;´∀`)
そこで!
クラスがあるとこんなに便利!ということをお伝えしたいと思います。
ここでは簡単な例題を通して、手続き型ベースからオブジェクト指向に頭を切り替えるためのプログラム例を提示したいと思います。
例題:名簿の作成
名簿は各個人の情報がリスト状に保存されたものですね。
以下のようなデータを考えることにします:
ID | 姓 | 名 | 性別 | 年齢 |
---|---|---|---|---|
1 | 田中 | 一郎 | 男 | 42 |
2 | 鈴木 | 次郎 | 男 | 25 |
3 | 高橋 | 花子 | 女 | 33 |
4 | 佐藤 | 唯 | 女 | 25 |
5 | 小野 | 真理 | 女 | 22 |
このデータを表示するプログラムを作ってください。
データはソースコード中に埋め込み構いません。
できました!
ソースコード “PersonList.java”:
public class PersonList { public static void main(String[] args) { String[][] persons = { {"1", "田中", "一郎", "男", "42"}, {"2", "鈴木", "次郎", "男", "25"}, {"3", "高橋", "花子", "女", "33"}, {"4", "佐藤", "唯", "女", "25"}, {"5", "小野", "真理", "女", "22"} }; System.out.println("ID 姓 名 性別 年齢"); for(int i = 0; i < persons.length; i++) { for(int j = 0; j < persons[i].length; j++) { System.out.print(persons[i][j] + " "); } System.out.println(); } } }
出力:
ID 姓 名 性別 年齢 1 田中 一郎 男 42 2 鈴木 次郎 男 25 3 高橋 花子 女 33 4 佐藤 唯 女 25 5 小野 真理 女 22
うん、そうですね。
要件は満たしている。
けど、もうひと声なんだよな~
配列を使った表現の場合、すべて同じ型にする必要が出てきてしまい、今回はString型ですべてを表現しています。
姓、名はもちろんStringで構わないのですが、ID、年齢は整数型(int)で表した方がのちのちの処理で便利でしょうし、各項目、例えば「名」はインデックスが2であると覚えていないと「名」を取り出して処理することができません。
クラスを使うとこうなりますよ。
ソース “Person.java”:
public class Person { int id; String firstName; String familyName; int gender; int age; Person(int id, String familyName, String firstName, int gender, int age) { this.id = id; this.familyName = familyName; this.firstName = firstName; this.gender = gender; this.age = age; } }
ソースコード “PersonList2.java”:
public class PersonList2 { public static void main(String[] args) { Person[] persons = { new Person(1, "田中", "一郎", 0, 42), new Person(2, "鈴木", "次郎", 0, 25), new Person(3, "高橋", "花子", 1, 33), new Person(4, "佐藤", "唯", 1, 25), new Person(5, "小野", "真理", 1, 22) }; System.out.println("ID 姓 名 性別 年齢"); for(int i = 0; i < persons.length; i++) { Person p = persons[i]; System.out.println(p.id + " " + p.familyName + " " + p.firstName + " " + (p.gender == 0 ? "男" : "女") + " " + p.age); } } }
おお~!
なんかわかりやすい気がする!
一人分のデータをPersonにまとめているんですね!
そのおかげでメインの処理が追いやすくなってる…。
そうなんです。
一件のデータを表現するクラスをPersonとしているんです。
こうすることで、例えば姓はfamilyNameとして参照し、年齢はageとして参照できる。配列を使うよりはっきりしますよね。実際、業務のプログラムではデータベースから取得したレコード(一件のデータ)をクラスに変換して扱いますから、このプログラムはその入門編と言えます。
ただ、今回の例ではid、ageなど直接参照していますが、本格的な作り方だとカプセル化が必要となるのでもう少しプログラムに手を加える必要があることを付け加えておきます、
まとめ
今回は変数、条件分岐、繰り返し処理、配列まで学習された方に対して、クラスを感覚的に理解していただけるようにサンプルプログラムをお見せしました。このように一件のデータをオブジェクトとして捉えて、それを作り出すためのクラスを考えられるようになるとオブジェクト指向の理解が1ステップ上がると思います。皆さん、世の中を見るときに何がオブジェクトになるかな、クラスにするにはどうすればいいかな、という目で見ると、プログラミングのスキルも向上すると思いますよ。やってみてくださいね!