こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第7章をお送りいたします。
第7章のテーマは「オブジェクト」です。
第7章は2回のパートに分けて掲載します。今回はPart1です。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
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
となっています。 - 名前と価格の2つの属性は、それぞれ
name
とprice
というフィールドで示しています。 - displayメソッドの動作については、実際に動作させる際に説明をします。
7-3 オブジェクト指向プログラミングの基本
オブジェクト指向に基づいて作成したItemクラスですが、まだ実際にプログラムとして動作させることができません。ここでは、実際に動作させるためのいくつかの前提知識について説明します。
7-3-1 複数のクラスで構成する
オブジェクト指向でプログラムを書く場合、複数のクラスを作成し、相互に連携させてプログラムを動作させることになります。本章では、次のような役割をもつ2つのクラスを作成し、プログラムを動作させることを目指します。
- オブジェクトを表すクラス
- 7-2で作成したItemクラスがこれに該当します。
- メインクラス
- mainメソッドを持つクラスで、プログラムを開始する役割があります。
- オブジェクトを表すクラスを利用します。
7-3-2 クラスの本質
メインクラスからItemクラスを利用するためには、クラスの本質をもう少し正確にとらえる必要があります。
7-1でクラスはオブジェクトを表現するものと説明しましたが、正確にはオブジェクトそのものと言うよりは、オブジェクトの設計図に近いものです。クラスの記述にもとづいて、実際に動作させるにはインスタンスが必要です。
下の図は、クラスとインスタンスの関係を、自動車の設計図と実際の自動車にたとえて対比したものです。
自動車の設計図だけでは、実際に自動車が道路を走ることができません。自動車が走るためには、設計図に基づいて実際に自動車を製造する必要があります。
クラスとインスタンスの関係も同様です。クラスが動作するためには、クラスに基づいてインスタンスを生成する必要があります。
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(); } }
解説
下にプログラムとインスタンスのイメージをあわせて示します。
- 4行目でItemインスタンスを生成し、変数mikanに代入しています。
- 6,7行目では、変数mikanが示すインスタンスのフィールドに値を代入する記述です。
- 9行目では、変数mikanが示すインスタンスのdisplayメソッドを呼び出しています。
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メソッド内のname
とprice
は、下図のようにインスタンスの持つフィールドを示しています。
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
解説
下図のように、ringo
とmikan
の2つのインスタンスを生成し、それぞれのフィールドに個別の値を代入。displayメソッドで表示を行っています。
ポイントは、displayメソッドが自身のインスタンスのフィールドを参照して、値を表示しているという点です。