Java
2021.12.07
Javaのインスタンス化とは?クラスとの関係や生成方法をわかりやすく解説
2023.11.10


1.Javaのインスタンスについて学ぶ前の前提知識

インスタンスを学ぶ前に知っておかなければならないのが「クラス」や「オブジェクト指向」です。これらがどういうものなのか、インスタンスにどう関係しているのかを見ていきましょう。

①クラスについて

「クラス」とは「インスタンスを生成する際に用いられる設計図」の役割を持つものであり、フィールド(設計するものの属性)とメソッド(設計するものの操作)を定義します。


例として、ロボットの設計を考えてみましょう。設計図のフィールドにはロボットの名前や色などの属性情報が入り、メソッドには話す、歩くなどのロボットに行わせる操作が入ります。そしてこの設計図から作られるのがロボットです。


これをクラスとインスタンスに戻して考えると、設計図がクラスにあたり、作られたロボットはインスタンスにあたります。


つまり設計図がなければロボットが作れないのと同じように、クラスがなければインスタンスの生成もできません。インスタンスにとって、クラスは必要不可欠なものなのです。

②オブジェクト指向について

オブジェクト指向は、プログラミングを簡単に行うために作られた手法のひとつ。JavaだけでなくRuby、Pythonなどでも使われます。


この手法は、クラスから「オブジェクト」という部品を作り、オブジェクトの連携によってプログラムを記述していくというものです。


オブジェクト指向と比較される手法として、行いたい処理を順番に記述する手続き型という手法があります。C言語などはこの手法を使った言語で、短い処理を書く際にはわかりやすく学習コストも低いです。


しかし大規模なプログラムを手続き型で書いていると、内容を把握しきれなくなってしまうことや、プログラムの仕様変更が難しくなることがあります。


その点、前述の通りオブジェクト指向は部品を作りながらプログラムを書くため、それらの問題を解決できるのです。

2.インスタンスとは?


ここから、本題であるインスタンスについて説明していきます。


インスタンスはクラスから作られたオブジェクトのことです。


クラスはただの設計図であり、その設計図から「もの」を作らなければ実際に使うことはできません。


そのため、設計図の役割を持つクラスから、オブジェクトという実体、「インスタンス」を作る必要があります。ロボットの設計図がクラスなら、作られたロボットがすなわちインスタンスです。



3.  インスタンス化とは?


インスタンス化とは、インスタンスを生成する行為のことを指します。これはオブジェクト指向のプログラミングを行う際には欠かせない工程です。


インスタンス化をすることで、実際にプログラムで動かすもの、インスタンスができます。設計図からロボットを作ることで実際に使えるようになるのと同じことです。


オブジェクト指向のプログラムはインスタンスを連携させて書くため、必ずインスタンス化を行います。



4.Javaでインスタンス化する方法

ここでは、実際にJavaでインスタンス化を行ってみましょう。

①クラスを作成

インスタンスを生成する前に、まずはクラスを作成する必要があります。クラスではフィールドとメソッドを定義する、ということを覚えているでしょうか。


フィールドとはクラスブロック内に宣言された変数を指し、メソッドにはクラスで行われる操作を記述します。


例を見てみましょう。

public class Robot {
    /*--フィールド--*/
    String color;
    /*-------------*/

    /*--メソッド--*/
    public void hello() {
        System.out.println("こんにちは");
    }

    public void getColor() {
        System.out.println("色は" + this.color + "です");
    }
    /*------------*/
}

今回はRobotという名前のクラスを作成しました。


Robotクラスのフィールド「color」は、ロボットの色名を格納する変数としています。メソッドは”こんにちは”とあいさつをする「hello」、色名を出力する「getColor」の2つを定義しました。

クラスを宣言する際の注意点

クラスを宣言する際の注意点が2つあります。


1つ目は、getColorメソッドにおいて、出力する変数がcolorではなくthis.colorとなっていることです。


colorはRobotクラス内の変数なので、クラス内でアクセスする分には「this.」がなくても動きます。しかし、実際に実行するMainクラス内のローカル変数にもcolorが存在する場合、予想通りに動作しない可能性があるのです。


このため「this.」をつけてどのクラスの変数を指しているのか明示すると、後々プログラムを改変しても間違いが起こりにくくなります。


2つ目は、クラス、フィールド、メソッドの名前を定義する際の慣例についてです。慣例には下記のようなものがあります。

・クラスは先頭を大文字にする

・フィールドとメソッドは先頭が小文字、先頭以外の単語の頭文字が大文字


例えば、今回宣言したクラス「Robot」では先頭を大文字にしています。フィールド「color」とメソッド「hello」は先頭が小文字です。


「getColor」については、先頭が小文字なのに加え、「get」「color」の2つの単語に分かれているので、先頭ではない「color」の頭文字だけを大文字にしています。


実際にはこれらを守らなくてもプログラムがエラーになることはありません。しかし、基準がないまま名前を決めていると可読性が落ち、複数人での開発のときにはエラーの原因になります。名前の付け方も少し意識してみましょう。

②クラスを基にnew演算子でインスタンスを生成

先ほど作成したクラスをもとに、インスタンスを生成してみましょう。インスタンスの生成は、new演算子を使って以下のように記述できます。

クラス名 インスタンス名 = new クラス名();

では実際に生成を行ってみましょう。

public class Main {
    public static void main(String[] args) {
        Robot exRobot = new Robot();
    }
}

今回はexRobotという名前のインスタンスを生成しています。これによりロボットの設計図からexRobotというロボットが完成し、実際に使える状態になりました。

③インスタンス化したオブジェクトを使用

インスタンス変数を使用する

先ほど生成したインスタンスから、インスタンス変数を使用してみましょう。

下記のように書くことでインスタンス変数にアクセスできます。

インスタンス名.インスタンス変数名

この通りにインスタンス変数にアクセスし、実際に使ってみます。

public class Main {
    public static void main(String[] args) {
        Robot exRobot = new Robot();
        exRobot.color = "青"; //インスタンス変数colorに"青"を代入
        System.out.println(exRobot.color);
    }
}

出力:

インスタンス変数colorに色名を代入し、出力しました。アクセスする際にインスタンス名をつける必要があること以外は、変数の使い方に違いはありません。

インスタンスメソッドを使用する

次はインスタンスメソッドを使用してみましょう。インスタンス変数を使う場合と同じような使い方です。

インスタンス名.インスタンスメソッド();

では実際に使ってみます。

public class Main {
    public static void main(String[] args) {
        Robot exRobot = new Robot();
        exRobot.color = "青"; // インスタンス変数colorに"青"を代入
        exRobot.hello(); // helloメソッドを使用
        exRobot.getColor(); // getColorメソッドを使用
    }
}

出力:

こんにちは
色は青です

今回は「こんにちは」とあいさつをするhelloメソッド、自分の色を取得するgetColorメソッドを両方使いました。


インスタンスメソッドに関しても、インスタンス名を書く必要があることを忘れないようにしましょう。

5.インスタンスを複数生成した場合の挙動


クラスは設計図の役割を持つため、ひとつのクラスからインスタンスを複数生成できます。実際の例から挙動を見てみましょう。

public class Main {
    public static void main(String[] args) {
        Robot blueRobot = new Robot();
        blueRobot.color = "青"; // インスタンス変数colorに"青"を代入
        blueRobot.getColor(); // getColorメソッドを使用

        Robot pinkRobot = new Robot();
        pinkRobot.color = "ピンク"; // インスタンス変数colorに"ピンク"を代入
        pinkRobot.getColor(); // getColorメソッドを使用

        Robot yellowRobot = new Robot();
        yellowRobot.color = "黄色"; // インスタンス変数colorに"黄色"を代入
        yellowRobot.getColor(); // getColorメソッドを使用
    }
}

出力:

色は青です
色はピンクです
色は黄色です

同じクラスRobotからblueRobot、pinkRobot、yellowRobotの3つのインスタンスを定義しました。設計図が同じだけでそれぞれ別物なので、インスタンス変数、インスタンスメソッドも別物として使えます。今回の例でも、インスタンス変数colorが異なるためgetColorメソッドの結果も異なります。

 今回はインスタンスをロボットに見立てて説明しました。


オブジェクト指向のプログラミングは、インスタンス(ロボット)を組み合わせてプログラムを記述していく、というイメージです。このイメージを覚えておけば、オブジェクト指向を少し理解しやすくなるのではないでしょうか。



この記事をシェア