Java

【Java】オブジェクト指向

参考「スッキリわかるJava入門p263~p366」

7章 要約

まず、オブジェクト指向を学ぶ理由として、
「ソースコードが長く複雑になりすぎて、開発者自身が把握しきれなくなる」ということを防ぐためである。

そもそもオブジェクト指向と基本文法では、学ぶものも学び方も全く違う。
そのため、本質を理解せずに使用している人も多い。

・オブジェクト指向の定義
ソフトウェアを開発するときに用いる部品化の考え方のこと

・オブジェクト指向の本質
現実世界の登場人物とその振る舞いを、コンピュータ内の仮想世界で再現する

オブジェクト指向プログラミングでは、プログラマはそれぞれの部品に、
「責務(役割)」をプログラムとして書き込む。
この責務は「情報保持」と「操作」
これらを果たすために、オブジェクトは「属性」と「操作」を持っている。

「属性」その登場人物に関する情報を覚えておく箱
「操作」その登場人物が行う行動や動作の手順

オブジェクトは互いに属性を読み書きしたり、操作を呼び出したりして連携し、
全体として1つのプログラムとして動く。

・オブジェクト指向の3大機能
カプセル化
継承
多態性
※これらはこの記事で詳しくは解説しない。

8章 要約

オブジェクト指向におけるプログラマの役割
①各オブジェクトが負うべき責務を考え、「属性」「操作」の種類と内容を定義する
②各オブジェクトを仮想世界に生み出し、動かす。

仮想世界で活動する実体を示したい場合はインスタンスという言葉を用いる。
また、クラスからインスタンスを生成する行為はインスタンス化を表現する。

登場人物のクラスを作成した場合、それにどのように動くか指示するクラスが必要。
それがmainクラスである。

public class main {
    public static void main(String[] args) {
    }
}

以下、この本では「勇者とお化けキノコの戦い」を例にしてコードを書いているためそれを参考にする。
(Heroクラス、Matangoクラス、mainクラスを使用)

Heroクラス
・クラスの宣言方法

public class Hero {
}

・属性の宣言方法

[名前] name(String型)
[HP]   hp(int型)

・操作の宣言方法
オブジェクト指向では、操作を定義するためにメソッドを使用

    void sleep() {
        this.hp = 100;
        System.out.println(this.name + "は眠って回復した!");
    }

まとめるとこんな感じ

public class Hero {
    String name;
    int hp;

    void sleep() {
        this.hp = 100;
        System.out.println(this.name + "は眠って回復した!");
    }

}

クラスを定義すれば型として利用できるようになる。
クラス型変数が必要な理由としては、同名のインスタンスの中から特定の1つを識別するため。

mainクラス
・インスタンスの生成方法

クラス名 変数名 = new クラス名();

・フィールドへの値の代入

変数名.フィールド名 = 値;

・最後にメソッドを呼び出して「指示」をする。

実際に動かしてみた

Heroクラス

Hero.png

mainクラス

main.png

実行結果にちゃんと表示されている。

まとめると、オブジェクト指向という明確な思想に基づいてクラスやメソッドが作られている。
現実世界の人や物、出来事をクラスに置き換えていくものとして考える。

9章 要約

ここでは主にコンストラクタについて学んでいく。

public class Hero {
    String name;
    int hp;

    void sleep() {
        System.out.println(this.name + "は眠って回復した!");
    }
    Hero(){
        this.hp = 100;

    }

}

上記のようにHero()メソッドを追加する。
このHero()メソッドは「newされると、newと同時にメソッド内部で定義しておいた処理が自動的に行われる」
という性質を持っている。
このようなメソッドをコンストラクタという。

よってmainメソッド側でHPに初期値を代入する必要はない。

実際に動かしてみると初期HPに100が入っていることが分かる。

main1.png

・コンストラクタとしてみなされる条件
①メソッド名がクラス名と完全に等しい
②メソッド宣言に戻り値が記述されていない

コンストラクタが引数で受け取れるように宣言することも可能。

    Hero(String name){
        this.hp = 100;
        this.name = name;
    }

mainメソッドにはコンストラクタが実行される際に渡してほしい引数をnewする際に指定する。

main2.png

名前にミナトと入っているのが分かる。

所感

私はJava初心者であるため、オブジェクト指向は今までなんとなくの感覚でやっていた。
実際にこの記事を書いていても本当に正しいのだろうかということや、
どういう意味なのだろうかということが、いくつかあった。
特にコンストラクタの部分が曖昧になっている部分が多い気がしたので、
まとめきれる部分が少なかったように思える。
ただ、そのような本質的な意味を理解することよりも、本を読んで、書いて、実行してみることが、
理解に繋がるのではないかと思った。
この本を詳しく見てみることで今までなんとなくでやっていたことが、多少は理解できたと思う。
この先の章をより深く学んでいくことにより、マスターできるのではないかと思った。