「クラス」と「オブジェクト」がよく分からなかった

Javaを書き始めたころ、 何度も出てきたのが classnew でした。

例えば、

Person person = new Person();

この1行を見ると、

Personって何?
personって何?
newって何をしているの?

と、最初はかなり混乱します。

でも、この1行を分解して考えると、 それほど難しいことをしているわけではありません。

まずは「Person」というクラス

例えば、人物を扱うプログラムを作るとします。

その人物を表すために、 Person というクラスを作ります。

class Person {

    String name;
    int age;

}

ここでは、

name 名前
age 年齢

という「人物が持っている情報」を クラスの中に定義しています。

ここで大事なのは、

この時点では、まだ田中さんも佐藤さんも存在していない。

ということです。

クラスは「こういうものを作ります」という定義

Person クラスは、 「Personには名前と年齢があります」 という形を決めているだけです。

例えば、料理でいうなら レシピに近いイメージです。

イメージ

Personクラス
├─ 名前を持つ
└─ 年齢を持つ

この「定義」を使って、 実際のPersonを作っていきます。

そこで出てくるのが「new」

実際にPersonを作るには、 new を使います。

Person person = new Person();

この1行を分けて考えてみます。

Person person;

これは、 person という名前で Personを扱うための変数を用意しています。

そして、

new Person();

ここで実際にPersonのオブジェクトを作ります。

ここがポイント

Person は「どういうものか」を表す。
new Person() は実際のPersonを作る。
person は、そのPersonを扱うための変数。

作ったPersonに情報を入れる

Personを作ったら、 そのオブジェクトに情報を入れることができます。

Person person = new Person();

person.name = "田中";
person.age = 30;

これで、 person は 田中さんの情報を持つPersonになります。

イメージ

person
├─ name → 田中
└─ age → 30

ここで、

「変数person」と「Personオブジェクト」は同じものなのか?

という疑問が出てくるかもしれません。

このあたりは、 Javaを勉強していると最初につまずきやすいポイントの一つです。

「変数」と「オブジェクト」は分けて考える

例えば、

Person person = new Person();

と書いた場合、 person は Personそのものというより、 作られたオブジェクトを扱うための変数です。

最初から細かい仕組みまで理解しようとすると かえって難しくなります。

最初はこれでOK

Person = Personという種類
person = 作ったPersonを扱うための変数
new Person() = 実際のPersonを作る

まずはこの関係を押さえておけば、 実際のコードを読むときにかなり楽になります。

メソッドもクラスの中に入る

クラスには、 データだけではなく 「処理」も定義できます。

class Person {

    String name;
    int age;

    void introduce() {

        System.out.println(
            "私は" + name + "です"
        );

    }

}

そして、

Person person = new Person();

person.name = "田中";
person.age = 30;

person.introduce();

とすると、 作ったPersonに対して introduce() を実行できます。

つまりクラスの中には、

フィールド 持っている情報
メソッド できる処理

というものが入っています。

Personは1人だけとは限らない

ここまで理解すると、 次にListの記事につながります。

例えば、

Person person1 = new Person();
person1.name = "田中";

Person person2 = new Person();
person2.name = "佐藤";

とすれば、 Personオブジェクトを2つ作ることができます。

イメージ

person1 → Person(田中)
person2 → Person(佐藤)

さらに、これらをListに入れることもできます。

List<Person> persons =
    new ArrayList<>();

persons.add(person1);
persons.add(person2);

これが、

List<Person>

という形につながります。

「Listの中に何が入っているのか分からない」 という場合も、 まずはこの関係を思い出すと整理しやすくなります。

Javaのコードが急に分からなくなる理由

Javaを書いていると、

List<Person> persons

のようなコードが普通に出てきます。

初めて見ると、 いろいろなものが一気に出てきて 分かりにくく感じます。

でも、一つずつ分解すると、 やっていることは意外と単純です。

分解してみる

List

複数のデータを持つ

Person

人物を表すクラス

Personオブジェクト

実際の田中さん、佐藤さん

Javaのコードが読みにくいと感じたときは、 いきなり全部理解しようとせず、 「これは何を表しているのか?」 と一つずつ分解してみると、 意外と見えてくることがあります。

今回のポイント

クラスとオブジェクトは、 Javaを書くうえで非常によく出てくる考え方です。

まずは、

覚えておきたい関係

クラス
→ どういうものかを定義する

new
→ 実際のオブジェクトを作る

オブジェクト
→ 実際に作られたもの

変数
→ そのオブジェクトを扱うための名前

くらいのイメージから始めれば十分です。

そして、

クラス → オブジェクト → List

という流れが見えてくると、 Javaのコードが少しずつ読みやすくなってきます。

ここまで理解できれば、 「オブジェクト指向とは何なのか」を いきなり難しく考える必要はありません。

まずは、 「データや処理をクラスとしてまとめ、 それをオブジェクトとして扱う」 というところから始めれば十分です。