2019/02/06
sponsored link
オブジェクト指向?
プログラミングを勉強している人なら、オブジェクト指向って聞いたことありますよね?
経験豊かなベテランさんでもオブジェクト指向というものの解釈は一筋縄ではいかないようなものらしいので、シロウトの僕には正直、オブジェクト指向のことを語る程の経験も知識もございません。
が、オブジェクト指向の概念を語ることはできなくても、オブジェクトを作ることはできます。オブジェクト指向を理解する為にはオブジェクトというのはどういうもので、どうやって使うのか?をしっかり理解することが先決だと思います。
とりあえず難しいことは考えずにオブジェクトを作ってみましょう。
オブジェクトを作る為のクラス
「オブジェクト」というのは直訳すると「物」です。物理的な物体を表すこともあれば、そうでないこともあります。
今回はHumanオブジェクトを作ってみましょう。Humanつまり人間です。
Humanオブジェクトを作る為にHumanクラスを書きます。今までもクラスを書いてきましたよね。クラスの中のmainメソッドの中に、if文やfor文を使っていろんなプログラムを書いていました。
今までmainメソッドの中に何を書いていたかというと、これをこうして、あれをこうして・・という風に「手続き」を書いていました。オブジェクト作るには、手続きを書くmainメソッドを持つクラスとは別に、オブジェクトを作る為のクラスを書く必要があります。
同じクラスという括りですが、手続きを書くためのクラス(mainメソッドがあるクラス)とオブジェクトを作るためのクラスは、まったく別物と思っていたらいいと思います。
ではHumanオブジェクトを作るためのHumanクラスを書いていきます。eclipseを使ってやりますよー。
↑こんな感じでプロジェクトを新規作成して、その中のsrcというフォルダの中にパッケージを新規作成して、そのパッケージの中にHumanクラスを新規作成します。プロジェクト名とパッケージ名は何でもいいので好きなようにどうぞ。
オブジェクトを作るためのクラス(Humanクラス)にはmainメソッドは要りません。HumanクラスにはHumanオブジェクトがどういうものなのかを書いていきます。
まずは、Humanオブジェクトに「名前」というパラメータを持たせましょう。
Human.java
public class Human{ String name; }
「我輩は人間である。名前だけはある。」ってなもんで、名前しかありません。しかし、さすがに名前だけではちょっと寂しいので、Humanオブジェクトは生年月日も設定できるようにしましょう。人間なら誰でも生年月日がありますもんね。
Human.java
public class Human{ String name; int birthday; }
できました。名前と生年月日をパラメータに持つ人間オブジェクトです。って言ってもパラメータに値が入っていませんね。さっそく入れましょう。
Human.java
public class Human{ String name = "ノブオ"; int birthday = 19770101; }
はい。これでノブオという名前の1977年1月1日生まれの人間オブジェクトの完成です。・・ってそうじゃないんです!!
オブジェクトを作るためにHumanクラスを書くんですが、それ自体がオブジェクトではないんです。クラスはあくまでオブジェクトの設計図でしかありません。
HumanクラスはいろんなHumanオブジェクトを作り出す為のテンプレートみたいなものなんです。だから、パラメータは埋めたらダメです。オブジェクトを作る為のクラスはあくまでただの設計図・テンプレートなので、こんなパラメータを持っていますよ。っていう枠組みだけを書きます。
なので、パラメータの値を書き込む前の形、
Human.java
public class Human{ String name; int birthday; }
これで設計図としては完成です。ではこの設計図を元に実際にオブジェクトを作ります。
オブジェクトを作る
オブジェクトを作るには、オブジェクトの設計図となるクラス(Humanクラス)とは別に、mainメソッドを持つクラスが必要です。
当たり前です。プログラムを実行するというのはmainメソッドを呼ぶところから始まります。いくらオブジェクトを作る為のクラスをたくさん書いても、それを使うための手続きを書き込むmainメソッドがなければ何も始まりません。
なので、Humanクラスと同じパッケージ内にmainメソッドを持つHumanTestクラスを作りましょう。
↑同じパッケージ内にHumanクラス(オブジェクトの設計図となるクラス)とHumanTestクラス(mainメソッドを持つクラス)をこんな風に作りましょう。
HumanTest.java
public class HumanTest{ public static void main(String[] args){ } }
このHumanTestクラスのmainメソッドの中で、先ほど書いたHumanオブジェクトの設計図であるHumanクラスを使って、Humanオブジェクトを作ります。いいですかー?よく見ていて下さいよー。
HumanTest.java
public class HumanTest{
public static void main(String[] args){
Human human = new Human();
}
}
はい出来ましたー。パチパチパチ・・。
しかしこれ、初心者には「・・は?」となるところだと思います。やたら「human human」言われても意味分からん。って。大丈夫、ゆっくり解説します。非常に大事なところです。
クラス型変数
Human human = new Human();
まず、理解しやすいように上記の1文を2つに分けます。
Human human; human = new Human();
この形、なんとなく見たことありますよね?そうです。変数の宣言と初期化です!宣言と初期化をつなげて書くと、一列で書けますよね?一列で書いた形が上のやつです。
Human human;
↑これで、Human型のhumanという名前の変数を宣言しています。
int num; String name; Human human;
↑これらは全く同じで、変数の宣言の形「変数型 変数名;」です。intやbooleanのような元々用意されている変数型を基本データ型変数と言うのに対して、クラスでその内容を定義して作った変数をクラス型変数と言ったりします。
整数型、文字列型の変数があるように、Human型の変数を自分で勝手に作ってしまったわけです。Human型の変数ってどんな変数かと言えば先ほど作った通り、名前と生年月日というパラメータを持っている変数(オブジェクト)です。
「オブジェクトを作る」というのは「自分で定義したクラス型変数を作る」ということと同義と言えます。
Human human;
クラス型変数の型名はクラス名そのままです。クラス名の頭文字は大文字にしているので、型名も同じように頭文字は大文字です。
変数名は、ただの名前なので、別に「human」じゃなくても「nobuo」とかでもプログラム上問題ないです。
文字列を保持するString型の変数をこれまで普通に使ってきましたが、これも実はクラス型変数(オブジェクト)です。
→そもそもStringって何?
では、クラス型変数の宣言に続いて、「初期化」の部分です。
human = new Human();
オブジェクトを作る時は、new演算子を使います。
new クラス名();
の形でオブジェクトを作ります。
で、その作ったオブジェクトを変数humanに代入することで、変数humanをHumanオブジェクトとして扱えるようになるわけです。
とりあえず簡単ではございますが、これでオブジェクトは作れました。何せ「new クラス名( );」とするだけなので。
しかしHumanオブジェクトを作ったはいいものの、実はまだこの人間オブジェクトには名前も生年月日も具体的には設定していません。
このままではこのオブジェクトは、名前不明で生年月日も不明という全く身元不明な人間を表すオブジェクトになってしまっています。
次回はこのHumanオブジェクトの名前と生年月日というパラメータを設定するにはどうすればいいかをやります。
とりあえず、設計図となるクラスを書いて、そのクラスをnewしてオブジェクトを作るという基本的な部分をまずは抑えておきましょう。
オブジェクトの説明はまだまだ続きがあります。仕組みもちょっと複雑なので全てを一度に理解するのは難しいです。なんとなくでいいので順を追って少しずつ理解していくのが一番の近道ですよ。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
>JAVAにおいてオブジェクトが何を指していてどういう動きをするのかを端的に書けや
鋭いご指摘です。普通は端的に書いてもさっぱり分からないから、具体例を挙げながら数ページに及ぶ解説になってしまうんです。実際、オブジェクトを作って動かすことが一番の近道です。
by Nobuo@管理人 2018/12/20 17:07
Java初心者ですが、シンプルに面白い!と思いました。
ありがとうございます!!
by 四つ目 2021/11/28 21:19
申し訳ありませんが、教えていただけますか?
Human.java とHumanTest,java がどうしても同じパッケージの中に入らないのですが、何故でしょうか?
必ずObjectTestの上に表示されるのですが、どうすればいいのでしょうか?
by なおじーじ 2022/01/11 22:38