「50点未満だと不合格にする」JavaのプログラムからJavaのstatic変数・フィールド・メソッド・オブジェクトなどの概念を解説
昔、勉強で書いたJavaのプログラムが出てきたので紹介。
「50点未満だと不合格にするプログラム」ってやつ。
俺と助さん角さんは合格して、手下Aと手下Bは不合格になりました、みたいな処理をする。
package gyakutorajiro;
import java.lang.System;
/*↑この一行はなくてもいい(注1)*/
import java.util.Scanner;
/*↑(注2)*/
public class RoopAndRoop {
public RoopAndRoop(Persons jyukensha) {
/*↑(注3)*/
System.out.println(“平均:” + jyukensha.getAverage() + “点”);
}
public static void main(String[] args) {
/*↑(注4)*/
Scanner scan = new Scanner(System.in);
/*↑(注5)*/
while (true) {
System.out.print(“得点を入力:”);
int score = scan.nextInt();
/*↑(注6)*/
if (score > 50) {
/*↑50点超えたら合格ってことにした。*/
System.out.println(“おめでとう!合格”);
Persons jyukensha = new Persons();
/*↑ここでは、オブジェクトを生成してる。(注7)*/
jyukensha.makejyukensha1();
/*オブジェクトにフィールドを定める。(注8)*/
jyukensha.Disp(); // Disp(jyukensha);
break;
} else if (score >= 50) {
System.out.println(“50点以下、どんまいです。”);
Persons jyukensha = new Persons();
jyukensha.makejyukensha2();
jyukensha.Disp();
break;
} else if (score < 0) {
break;
}
}
scan.close();
}
}
「/*~*/」で囲ってる部分はコメント部分の箇所だから、実際のプログラムでは処理されない。
【コードの詳細解説】
(注1)よく省略される一行。だけど実は「java.langパッケージのSystemクラスをインポートしている」という処理だから、初心者は覚えておいた方がいい。省略されていても、勝手にインポートされている。
(注2)こいつはjava.utilっていうパッケージ。Scannerっていうクラスがあるんだな、たぶん。
(注3)”()”の中身の「Persons jyukensha」は何か?
試しにこの中身を消したら後述のコード、
「java.lang.System.out.print(jyukensha.String());」
「System.out.println(“平均:” + jyukensha.getAverage() + “点”);」
の2行でエラーが出て、結果が出せなくなった。
ここはEclipseの提案にしたがって、渋々「public RoopAndRoop(Persons jyukensha) {」っていう風に変更した。
これはコンストラクタらしい、本によれば。
コンストラクタもメソッドの一種だが、
・オブジェクトが生成されたときに自動的に呼びされる。
・コンストラクタのメソッド名は必ずクラス名と一致して、戻り値の型を指定できない。
・戻り値がなくてもvoidを記述するのはNGで、記述するとコンストラクタとしては認められない。
みたいな性質があるとかないとか。
初期化はフィールドで行うかコンストラクタで行うか – Neareal
によると、フィールドで初期化、コンストラクタで初期化、2パターンあるみたいだな。
変数は宣言したから必ず初期化しないといけない、
の記事で証明されてた。
「つまり変数では必ず宣言したら初期化する必要があります。」って。
プログラミングでは当たり前のことだけど、自分はそれさえ判っていなかったな。
上のリンクの記事にも記載されている「public static void main(String[] args)」って、Javaでよく見かけるよな。
「static void」は、Systemクラスに属するメソッドだった。
オラクルのサイトに記載されているから間違いない。
voidは、int型とかdouble型とかと似たような、「戻り値が必要ない」って意味の関数の型だとよ。
staticってのは「静的」で、非staticってのもあるらしいが、よくわからない。
省略してエラーにならんかったし、よく判らないコードは邪魔だから、ここではstaticは消した。
でも詳しく調べると、奥は深い。
【Java】 staticって何? | 一番かんたんなJava入門
を読むと、「staticな変数やメソッドにはその宣言部分にstaticと書く必要がある」らしい。
書いてなかったら非static。
においては、「countを取得する。」メソッドである「public static int getCount()」はstaticってことか。
staticだとクラス変数、非staticだとインスタンス変数。
変数がインスタンスではなくクラスに紐づくのがクラス変数、それはstaticな変数・メソッド…。
そう、こんな感じでJavaを勉強してたんだけど、挫折したんだよな~。
「public void」の方がまだ判る。
publicとかってのは、型の前に記述する修飾子で、4種類ぐらいしかないみたいだし。
「すべてのクラスからアクセスできますよ」ってことでpublic。
(注4)この1行、有名だよな。「public static void main(String[] args)」は実は、メソッドの定義のことだったんだ。
メソッドってのは、Javaプログラムで必ず必要になる「クラスの宣言」をする際、定めなければいけない「操作の中身」みたいなことらしい。
あと、クラスを宣言する際はメソッドの他に「フィールド」ってのも定めないといけないみたいだが、それは操作っていうか「属性」を定義することらしい。
だからクラスってのは「この属性とこの操作があるべきっていう設計書」みたいなものだって。
(注5)Scannerクラスってのを呼び出した。Oracle Docsにいろいろ説明がある。
「System.in から数値を読み込むことができます。」とか。
(注6)変数の名前のことを識別子っていうらしく、予約語っていうやつ以外、大体は任意の値でOKらしい。
ここでは得点をわかりやすく表現するためにscoreっていう識別子にすることにした。
intってのは「型」らしく、変数を使うには必ず指定しないといけない。
この型は32ビット使うらしいが、何で32ビットかというと、int型は「符号付整数(を表現するための型」だからだ。
2の32乗だから、4294967296、約43億。
つまり、43億通りの整数が表現できるってこと。
(注7)オブジェクトってのは「クラスの型」みたいなもの。
複雑なオブジェクトがあって、それを単純明快にするために、共通の特徴をまとめて扱う機能を持つのがクラス。
ここでは、このファイルだけでオブジェクトを再現するのは複雑だと俺は判断したから。
Personsクラスってのを作った。人の情報、いわやる名簿だな。
そういうのはPersonsクラスにまとめちゃって、扱いやすいようにしてやるんだ。
これが「オブジェクト指向」というやつね。
話を戻すと、ここでやってる「オブジェクトの宣言」は、ルールとして、前のコードで出た「int score」と同じようなもんだ。
クラスってのは型、int型と同じく、Personsってのも、まあクラス名は自分で任意で名付けられるから変数とこんがらがるかもしれんが、Personsっていうクラスの中で、変数jyukenshaを生成した。
ちなみに、
Persons jyukensha; jyukensha = new Persons();
と、宣言と生成を分けて記述する方法もあるらしい。初心者にはこっちの方がいいのかもな。
このjyukenshaっていうのは、オブジェクトを扱う変数、オブジェクト参照型の変数、というらしい。
(注8)フィールドは「オブジェクト参照型の変数の後にドット(.)と続けてフィールド名を入れる」ことで、定められる。
ここでは、makejyukensha1フィールドを作成した。
俺、助さん、角さんの3人は、50点以上で合格したってことにするから、3人のメンバーが入る予定。
以上、javaのプログラムを例にして、用語とか概念も解説できたと思うけどな。
実はこのコード、自分が名付けた「RoopAndRoop.java」だけど。
このファイル単体では動かないんだ。
残り2ファイルある。
でもその2ファイルが、どこかにいってしまったんだよな…。