【前編】Javaでオブジェクト指向を学びなおす


:::note warn
初学者向けではないです！
前提となるところは節々省略しています！
:::


前回「Hello World」を出力するコードがなんとなくでしか分からなかったので勉強をしました。
↓

https://qiita.com/suda_imagitech/items/d24deca20e4795f55225

次は何かと考えるとオブジェクト指向でした。
なんだかんだエンジニア4年目なので未学習の言語でもぱっとみで何やってるかなんとな～く分かりますが、オブジェクト指向となると話が変わってきます。

何故かというとあまり覚えていません。。。
ここで改めて勉強しなおしこれからの開発に役立てようと思います。

以前PHPを使ったプロジェクトに携わっていた時期もありましたが、オブジェクト指向を考えて開発していませんでした。普通に良くない。

# 1.オブジェクト指向とは

おさらいです。

なんとなく分かっていますがいざ説明しろと言われるとできず、自分の中で言語化できていません。
ChatGPTさんに聞いてきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/8053295e-2b60-02af-80b5-c42cc37cb50c.png)

そうだね。変に知識はあるので頭に入ります。
要はオブジェクト指向という開発の考え方があり、それによって開発がしやすいってことね。

# 2.クラス（Class）について

ChatGPTさんによると

> クラスはオブジェクトの設計図であり、特定の属性（データメンバー）とメソッド（関数メンバー）を持ちます。オブジェクトはクラスのインスタンスです。

何はともあれ一回書いてみましょう。

```java:java

// 人物クラス
class Person {

    // 特定の属性（データメンバー）
    String name;
    int age;

    // コンストラクタ(インスタンス化する際、実行されるメソッドだよ！)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド（関数メンバー）
    public void introduce() {
        System.out.println("やあ！僕の名前は" + name + "!!年齢は" + age + "歳だよ！");
    }

}

```

これがクラスになります。
Personクラスはnameとage属性を持ち、introduceというメソッドを持っています。
まあ、クラスっていう属性とメソッドをまとめているものやな。

# 3.オブジェクト（Object）について
>クラスから作成された実体で、データやメソッドを持つ個別のインスタンスです。オブジェクトは異なるクラスから派生することもあります。

これもコードで表してみましょう。

```java:java

// 人物クラス
class Person {

    // 特定の属性（データメンバー）
    String name;
    int age;

    // コンストラクタ(インスタンス化する際、実行されるメソッドだよ！)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド（関数メンバー）
    public void introduce() {
        System.out.println("やあ！僕の名前は" + name + "!!年齢は" + age + "歳だよ！");
    }

}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // ここ！！！
        // Personクラスのオブジェクトを作成
        Person person = new Person("開発太郎", 23);

        // オブジェクトのメソッドを呼び出し
        person.introduce();
        // 実行結果↓
        // やあ！僕の名前は開発太郎!!年齢は23歳だよ！
    }
}

```

クラスは定義するものなので書いただけで何か実行するわけではありません。
なので定義したクラスを実体化してあげる必要があります。


# 4.カプセル化（Encapsulation）について
>カプセル化は、データとそれに対する操作（メソッド）を一つの単位にまとめ、外部からのアクセスを制御する仕組みです。これにより、データの隠蔽が可能になり、コードが安全で保守しやすくなります。

二度あることは三度あります。これもコードで表しましょう。

```java:java
class Person {
    // カプセル化されたデータメンバー（private修飾子を付けた）
    private String name;

    // name属性のsetterメソッドを定義
    public void setName(String name) {
        this.name = name;
    }

    // name属性のgetterメソッドを定義
    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        // Personクラスのインスタンスを作成
        Person person = new Person();

        // setterメソッドを通じてデータにアクセス
        person.setName("開発太郎");

        // getterメソッドを通じてデータを表示
        System.out.println("Name: " + person.getName());
        
        // ↓のように直接参照はできないよ！！
        System.out.println("Name: " + person.name);
    }
}

```

最初にPersonクラスのname属性ですがprivateで定義してあげます。
privateで定義してあげることで他クラスから直接参照、値の変更をすることができなくなります。
これでカプセル化は完成です。
簡単だね！

```java:java
    // カプセル化されたデータメンバー（private修飾子を付けた）
    private String name;
```

ただカプセル化はできましたが、nameは他クラスから参照できなくなりました。
しかし、対策はできています。属性を返すメソッドを用意すれば解決します！

```java:java
    // name属性のgetterメソッドを定義
    public String getName() {
        return name;
    }
```

# 5.終わりに
ちょくちょく忘れていた箇所がありましたが記憶が復旧しつつあります。
やはり復習は大事です。

余談ですが昔を思い出します。
最初のころは「なんや、インスタンス化って」「カプセル化？薬。。。？？？」
のように何も分からない時期がありましたね。

# 5.予告
12月15日に投稿予定です！
後編に続く！