- Javaのオブジェクト指向の復習
- オブジェクト指向を例え話で説明
Javaの特徴とも言える概念、オブジェクト指向
オブジェクト指向の概念を理解しておくことで、より大規模の開発をすることができます。
しかし、私はオブジェクト指向を理解するのに時間がかかり、けっこう苦労しました。
日本語なのに、日本語の言っている意味が全く理解できないみたいな感覚でしたね、、、
なので、今後Javaを学習する人のプログラミング初心者のヒントとして。
Javaのオブジェクト指向について
自分の理解確認と、ノートついでにここにまとめおきます。
Java|そもそもオブジェクト指向とは?
「ある役割を持ったモノ」ごとにクラス(プログラム全体の設計図)を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと。
引用元:「オブジェクト指向」とは?プログラミングに必要不可欠な要素を解説!
オブジェクト指向をきっちりとした説明で言うと、こんな感じです。
要するに、プログラムを分割する手法ということですね。
「オブジェクト」=「処理」+「データ」
そもそも、オブジェクト指向の「オブジェクト」って何なん?
って話だと思うんですけど。
- プログラムを制御する「処理」
- 数値、文字列、日付などで扱われる「データ」
「処理」と「データ」2つをセットで扱えるようにしたものが「オブジェクト」です。
オブジェクト指向では、プログラムの分割を「オブジェクト」ごとに行っていくとのこと。
オブジェクト指向を理解するコツ
オブジェクト指向の概念を理解するのは、Java初心者にとって至難の業
ちんぷんかんぷんで、全くわかりません
なので、理解するために自分なりの例えで置き換えられないかを考えることが重要です。
オブジェクト指向をウマ娘に例えて説明する
私はオブジェクト指向のことが全く理解できなかったので、最近ハマっているウマ娘で例えてみることにしました。
まず初めに、Javaの用語を置き換えてみます。
- 距離=オブジェクト
- ウマ娘=データ
- レース内容=処理
で、それぞれをオブジェクト指向的に表すと、、、
- 短距離(オブジェクト)
- カレンチャン(データ)
- チームレース用(処理)
- チャンミ用(処理)
- 小銭稼ぎ用(処理)
- 長距離(オブジェクト)
- マンハッタンカフェ(データ)
- チームレース用(処理)
- チャンミ用(処理)
- 小銭稼ぎ用(処理)
- マイル(オブジェクト)
- エルコンドルパサー(データ)
- チームレース(処理)
- チャンミ(処理)
- 小銭稼ぎ(処理)
ザックリとこんな感じです。
オブジェクトは距離の種類に応じて分割されて
- 「短距離、長距離、マイル」などのオブジェクトに応じて
- 適正があるウマ娘のデータを配置
- データに応じてチームレースやチャンミなどで処理していく
これぞ、ウマ娘的なオブジェクト指向です!!
この例えを編み出したおかげで、ウマ娘をやっている時もオブジェクト指向しか思い浮かびません。
多分病気、誰か助けて下さい。
Java| オブジェクト指向4つの概念
オブジェクト指向を構成する4つの概念があります。
- カプセル化(隠ぺい工作)
- 継承(受け継がれし遺伝子)
- 動的束縛(種類によって呼び出す内容が決まる)
- ポリモーフィズム(動的束縛の応用)
難しく聞こえますが、動的束縛・ポリモーフィズム以外は理解しやすいです。
順番に解説していきます。
カプセル化
カプセル化、簡単に言うと隠ぺい工作
オブジェクト内の外部にも出したくない情報を書くことができる機能ですね。
カプセル化することで、外部から情報を勝手に書き換えられるという事態を防ぐことができます。
カプセル化ののためフィールドには、privateを設定してあげます。
継承
継承、簡単に言うと遺伝子を受け継ぐこと
オブジェクトの特徴を、他のオブジェクトに継承することです。
継承することで、別のオブジェクトの特徴を受け継いだまま、新たなコードを追加することができます。
継承にはクラスにextendsを使用します。
動的束縛
動的束縛、簡単に言うと状況に応じて実行結果が変わること。
最終的に呼び出されるモノが呼び出し先の種類によって決まります。
4つの中で、1番説明がややこしく理解に苦しむ部分です。
なので、どんな感じになるのかウマ娘でザックリ例えさせて頂きます。
各ウマ娘(クラス)を作成し距離適性(メソッド)を作ります。
- マックイーン(クラス)
- 距離適正(メソッド)⇒中距離
- マンハッタンカフェ(クラス)
- 距離適性(メソッド)⇒長距離
- スイープトウショウ(クラス)
- 距離適性(メソッド)⇒マイル
これらから、マンハッタンカフェの距離適性を呼び出したい時
以下のように記述してあげます
マンハッタンカフェ.距離適性(メソッド)
すると、マンハッタンカフェの距離適性、長距離を呼び出すことができます。
マックイーンやスイープトウショウなど、ウマ娘によって距離適性は変わってきますね。
状況に応じて呼び出される距離適性の結果が違ってくる。
これが、動的束縛というやつです。
ポリモーフィズム
ポリモーフィズム、簡単に言うと動的束縛をたくさん呼び出す応用みたいなものですね。
呼び出し元を全て同じような記述で、まとめて呼び出すことができます。
動的束縛が理解できればすんなり、いくのではないでしょうか?
また、また、また先ほどのウマ娘で例えさせて頂きます。
呼び出し先 | 呼び出し元 | 実行結果 |
---|---|---|
マックイーン | 距離適性 | 中距離 |
マンハッタンカフェ | 距離適性 | 長距離 |
スイープトウショウ | 距離適性 | マイル |
このように、呼び出し元が同じ名前の時、同じような記述でウマ娘の適正距離を呼び出すことができます。
Java |オブジェクト指向を体験してみる
プログラミングを理解するコツは
コードを書いて実行してみること!
てなわけで、実際にオブジェクト指向を体験してみましょう!
先ほどの解説も頭に入れながら、実行してみてね!!
【実践!】カプセル化
マックイーンのスタミナ値をカプセル化してみます。
class McQueen {
int stamina;
}
class Main1 {
public static void main(String[] args) {
McQueen mcQueen = new McQueen();
mcQueen.stamina = 96;
System.out.println("スタミナ = " + mcQueen.stamina);
}
}
class McQueen {
private int stamina;
}
class Main1 {
public static void main(String[] args) {
McQueen mcQueen = new McQueen();
mcQueen.stamina = 96;
System.out.println("スタミナ = " + mcQueen.stamina);
}
}
②の結果は、コンパイルエラーとなります。
カプセル化をしてあげると、数値などの中身が勝手に書き変わらないようにすることができます。
【実践!】継承
マックイーンのスタミナ値をゴールドシップに継承してみます。
class McQueen {
private int stamina = 48;
int getStamina() {
return this.stamina;
}
}
class GoldShip extends McQueen {
private int speed;
int getSpeed() {
return this.speed;
}
void speedUp(int value) {
this.speed += value;
}
}
class Main2 {
public static void main(String[] args) {
GoldShip goldShip = new GoldShip();
goldShip.getStamina();
goldShip.speedUp(15);
System.out.println(goldShip.getStamina() + " スタミナを継承!");
System.out.println(goldShip.getSpeed() + " スピードアップ!");
}
}
実行するとスタミナを継承することができます。
継承では、別のウマ娘(クラス)からスタミナ値を継承して使うことができます。
【実践!】動的束縛
「グラスワンダー、スペシャルウィーク、サイレンススズカ」3つのウマ娘(クラス)のそれぞれに、ウマ適正を返すメソッドを用意してみましょう。
class GrassWonder {
String getUmaType() {
return "マイル";
}
}
class SpecialWeek extends GrassWonder {
@Override
String getUmaType() {
return "差し";
}
}
class SilenceSuzuka extends SpecialWeek {
@Override
String getUmaType() {
return "逃げ";
}
class Main3 {
public static void main(String[] args) {
/* サイレンススズカ */
GrassWonder silenceSuzuka = new SilenceSuzuka();
System.out.println(silenceSuzuka.getUmaType());
}
}
ウマ娘の名前(インスタンス)に合わせてgetUmaType(メソッド)を呼び出しました。
以上の実行結果として、逃げが表示されます。
逃げはサイレンススズカの適正です。
【実践!】ポリモーフィズム
動的束縛を使い、「グラスワンダー、スペシャルウィーク、サイレンススズカ」それぞれのウマ娘(クラス)のgetUmaTypeメソッドを呼び出してみましょう!
class GrassWonder {
String getUmaType() {
return "マイル";
}
}
class SpecialWeek extends GrassWonder {
@Override
String getUmaType() {
return "差し";
}
}
class SilenceSuzuka extends SpecialWeek {
@Override
String getUmaType() {
return "逃げ";
}
class Main3 {
public static void main(String[] args) {
/* グラスワンダー */
GrassWonder uma1 = new GrassWonder();
System.out.println(uma1.getUmaType());
/* スペシャルウィーク */
GrassWonder uma2 = new SpecialWeek();
System.out.println(uma2.getUmaType());
/* サイレンススズカ */
GrassWonder uma3 = new SilenceSuzuka();
System.out.println(uma3.getUmaType());
}
}
ポリモーフィズムは、同じ名前(getUmaType)のメソッドが使われている時
- uma1.getUmaType()
- uma2.getUmaType()
- uma3.getUmaType()
というように、同じ方法で呼び出すことができます。
実行結果として
- マイル
- 差し
- 逃げ
が表示されます。
同じような方法でまとめて呼び出すことができると、コードを書く量を短縮できるので便利ですね。
まとめ
Javaのもっとも重要な概念、オブジェクト指向についてオタクなりに説明してみました。
どうですか?なんとなくわかりましたか?
少しでも理解が進んだのであれば幸いです。
見ただけでは理解が及ばないかもしれないので、実行して色々と思考錯誤していきましょう。
てな感じで記事は以上!
みなさま良き、オブジェクト指向ライフをm(__)m