Java基礎

現役Java講師がオブジェクト指向を誰でもわかるように徹底解説

やべっち(@yabecchi312)です!

 

私はプログラミング講師を仕事にしていますが、Javaを勉強する上で1つ挫折してしまいがちなところが、オブジェクト指向の話です。

 

オブジェクト指向は、Javaだけでなく今Webアプリケーションの言語で使われているPHP、Rubyといったその他多くの言語で取り入れられている概念です。

そのため、オブジェクト指向さえ理解してしまえばJavaだけでなく他の多くの言語も理解がかなり早くなります。

 

プログラミングの上達のコツは、いかに自分の中にイメージを描けるかどうかです。

できるプログラマーは、実は頭の中に絵ができていて、それを書き起こしています。

オブジェクト指向も同様で自分の中にイメージを書ければ、ものすごく簡単な概念です。

 

オブジェクト指向を誰でも頭の中にイメージできるようにプログラミング講師である私が解説します٩( ‘ω’ )و

また、オブジェクト指向がわかるとどんな良いことがあるのかを具体的に話します!

現役Java講師がオブジェクト指向を誰でもわかるように徹底解説

未経験アザラシ
未経験アザラシ
オブジェクト指向って難しくてわからないんだけど、理解しないといけないの?
Webエンジニア船長
Webエンジニア船長
オブジェクト指向を理解していなかったとしてもJavaプログラムは書けます。

それでも、オブジェクト指向は絶対に知っておいた方が良いのは「基本」だからです。

基本がちゃんとわかっていればプログラマーとしての成長が圧倒的に速く、プログラミングの楽しさを実感しやすいです。

また、オブジェクト指向が使われているPHP、Rubyといったその他の言語も習得しやすくなるので、ぜひここでオブジェクト指向の概念をイメージできるようになりましょう。

オブジェクト指向とは?まずはイメージをつかもう!

オブジェクト指向を一言で話すなら、「オブジェクトを中心に捉えてプログラムすること」です。

オブジェクト指向の概念を理解するために、下の図を頭の中にイメージが描けるようになると簡単になります。

 

特に、暗記が必要な部分は、クラス、フィールド、メソッド、インスタンスの4つの単語だけであとはこの図を自分でイメージできるようになりましょう!

左から

  1. オブジェクトとは何か?
  2. クラスとは何か?
  3. インスタンスとは何か?

 

この3つの手順を理解すればもうオブジェクト指向の基本は抑えられます٩( ‘ω’ )و

①オブジェクトとは何か?

「オブジェクト」を直訳すると”もの”という意味ですが、オブジェクト指向で話す「オブジェクト」は、”個別に認識できる具体的なもの”と考えてください。

ちなみに具体的の反対語は、「抽象的」です。

この「抽象」という言葉もオブジェクト指向を理解する上ですごく大切だったりします。

 

例えば、「車」と言われて頭の中にどんなイメージをしますか?

もし100人に聞いたら、みんなそれぞれTOYOTAの車やSUBARUの車やHONDAの車と様々イメージするはずです。

理由は、「車」という”もの”が抽象的だからです。

 

もし、「田中さんの車」と言われたらこれは”個別に認識できる具体的なもの”です。

これを、オブジェクトと言います。

未経験アザラシ
未経験アザラシ
でも田中さんっていっぱいいるから、個別に認識できなくない?
Webエンジニア船長
Webエンジニア船長
オブジェクト指向は深く突っ込んだりすると逆にわからなくなりますよ。笑

ここで大事なことは、オブジェクトは”個別に認識できる具体的なもの”であること。

個別といってもなんとなく限定されて認識できたらオブジェクトだと思ってください。

オブジェクトの例

・田中さんの昨日の晩御飯

・東京タワー

・社内管理システムの名簿の田中さん

②クラスは設計図のようなもの!

Webエンジニア船長
Webエンジニア船長
さて、もう1つ大事なことは、オブジェクトは「属性(フィールド)」と「操作(メソッド)」を持つということです。

 

オブジェクトは、”個別に認識できる具体的なもの”と説明しましたが、そのオブジェクトには必ず属性と操作を持ちます。

属性は、そのオブジェクトの性質。(車なら車種、色、ガソリン量、最高速度といったもの)

操作は、オブジェクトができることです。(車なら前に走る、バックする、クラクションを鳴らす、ワイパーを動かすといった感じです)

 

続けて車を例にあげて話しますが、「田中さんの車」や「山田さんの車」や「佐藤さんの車」とそれぞれオブジェクトが存在するとします。

それぞれオブジェクトである車は、個別に属性や操作が共通するものと共通しないものがありますよね?

この共通するものを一緒にまとめて「抽象化」してしまうのが「クラス」です。

 

このように、共通する「属性」と「操作」をまとめて扱う設計図のようなものをクラスと言います。

要するに、コンピュータ上で扱うために車に関する余計な情報を全部削ってしまってクラスとして扱ってしまうということです。

 

今回は、車を例にあげて話しているので「車クラス」と名付けて扱ったりします。

③インスタンスとは何か?インスタンス化をしてJavaを書いてみよう!

 

Webエンジニア船長
Webエンジニア船長
さて、ここまできたらあとはインスタンスを理解できれば、オブジェクト指向の大部分を理解できたと思って大丈夫です。

先ほどの、車クラスをコンピュータ上で実体化してみましょうというのがインスタンスです。

先ほどクラスを設計図のようなものと表現しましたが、ここでコンピュータ上で実体化するときにこの設計図を元に実体化するためです。

この実体化をすることを、「インスタンス化」と言います。

さらに、コンピュータの中で実体になったものを「インスタンス」と言います。

 

このイメージがつかめればオブジェクト指向は問題ありません。

実際にJavaプログラミングで書いたらどんなコードになるのかをみてみましょう。

package sample;

public class Car {
	/**
	 * フィールド
	 */
	String color;
	int gas;
	
	/**
	 * 前に走るメソッド
	 */
	void move() {
		System.out.println("前に走る");
	}
	
	/**
	 * クラクションを鳴らすメソッド
	 */
	void craction() {
		System.out.println("クラクションを鳴らす");
	}
	
	void introduce() {
		System.out.println(color + "車、ガソリン量は" + gas);
	}
	
	/**
	 * コンストラクタ
	 */
	public Car() {
		super();
	}
}

まず、CarクラスをJavaプログラミングで簡単に書くとこんな感じです。

英語がたくさんあって嫌になるかもしれませんが、コメントみてください。

 

まず上にフィールドがあって、その下にメソッドを書いているだけです。

コンストラクタは、インスタンス化する時に呼び出される特殊なメソッドくらいに認識して置いてください。

 

package sample;

public class Test {
	public static void main(String[] args) {
		//インスタンス化する
		Car carRed = new Car();
		
		//属性に値を入れる
		carRed.color = "赤";
		carRed.gas = 50;
		
		//メソッド呼び出す
		carRed.introduce();
		carRed.move();
		carRed.craction();
	}
}

さて、今度はインスタンス化する実行環境をみてみます。
ここにもテストクラスが存在しているのに気づくかもしれませんが、先ほどの車クラスは設計図となるモデルクラスで、このテストクラスは実行するための実行クラスであるくらいに認識しておいてください。

今まで学んできたインスタンス化とは、この一行だけです。

 

あとは、これを実行してあげるとこんな感じで表示されます。

 

こんな感じで、Javaプログラミングを書くときは

  1. モデルクラスを書く
  2. インスタンス化する

という流れをよく書きます。

 

では、もう一度最初見せた全体像をみてみましょう。

 

こんな感じで、オブジェクトを中心に捉えて設計してプログラミングを書いていくのがオブジェクト指向です。

このオブジェクト指向がわかると例えば、ポケモンのゲームを自分で作ろうとします。

ピカチュウというモデルクラス(設計図)を作ったりしたら、何体でもインスタンス化して、それぞれ違うHPや攻撃力のデータを持たせたり、覚えている技をメソッドにして一体一体違うピカチュウができそうじゃないですか?

 

ゲームのプログラミングだけでなく、Webアプリケーションにおいてもオブジェクト指向を使うとすごく便利なんです。

オブジェクト指向を使う2つの大きなメリットとは?

未経験アザラシ
未経験アザラシ
なんとなくわかってきたけど、そもそもなんでオブジェクト指向を使うの?
Webエンジニア船長
Webエンジニア船長
オブジェクト指向によって便利になることがたくさんあるからです。ここでは2つだけお話しします。

  1. 新しく何かを加える時に楽
  2. 作業を分担できる→何人でも大丈夫

 

例えば先ほどの車全てに、新しい機能をつけたいとしたりします。

しかし、インスタンス化した全ていちいち全てを付け加えるのはかなり面倒ですよね?

 

3つくらいだったら自分頑張って付け加えられるかもしれませんが、100や1000あったらもうめんどくさくてしょうがないですよね。

もし、共通で新しい機能をつけるならクラスだけ書き換えてそれをインスタンス化すればすごく楽になるのです。

 

そのほかにも、Java言語が大規模開発に向いているのは、1つの機能を1人が担当したり、クラスごとに担当を分けたりしたらいくらでも作業分担することができます。

 

Javaのオブジェクト指向には、「カプセル化」、「継承」、「ポリもフィズム」、「抽象化」といったものがあり、さらに深いオブジェクト指向の世界を理解しないといけません。

この部分を理解するともう十分Javaはかけるようになり、オブジェクト指向の便利さも理解してくると思います。

また、他の言語はこの考え方に基づいて文法が違うだけなので割と簡単に習得ができるはずです。

地道に焦らず1つずつ理解していきましょう٩( ‘ω’ )و

 

最後に:オブジェクト指向を理解してゆくゆくは自分でプログラムを書いてサービスを作れるようになろう!

IT業界は、残業が多いとか給料が安いとか悪いイメージを持たれがちですが、私はとてもクリエイティブな業界だと思っています。

発想力次第で、このオブジェクト指向を使えばどんなものでも開発ができてしまうのがプログラミングの面白さです。

 

また、オブジェクト指向についてもそんな難しく考えないでください。

現時点では、先ほど説明したイメージ図が頭の中に描けるようになれば一旦オブジェクト指向を理解したと思ってもらって大丈夫です。

理解できたらその先の、メソッドの利用方法や、カプセル化とは何か?といったより深いところを1つ1つ勉強していくのがJavaプログラミングの上達のコツです。

 

そうすればいつか自分でどんなサービスも作れるようなプログラマーになれるでしょう٩( ‘ω’ )و

「天職」の見つけ方がわかる