オブジェクト指向とかデザインパターンとか開発プロセスとかツールとか

satoshi's ソフトウェア開発

js






当サイトはアフィリエイト広告を利用してます。

Java UML オブジェクト指向

Javaのオブジェクト指向とは?RPGを作る前に知っておきたいクラスとオブジェクトの考え方

投稿日:


Javaを学び始めると、かなり早い段階で「オブジェクト指向」という言葉が出てきます。

なぜなら、Java自体がオブジェクト指向言語だからです。

しかし、初心者にとってオブジェクト指向は分かりにくい考え方です。

クラス、オブジェクト、インスタンス、フィールド、メソッド、カプセル化、継承、ポリモーフィズム。

いきなり知らない言葉がたくさん出てくるので、「結局、何のためにあるのか分からない」と感じる人も多いと思います。

この記事では、RPGを題材にして、Javaのオブジェクト指向について説明します。

RPGには、勇者、スライム、武器、アイテム、魔法などが登場します。

これらをプログラムの中でどのように表現するのかを考えると、オブジェクト指向の考え方が少し理解しやすくなります。

Java初心者がオブジェクト指向でつまずきやすい理由

オブジェクト指向が分かりにくい理由のひとつは、最初から抽象的な説明が多いことです。

たとえば、次のように説明されることがあります。

オブジェクト指向とは、データと処理をひとまとめにしたオブジェクトを中心にプログラムを設計する考え方です。

これは説明としては正しいです。

しかし、Javaを学び始めたばかりの人にとっては、これだけではなかなかイメージできません。

「データと処理をひとまとめにする」と言われても、それが具体的に何を意味するのか分かりにくいからです。

そこで、まずはRPGで考えてみます。

RPGには、勇者がいます。
勇者には名前があります。
HPもあります。
攻撃力もあります。
そして、攻撃したり、回復したりできます。

つまり勇者には、

  • 名前
  • HP
  • 攻撃力

といった「情報」があります。

そして、

  • 攻撃する
  • 回復する
  • アイテムを使う

といった「動き」があります。

オブジェクト指向では、このような「情報」と「動き(オブジェクト指向では『振る舞い』と呼びます)」をひとまとめにして考えます。

オブジェクト指向の考え方の基本は「もの」に役割を持たせること

オブジェクト指向とは、プログラムの中に「もの」や「役割」を作り、それぞれにデータと処理を持たせる考え方です。

RPGで考えると、次のようなものが登場します。

  • 勇者
  • スライム
  • 武器
  • 防具
  • 薬草
  • 魔法
  • ダンジョン
  • 戦闘

これらをすべて従来の方法でプログラムを作ろうとすると、プログラムはあっという間に複雑になります。

たとえば、勇者のHP、スライムのHP、攻撃処理、回復処理、アイテム処理などを全部ひとつの場所に書くと、どこに何が書いてあるのか分かりにくくなります。

そこで、オブジェクト指向では役割ごとにプログラムを分けます。

Javaでは、そのプログラムの単位をクラスと呼びます。

勇者に関する情報や処理は、勇者のクラスにまとめる。
スライムに関する情報や処理は、スライムのクラスにまとめる。
武器に関する情報や処理は、武器のクラスにまとめる。

オブジェクト指向とは、このようにプログラム(クラス)を「役割を持った部品」に分けて考えることで、人間が理解しやすいプログラムを作る方法です。

RPGで考えるとオブジェクト指向は理解しやすい

たとえば、RPGの勇者を考えてみます。

勇者には、次のような情報があります。

  • 名前
  • HP
  • MP
  • 攻撃力
  • レベル

また、勇者には次のような動きがあります。

  • 攻撃する
  • 防御する
  • 回復する
  • 魔法を使う
  • アイテムを使う

このように、「勇者」というものを考えるとき、情報と動きはセットになっています。

スライムも同じです。

スライムには、次のような情報があります。

  • 名前
  • HP
  • 攻撃力

そして、次のような動きがあります。

  • 攻撃する
  • 逃げる

薬草ならどうでしょうか。

薬草には、

  • 名前
  • 回復量

という情報があります。

そして、

  • 使うとHPを回復する

という動きがあります。

このように、RPGの登場人物やアイテムを「情報」と「動き」のセットとして考えると、オブジェクト指向のイメージがしやすくなります。

クラスとは「設計図」のようなもの

Javaでオブジェクト指向を使うとき、まず重要になるのが「クラス」です。

クラスとは、オブジェクトを作るための設計図のようなものです。

たとえば、勇者をプログラムで表すなら、Hero クラスを作ります。

public class Hero {
    String name;
    int hp;

    public void attack() {
        System.out.println(name + "の攻撃!");
    }
}

この Hero クラスには、勇者が持つ情報と動きを書いています。

String name;
int hp;

これは、勇者が持つ情報です。

public void attack() {
    System.out.println(name + "の攻撃!");
}

これは、勇者の動きです。

つまり、Hero クラスは「勇者とはどういうものか」を定義している設計図です。

ただし、この時点ではまだ実際の勇者が作られたわけではありません。

クラスはあくまで設計図です。

オブジェクトとはクラスから作られた実体

クラスが設計図だとすれば、オブジェクトはその設計図から作られたものです。

Javaでは、new を使ってオブジェクトを作ります。

Hero hero = new Hero();

これで、Hero クラスをもとにした勇者オブジェクトが作られます。

その後、勇者の名前やHPを設定できます。

Hero hero = new Hero(); 
hero.name = "勇者"; 
hero.hp = 100;

hero.attack();

ここで大事なのは、Hero クラスと hero オブジェクトは同じものではないということです。

Hero クラスは設計図です。
hero オブジェクトは、その設計図から作られた実物です。

たとえるなら、たい焼きの型とたい焼きの関係に近いです。

型そのものは食べられません。
でも、型を使えばたい焼きを何個も作れます。

同じように、Hero クラスそのものは設計図ですが、そこから勇者オブジェクトを作ることができます。

インスタンスとは何か

Javaでは、クラスから作られたオブジェクトのことを「インスタンス」と呼ぶこともあります。

厳密には使い分けがありますが、初心者のうちは、

クラスから new で作られたものがインスタンス

と考えておけばよいです。

たとえば、次のように書くと、勇者を2人作ることができます。

Hero hero1 = new Hero(); 
hero1.name = "勇者"; 
hero1.hp = 100; 

Hero hero2 = new Hero(); 
hero2.name = "戦士"; 
hero2.hp = 150;

hero1 と hero2 は、どちらも Hero クラスから作られたインスタンスです。

同じ Hero クラスから作られていますが、それぞれ別のオブジェクトです。

hero1 の名前は「勇者」、hero2 の名前は「戦士」です。
HPも別々に持っています。

このように、クラスを使うと、同じ種類のオブジェクトを何個も作ることができます。

フィールドは状態、メソッドは動作

クラスの中には、フィールドとメソッドを書きます。

フィールドとは、そのオブジェクトが持つ情報です。

String name;
int hp;

この例では、name と hp がフィールドです。

勇者の名前やHPは、勇者の状態を表しています。

一方、メソッドとは、そのオブジェクトができる動作です。

public void attack() {
    System.out.println(name + "の攻撃!");
}

この例では、attack() がメソッドです。

勇者が攻撃するという動きを表しています。

オブジェクト指向にすると何がうれしいのか

オブジェクト指向にすると、プログラムを部品ごとに分けて考えられるようになります。

これにはいくつかのメリットがあります。

まず、プログラムが読みやすくなります。

勇者に関する処理は Hero クラスを見ればよい。
スライムに関する処理は Slime クラスを見ればよい。

このように分かれていると、プログラム全体を一度に理解しなくても、必要な部分から読めます。

次に、修正しやすくなります。

たとえば、勇者の攻撃処理を変更したい場合、Hero クラスを見ればよいと分かります。

オブジェクト同士が協力してプログラムが動く

オブジェクト指向で作られたプログラムは、複数のオブジェクトが協力して動きます。

たとえば、勇者が薬草を使う場面を考えてみます。

勇者オブジェクトがあります。
薬草オブジェクトがあります。

勇者が薬草を使うと、薬草の回復量に応じて勇者のHPが回復します。

このとき、

勇者は自分のHPを持っている
薬草は回復量を持っている
薬草を使うことで勇者のHPが増える

というように、複数のオブジェクトが関係しながら処理が進みます。

RPGの戦闘も同じです。

勇者がスライムを攻撃する。
スライムのHPが減る。
スライムが勇者を攻撃する。
勇者のHPが減る。

このように、オブジェクト同士がやりとりしながらプログラムが動いていきます。

オブジェクト指向でよく出てくる4つの考え方

オブジェクト指向には、よく出てくる重要な考え方があります。

代表的なものは次の4つです。

  • カプセル化
  • 継承
  • ポリモーフィズム
  • 抽象化

最初からすべてを完璧に理解する必要はありません。

ここでは、RPGを例にして簡単に紹介します。

カプセル化とは

カプセル化とは、データと処理をひとまとめにし、外から勝手に中身を変更されないようにする考え方です。

たとえば、勇者のHPをどこからでも自由に書き換えられると困ります。

hero.hp = 0;

勇者がいきなり死んでしまいます。

そこで、実際のプログラムでは、HPを直接変更するのではなく、ダメージを受けるメソッドや回復するメソッドを用意します。

public void damage(int point) { 
    hp -= point; 
    if (hp < 0) { 
        hp = 0; 
    } 
}

このように、オブジェクトの状態を安全に変更するための入り口を用意するのがカプセル化の考え方です。

初心者のうちは、「データを外部から直接変更できないようにして、メソッドを通して操作する」くらいに考えるとよいです。

継承とは

継承とは、共通する性質を親クラスにまとめ、子クラスでそれを受け継ぐ仕組みです。

RPGでは、勇者もスライムも共通して「名前」や「HP」や「攻撃力」を持っています。

そこで、共通部分を Chara クラスにまとめることができます。
(Javaには、文字に対応するCharacterクラスが存在するので、ここでは同一のクラス名を避けるため、Charaとしています)

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

そして、勇者やスライムは Chara クラスを継承します。
Javaで、Charaクラスを継承して別のクラスを作る場合、extends キーワードを使って以下のように書きます。

public class Hero extends Chara {
}
public class Slime extends Chara {
}

これにより、勇者もスライムも name や hp を持つことができます。

継承を使うと、共通する部分を何度も書かなくて済みます。

ただし、継承は何でも使えばよいわけではありません。

基本的には、

AはBの一種である

と言える場合に使います。

勇者はキャラクターの一種です。
スライムもキャラクターの一種です。

このような関係なら、継承を使う候補になります。

ポリモーフィズムとは

ポリモーフィズムとは、同じ命令でも、オブジェクトによって違う動きをさせる考え方です。

たとえば、勇者にもスライムにも attack() というメソッドがあるとします。

勇者の attack() は剣で攻撃するかもしれません。
スライムの attack() は体当たりかもしれません。
ドラゴンの attack() は炎を吐くかもしれません。

同じ attack() という命令でも、実際の動きはオブジェクトによって違います。

これがポリモーフィズムのイメージです。

最初は難しく感じるかもしれませんが、RPGで考えると自然です。

「攻撃する」という命令は同じでも、キャラクターによって攻撃方法が違う。

これがポリモーフィズムです。

抽象化とは

抽象化とは、細かい違いをいったん置いておき、重要な特徴だけを取り出して考えることです。

たとえば、RPGにはいろいろなキャラクターが登場します。

  • 勇者
  • 戦士
  • 魔法使い
  • スライム
  • ゴブリン
  • ドラゴン

それぞれ見た目も役割も違います。

しかし、共通して見ると、どれも「キャラクター」と考えることができます。

キャラクターには、名前があります。
HPがあります。
攻撃することができます。

このように、細かい違いを取り除いて、共通する部分に注目するのが抽象化です。

オブジェクト指向では、この抽象化によって、プログラムを整理しやすくします。

UMLを使うとクラスの関係を整理しやすい

クラスが少ないうちは、コードを見れば関係を把握できます。

しかし、RPGのように登場人物やアイテムが増えてくると、クラス同士の関係が分かりにくくなります。

そこで役立つのがUMLです。

UMLとは、クラスやオブジェクトの関係を図で表すための世界共有の記法です。

統一モデリング言語(Unified Modeling Language)の頭文字を取って、UMLと略されています。

たとえば、Hero クラスを簡単に図で表すと、次のようになります。

+----------------+
| Hero           |
+----------------+
| name           |
| hp             |
+----------------+
| attack()       |
+----------------+

これをクラス図と呼びます。
クラス図は四角形を3つの部分に分けて記述します。
一番上にはクラス名を書きます。
真ん中にはフィールドを書きます。
一番下にはメソッドを書きます。

さらに、勇者とスライムがキャラクターを継承している場合は、次のように考えられます。
クラス図で継承を表す場合、継承元のクラス側に△を記載して、そこから継承先のクラスに線で接続します。

+----------------+
| Chara          |
+----------------+
| name           |
| hp             |
| attack         |
+----------------+
| attack()       |
+----------------+
        △
        |
        +-------------------------+
        |                         |
+----------------+        +----------------+
| Hero           |        | Slime          |
+----------------+        +----------------+
|                |        |                |
+----------------+        +----------------+
|                |        |                |
+----------------+        +----------------+

Hero と Slime は、どちらも Chara を継承しています。

つまり、

勇者はキャラクターの一種
スライムもキャラクターの一種

と考えられます。

このように図にすると、どのクラスがどんな関係にあるのかを整理しやすくなります。

最初から本格的なUMLを覚える必要はありません。

まずは、クラス名、フィールド、メソッドを簡単な図で整理できれば十分です。

まとめ:まずはクラスとオブジェクトを理解しよう

オブジェクト指向とは、プログラムを「もの」や「役割」に分け、それぞれに情報と動きを持たせる考え方です。

RPGで考えると、勇者、スライム、武器、薬草などがそれぞれオブジェクトになります。

クラスは、オブジェクトを作るための設計図です。
オブジェクトは、その設計図から作られた実体です。
インスタンスは、クラスから作られたオブジェクトです。

また、クラスの中にはフィールドとメソッドを書きます。

フィールドは、そのオブジェクトが持つ情報です。
メソッドは、そのオブジェクトができる動作です。

オブジェクト指向には、カプセル化、継承、ポリモーフィズム、抽象化といった考え方があります。

これらは最初からすべて理解しようとしなくても大丈夫です。

まずは、「クラスという設計図を作り、そこからオブジェクトを作る」という感覚をつかみましょう。

RPGを作りながら学ぶと、オブジェクト指向はかなり理解しやすくなります。

次回は、RPGに登場する「勇者」を題材にして、Javaのクラスを実際に作ってみます。







-Java, UML, オブジェクト指向
-, , ,

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny

Copyright© satoshi's ソフトウェア開発 , 2026 All Rights Reserved Powered by STINGER.