Developer

【はじめてのJava】インスタンス【オブジェクトとクラス編】
2021.02.20
Lv1

【はじめてのJava】インスタンス【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「クラス」について扱いました。

今回は「インスタンス」について扱っていきます。


目次


インスタンス

 インスタンス とは実体、存在、実物、…、のような意味です。

オブジェクトの時と同様に、多少意味があいまいなのは英語のinstanceに1対1で対応する単語が存在しないためです。ここも、あまり深追いせずに「実体っぽいもの」というイメージができれば十分です。

では、車を例にして現実世界と比べてみましょう。

実際に車を製造する場合、以下の図のように、設計図を基に実体を製造します。

これを「クラス」と「インスタンス」に当てはめると以下のようになります。

つまり、「クラス」を基にして「インスタンス」が作られるわけです。


インスタンス化

先ほどの画像で現実世界での「設計図」に当たるものが「クラス」、「実体」に当たるものが「インスタンス」だと説明しました。

Javaではクラスを基にして新しくインスタンスを生成すること インスタンス化する と言います。

「クラス」「インスタンス化」「インスタンス」を先ほどの図で表すと次のようになります。

ではどのようにしてインスタンス化を行えばいいのでしょうか。


インスタンス化の方法

Javaでクラスを基にインスタンス化したい場合は、newキーワードを使って記述します。

まずは書き方を見てみましょう。書き方は以下の通りです。

クラス名 変数名 = new クラス名();

クラス名のところには、インスタンス化したいクラス名を正確に書きます。大文字小文字の違いもダメです。

変数名はインスタンス化した車を利用する際に使います。命名則さえ守っていればどのような名前でもOKです。

例えば、前回書いたCarクラスを、myCarという変数名で利用できるようにインスタンス化する場合は以下のように書きます。

Car myCar = new Car();

これが、Carクラスの動かし方のサンプルプログラムに記載されていたnewの正体です。
(クラクションを鳴らす部分はまた別の回で解説します。)


インスタンス化を使う利点

ここまででインスタンス化の方法はわかりました。しかし、いまいちインスタンス化を使う利点がピンと来ていないかもしれません。

そこで、インスタンス化を使う利点を考えてみましょう。

ここでも車の例を考えてみます。

もし車を作るときに、「世界で1台だけしかない車」を作りたいなら、設計図無しでもいいかもしれません。その車は完成した後、他の誰も同じものを作ることはできないでしょう。

では「形などは同じで色だけが違う車を100台作りたい」となったらどうでしょうか。この場合は、1台1台手作りするよりも、設計図を作ってそれを基に車を作り出し、作る際に色だけ変更したほうが方が圧倒的に早いはずです。

インスタンス化を使う利点はここにあります。

Javaでは一度クラスを作ってしまえば、そのクラスを基にいくつもインスタンスを生成することができます。

例えばCarクラスの場合は以下の図のようなイメージです。

一度クラスを作ってしまえば、インスタンス化した数だけインスタンスを作ることができます。一度Carクラスを作ってしまえば、あとは以下のように書くことで「myCar」と「myCar2」という、別々のインスタンスを作ることができます。

Car myCar = new Car();
Car myCar2 = new Car();

また、別の利点として、Carに変更が必要になった場合、Carクラスを修正すればそれがすべてのインスタンスに反映されるという点もあります。1つ1つのインスタンスを個別に直す必要はありません。

クラスやインスタンス化の考えを利用してプログラムを作成しておくことで、ソースコード(例ではCarクラス)の変更やメンテナンスを楽に行うことができるのです。


コラム:オブジェクトとインスタンスの関係

Javaの世界ではオブジェクトを表現するために「インスタンス」を使っています。つまり、インスタンスは(数ある)オブジェクトの中の一種です。しかし、Javaの資料を読んでみると、「オブジェクト≒インスタンス」という表現を見かけることが多々あります。なぜでしょうか。

本来であれば「オブジェクト」と「インスタンス」はしっかりと区別して使われるべきですが、そもそも「object」も「instance」も1対1で訳せる日本語は存在せず、単純な翻訳で理解することが困難です。
それに加えて、「オブジェクト=インスタンス」と考えても意味が通る場面が多くあります。このことから、「オブジェクト≒インスタンス」という見方をされることが多いのです。

厳密な区別がないと困る場面にいきなり遭遇することは無いと思いますので、今はあまり深く追いすぎず『「オブジェクト」と「インスタンス」は似たような意味で使われることが多いんだ。』ぐらいの感覚で問題ありません。

もし興味が出てきたら、ぜひご自身で違いを調べてみてください。奥が深く面白い世界が広がっています。


サンプルソース

【注意】コマンドプロンプト上でコンパイル、実行する場合は、ソースコードを保存するときに コマンドプロンプトと同じ文字コードで保存してください。 通常はメモ帳ならANSI、サクラエディタならSJISを選択すればOKです。

ここまで読んだうえで、改めて以前見たCarクラスを動かすためのサンプルプログラムを見てみましょう。
なお、メソッドについては改めて紹介します。

Carクラスは以下の通りです。このCarクラスにはmainメソッドが無いため、単独では動きません。

class Car{
  double speed; //速さ
  int number; //ナンバー
  String color; //色
  void clac(){ //クラクションを表すclacメソッド
    System.out.println("プップー");
  }
}

そこで、このCarクラスを、別のクラスの中でインスタンス化して利用してみます。

例えば、MyCarDriveというクラスを作り、その中のmainメソッドの中でインスタンス化すると以下のようになります。

public class MyCarDrive{
  public static void main(String[] args){
    Car myCar = new Car(); 
    myCar.clac();
  }
}

2つのクラスはバラバラのファイルに書いてOKです。その場合は、必ず同じフォルダ内に2つのCar.javaとMyCarDrive.javaを作成してください。また、コンパイルはCar.javaを先に行ってください(最近のJavaであれば、MyCarDriveを先にコンパイルしても動くはずですが、念のためCar.javaを先にコンパイルしてください)。

同じファイルにCarクラスとMyCarDriveクラスを書く場合、ファイル名はpublicがついている方を優先してMyCarDrive.javaにしてください。

実行結果は以下の通りです。


まとめ

Javaではクラス(設計図)からインスタンス(実体)を作り出して利用する。
クラスからインスタンスを作るためにはインスタンス化を行う。
クラスを基にしたインスタンス化にはnewキーワードを利用する。

次回

次回はインスタンス変数について詳しく触れていきます。


はじめてのJavaシリーズの目次はこちら
プログラムの作り方編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら