Java入門⑧ クラスとオブジェクトを理解しよう!【オブジェクト指向の第一歩】

Java入門 Java入門

Javaの大きな特徴のひとつが オブジェクト指向(Object Oriented Programming) です。
ここからの記事では、その根幹となる クラスオブジェクト をわかりやすく解説します。

難しく思われがちですが、実は考え方はシンプル。
この記事を読めば、Javaが「現実世界をプログラムで表現する」ための仕組みが理解できます。

この記事で学べること

  • クラスとは何か?
  • オブジェクトとは何か?
  • フィールドとメソッドの違い
  • インスタンス化(new)とは?
  • 自作クラスを作ってみよう

クラスとは?

クラスとは、設計図 のようなものです。
もしくは部品といったほうが分かりやすいでしょうか?

例えば「人」を表現したいなら:

  • 名前
  • 年齢
  • 挨拶する動作

といった情報・行動をひとまとめにできます。

オブジェクトとは?

クラス(設計図)から実際に作られた 実体がオブジェクト(インスタンス) です。

  • 設計図 → クラス
  • 設計図から作られた“もの” → オブジェクト(インスタンス)

例)人クラス(Person)から作られるオブジェクト

  • 太郎(名前:太郎、年齢:20)
  • 花子(名前:花子、年齢:18)

クラスの基本構造

public class Person {
    // フィールド(データ)
    String name;
    int age;

    // メソッド(動作)
    public void greet() {
        System.out.println("こんにちは!私は" + name + "です。");
    }
}

ちなみにクラスはファイルを作る際に既に書かれていると思います。
中身は何も書かれてないですがね。

用語まとめ

用語意味
フィールドオブジェクトが持つ「値」
メソッドオブジェクトが持つ「動作」

オブジェクトを作って使う(インスタンス化)

クラスからオブジェクトを作るには new を使います。

Person p = new Person();

フィールドに値を入れる

p.name = "太郎";
p.age = 20;

「new」で作ったオブジェクトは「.」を使うことでフィールドにアクセスすることができます。

これを「System.out.println(person.name);」のようにすると、先ほど入れた「太郎」が出力されます。

メソッドを呼び出す

p.greet();  // こんにちは!私は太郎です。

フィールド同様「.」でアクセスでき、使うことができます。

実践例 Personクラスを使ってみよう

Person.java

public class Person {
    String name;
    int age;

    public void greet() {
        System.out.println("こんにちは!私は" + name + "です。年齢は" + age + "歳です。");
    }
}

Main.java

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

        Person taro = new Person();
        taro.name = "太郎";
        taro.age = 20;

        Person hanako = new Person();
        hanako.name = "花子";
        hanako.age = 18;

        taro.greet();
        hanako.greet();
    }
}

クラスを使うメリット

メリット説明
データと動作をまとめられるname・age・greet() をセットとして扱える
再利用できる一度作れば何個でもオブジェクト化できる
現実の概念をそのまま表せる人・商品・顧客などを自然に扱える

まとめ

キーワード内容
クラス設計図(データ+動作)
オブジェクト(インスタンス)設計図から作られた実体
フィールド値を持つ変数
メソッド行動を表す処理
newオブジェクトを作るキーワード

補足

次から次へと新しいワードが出てきましたが、どうでしたか?

例えば勇者とモンスターが戦いを繰り広げるゲームがあるとします。

このゲームに必要なのは何だと思いますか?

答えは~

登場人物体力攻撃力
勇者155
モンスター103

こんな感じでしょうか。
そしてここから設計図を作るのです。

必要なのは勇者クラス(Hero.java)とモンスタークラス(Monster.java)になります。

例としてコードを置いておきますので、是非参考までに。

Hero.java

public class Hero {
    String name;
    int hp;
    int attack;
}

Monster.java

public class Monster {
    String name;
    int hp;
    int attack;
}

Main.java

public class Main {
    public static void main(String[] args) {
        // 勇者オブジェクト
        Hero hero = new Hero();
        hero.name = "勇者";
        hero.hp = 15;
        hero.attack = 5;

        // モンスターオブジェクト
        Monster monster = new Monster();
        monster.name = "スライム";
        monster.hp = 10;
        monster.attack = 3;

        System.out.println("勇者のステータス  体力:" + hero.hp + " 攻撃力:" + hero.attack);
        System.out.println("モンスターのステータス  体力:" + monster.hp + "攻撃力:" + monster.attack);
        System.out.println();
        System.out.println("勇者の攻撃: モンスターに" + hero.attack + "のダメージ!");

        monster.hp = monster.hp - hero.attack;
        System.out.println("モンスターのHP: " + monster.hp);
    }
}

今までに使った「if文」「while文」などを使ってもいろいろできそうですよね。

例えばモンスターのHPが0になったら、「戦闘終了」みたいなメッセージを出すとか、、、

もしできるのであれば以前学んだものを使って色々試行錯誤することも非常に勉強になるのでやってみてください。

宿題です!しかし提出はなし!

ではでは!次回!:Java入門⑨ コンストラクタとカプセル化

コメント

タイトルとURLをコピーしました