疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】独自クラスで新しい型の作成と利用

複数の変数を扱う上で便利なのが今回のテーマである独自クラスです。
勝手に独自クラスと言っていますがなんて言うのが一般的なのでしょう。
自作クラス?それとも単にクラス?
今回は独自クラスの作成から利用までご紹介させていただきます。

まずは独自クラスを使わない方法でサンプルコードを記述してみます。
変数の内容は「名前」と「年齢」とします。

Study.java

public class Study {
	public static void main(String[] args) {
		String name;	//名前
		int age;	//年齢

		name = "たろう";
		age = 25;
		System.out.println("名前 : " + name + " 年齢 : " + age);

		name = "はなこ";
		age = 23;
		System.out.println("名前 : " + name + " 年齢 : " + age);
	}
}

nameに名前、ageに年齢となる値を代入し表示しています。


続いて独自クラスを用いて同じ処理を行ってみます。

Student.java

public class Student {
	String stuName;	//名前
	int stuAge;	//年齢

	public Student(String stuName,int stuAge) {
		this.stuName = stuName;
		this.stuAge = stuAge;
	}
}

Study.java

public class Study {
	public static void main(String[] args) {
		Student student;

		student = new Student("たろう",25);
		System.out.println("名前 : " + student.stuName + " 年齢 : " + student.stuAge);
		student = new Student("はなこ",23);
		System.out.println("名前 : " + student,stuName + " 年齢 : " + student.stuAge);
	}
}

実行結果はどちらも以下の様になります。

実行結果

名前 : たろう 年齢 : 25
名前 : はなこ 年齢 : 23


どうでしょう。これだけだと便利なのか微妙な線ですね。
独自クラスを使った方が見た目はシンプルかなと思いますが。


ではListを使った場合はどんな具合でしょうか。

Study.java

import java.util.ArrayList;
import java.util.List;

public class Study {
	public static void main(String[] args) {
		List<Student> studentList = new ArrayList<Student>();

		studentList.add(new Student("たろう",25));
		studentList.add(new Student("はなこ",23));
		studentList.add(new Student("しんじ",27));

		for(Student student : studentList) {
			System.out.println("名前 : " + student.stuName + " 年齢 : " + student.stuAge);
		}
	}
}

実行結果

名前 : たろう 年齢 : 25
名前 : はなこ 年齢 : 23
名前 : しんじ 年齢 : 27

なんとなくいい感じに見えますね。
List<独自クラス>という使い方はよく見かけます。
たしかに使い勝手も良いですしスマート。


最初の頃は独自クラスなんてよくわからなかったので使っていませんでした。
理解する上では、独自の型という認識でいいのかなと思います。
元々使用可能なint型、boolean型、double型などに加えて自前の型を用意する感じ。

代入する際にnew 独自クラス名()という書き方をします。
これはその型のオブジェクトを生成しているということになります。
ん?なにそれって感じかもしれませんがStudent.javaを見てください。

public Student(String stuName,int stuAge) {
	this.stuName = stuName;
	this.stuAge = stuAge;
}

Stringとintを引数に持つコンストラクタが存在します。
これをnewで呼ぶことにより、その引数の値が入ったStudent型のインスタンスが生成されます。

thisというのはフィールド(メンバ変数)を指します。
大概コンストラクタの引数の名前とフィールドの名前は同じ名前にします。
なのでthisが付いている方がフィールドという区別です。
もし違う名前であればthisがなくても代入可能。
ただ、それでも付けておいた方が丁寧だとは思います。

現状の私の捉え方としては
・複数の配列を作らなければならなくなる
・Listに複数の変数を格納したい
みたいな時に独自クラスとして新しい型を作ったら良いのかなという認識です。

独自クラスについてどうでしょうか。
少しでも理解が深まれば幸いです。