Javaプログラミング入門 7章 [オブジェクト] Part1

Java

こんにちは。ECF Techブログ
担当 Michiharu.Tです。

Javaプログラミング入門記事の第7章をお送りいたします。
第7章のテーマは「オブジェクト」です。
第7章は2回のパートに分けて掲載します。今回はPart1です。

本連載の初回および章立ての一覧については下記のリンクから確認できます。

Javaプログラミング入門 0章
0章 Javaプログラミングを始めよう こんにちは。ECF Techブログ 担当 Michiharu.Tです。 この記事はプログラミング言語のJavaを、実際に動かしながら学びたい人のための学習教材となっています。手を多く動かすこと、感覚を...

解説動画

2024/01/19 解説動画を掲載しました。

7-1 オブジェクト指向プログラミング

Javaは「オブジェクト指向」という考え方に基づくプログラミング、いわゆるオブジェクト指向プログラミングが可能な言語の1つです。本章からオブジェクト指向編と題しまして、このオブジェクト指向を取り入れたプログラミングを実現するための文法や考え方を学習します。

このオブジェクト指向編では、スーパーやコンビニエンスストアなどから提供される、お店専用のスマホアプリ(以降、「お店アプリ」と呼称)のようなプログラムを題材に、説明をしたいと思います。図はお店アプリの簡単なイメージです。

お店アプリ

実際にスマートフォンで動作するアプリを作成するわけではありません。登場するプログラムは、これまで同様コマンドプロンプト上で動作するプログラムです。

7-1-1 オブジェクトとは

オブジェクト(object)は、「物体」「対象」などと訳されるかなり抽象的な言葉です。オブジェクト指向プログラミングは、プログラムをオブジェクトの集まりとしてとらえる考え方です。まずはこのオブジェクトをプログラムで表現できるようにしましょう。

7-1-2 オブジェクトの定義

オブジェクト指向では、オブジェクトを「属性と動作をひとまとめにしたもの」として考えます。

  • 属性とは、オブジェクトがもつ情報のことです。
  • 動作とは、オブジェクトができることです。

オブジェクト指向プログラミングにおいて、どのようなオブジェクトを定義し、どのような属性や動作を持たせるか? という点については、プログラマの自由です。

例として、お店アプリに必要そうな「会員」と「商品」というオブジェクトを定義し、その属性と動作を考えてみます。下図はその一例です。

オブジェクトの例

  • 会員オブジェクトは会員番号名前を属性として持っています。
  • 会員オブジェクトは「お金を払う」という動作ができます。
  • 商品オブジェクトは名前価格を属性として持っています。
  • 商品オブジェクトは「情報を表示する」という動作ができます。

他にも、会員オブジェクトには住所、年齢、性別などの属性や「商品を選ぶ」、「ポイントカードを提示する」などの様々な動作が考えられます。

また、商品が自発的に「情報を表示する」という動作をすることは、現実世界とかけ離れており違和感があります。

ですが、オブジェクト指向では、オブジェクトをどのように表現するかは自由です。プログラムとして必要なものだけを表現すればOKですし、プログラムとして必要そうな動作があれば追加して良いのです。

7-2 オブジェクトの定義方法

では次に、Javaにおけるオブジェクトの定義方法について説明します。Javaではオブジェクト指向におけるオブジェクト属性動作をそれぞれ、次の要素を使って表現します。

  • オブジェクト → クラス
  • 属性 → フィールド
  • 動作 → メソッド

それぞれを定義したクラスのイメージは下のようになります。

//クラスの定義
public class クラス名 {
    //フィールドの定義
    型名 変数名;

    //メソッドの定義
    戻り値型 メソッド名(引数...){
        //何らかの処理
    }
}
  • クラスの定義方法はこれまでと変わりません。
  • フィールド定義は変数宣言と同じ文法ですが、クラスブロック内に直接記述します。
  • メソッド定義の文法は6章の内容と基本的に同じですが、public staticはつけません。

では、これら3つの定義を使って7-1-1で例示した「商品」のオブジェクトを作成するプログラムを示します。

プログラム例(Item.java)

public class Item {
    //フィールド
    String name; //名前
    int price; //価格

    //メソッド
    void display() {
        System.out.println(name + ":" + price);
    }
}

解説
7-1-1で示した商品オブジェクトを対応させると、次のようになります。

Itemオブジェクト

  • 商品を表現するクラスなので、クラス名はItemとなっています。
  • 名前と価格の2つの属性は、それぞれnamepriceというフィールドで示しています。
  • displayメソッドの動作については、実際に動作させる際に説明をします。
クラス名がItemなので、Item.javaというファイル名で保存する必要があります。

7-3 オブジェクト指向プログラミングの基本

オブジェクト指向に基づいて作成したItemクラスですが、まだ実際にプログラムとして動作させることができません。ここでは、実際に動作させるためのいくつかの前提知識について説明します。

7-3-1 複数のクラスで構成する

オブジェクト指向でプログラムを書く場合、複数のクラスを作成し、相互に連携させてプログラムを動作させることになります。本章では、次のような役割をもつ2つのクラスを作成し、プログラムを動作させることを目指します。

  • オブジェクトを表すクラス
    • 7-2で作成したItemクラスがこれに該当します。
  • メインクラス
    • mainメソッドを持つクラスで、プログラムを開始する役割があります。
    • オブジェクトを表すクラスを利用します。

7-3-2 クラスの本質

メインクラスからItemクラスを利用するためには、クラスの本質をもう少し正確にとらえる必要があります。

7-1でクラスはオブジェクトを表現するものと説明しましたが、正確にはオブジェクトそのものと言うよりは、オブジェクトの設計図に近いものです。クラスの記述にもとづいて、実際に動作させるにはインスタンスが必要です。

下の図は、クラスとインスタンスの関係を、自動車の設計図と実際の自動車にたとえて対比したものです。

クラスとインスタンス

自動車の設計図だけでは、実際に自動車が道路を走ることができません。自動車が走るためには、設計図に基づいて実際に自動車を製造する必要があります。

クラスとインスタンスの関係も同様です。クラスが動作するためには、クラスに基づいてインスタンスを生成する必要があります。

インスタンス(instance) は「実体」などの意味を持つ言葉です。「クラスに基づいて生み出されたもの」と言葉を変換しておくと良いでしょう。

7-4 インスタンスの生成と利用

ではここから実際にインスタンスを生成し、利用するプログラムを作成しますが、その前にインスタンスのイメージを示しておきたいと思います。

7-4-1 インスタンスのイメージ

インスタンスは、クラスという設計図に基づいて作成された、クラスのコピーのようなものです。下図はItemクラスから、2つのインスタンスを生成したイメージです。

図のポイントを3つ示します。

  • インスタンスはクラスで定義したフィールドやメソッドを持っていると考えてください。
  • インスタンスは複数生成することができます。
  • フィールドは個別に異なる値を持つことができます。

7-4-2 インスタンスを利用するプログラム

それでは、インスタンスを利用するために必要な文法の説明を行います。

インスタンスの生成

型名 変数名 = new クラス名();
  • インスタンスを変数に代入して扱う例です。
  • new クラス名()がインスタンスを生成する部分です。
  • 型名の部分には、クラス名と同じものが入ります。
    ※クラスを定義すると、そのクラス名が型名として使えます。

フィールドの利用

変数名.フィールド名

※変数はインスタンスが代入されたもの

メソッド呼び出し

変数名.メソッド名(引数)

※変数はインスタンスが代入されたもの

上記の記述を使って、メインクラスでインスタンスを生成し、動作させるプログラムを書くと次のようになります。

プログラム例(Main.java)

public class Main {
    public static void main(String[] args) {
        //インスタンスの生成
        Item mikan = new Item();
        //フィールドへの代入
        mikan.name = "みかん";
        mikan.price = 200;
        //メソッドの利用
        mikan.display();
    }
}

解説
下にプログラムとインスタンスのイメージをあわせて示します。

Itemインスタンスの利用

  • 4行目でItemインスタンスを生成し、変数mikanに代入しています。
  • 6,7行目では、変数mikanが示すインスタンスのフィールドに値を代入する記述です。
  • 9行目では、変数mikanが示すインスタンスのdisplayメソッドを呼び出しています。
ここで作成したmainメソッドには再びpublic staticがついています。publicやstaticについては、もう少し先のテーマで扱うことになります。
現時点では

  • プログラムの開始点となるmainメソッドはpublic staticをつける。
  • それ以外のメソッドはつけない。

と理解していただければOKです。

7-4-3 プログラムを動作させる

mainメソッドを持つMainクラスができましたので、ここまで作成した一連のプログラムを動作させることができます。

まず始めに2つのプログラムを同じフォルダに配置します。下はjavaという名前のフォルダに配置した例です。

フォルダ構成

次にコマンドプロンプトを起動します。プログラムのあるフォルダに移動したら、まずはコンパイルです。

javac *.java

*.javaと記述すると、カレントフォルダ内のすべてのJavaファイルを一括コンパイルできます。

実行する際は、mainメソッドを持つクラスを実行します。

java Main

実行結果

みかん:200

実行結果の表示は、displayメソッドの呼び出しによるものです。displayメソッド内のnamepriceは、下図のようにインスタンスの持つフィールドを示しています。

displayメソッド

フィールドはクラスブロック内に定義されていますので、フィールドの利用可能範囲(スコープ)はクラスブロック全体です。

7-4-4 複数のインスタンスを利用する

次に複数のインスタンスを利用するプログラム例をご紹介します。Item.javaは7-2で作成したものをそのまま使用し、Main.javaのみを新規に示します。

プログラム例(Main.java)

public class Main {
    public static void main(String[] args) {
        //2つのインスタンスを生成
        Item mikan = new Item();
        Item ringo = new Item();
        //それぞれのフィールドに値を代入
        mikan.name = "みかん";
        mikan.price = 200;
        ringo.name = "リンゴ";
        ringo.price = 150;
        //メソッドの呼び出し
        mikan.display();
        ringo.display();
    }
}

実行結果

みかん:200
リンゴ:150

解説
下図のように、ringomikanの2つのインスタンスを生成し、それぞれのフィールドに個別の値を代入。displayメソッドで表示を行っています。

2つのインスタンス

ポイントは、displayメソッドが自身のインスタンスのフィールドを参照して、値を表示しているという点です。

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