PR

Java:クラス/インスタンスの概念と使い方を3分でわかりやすく

Java

Javaはオブジェクト指向プログラミング(OOP)を基盤としたプログラミング言語です。つまり、その中核をなすのが「クラス」と「インスタンス」の概念です。この2つの概念の基礎理解なしでは、Javaのプログラム設計や、複雑なJavaアプリケーションの開発を行うことはできません。

ですが、特にプログラミング初心者にとってはこの概念を理解することが鬼門で「オブジェクト指向」って何?というところで挫折してしまう方も多くいらっしゃいます。そこで、このページでは①クラスとインスタンス(オブジェクト)の基本的な概念から解説し、②具体的なコード例を通じてその使い方を詳しく解説していきます。日常生活に例えながら説明していきますので、初心者の方でもきっと理解できるでしょう。

この記事を読み終える頃には、クラスとオブジェクトの役割を深く理解し、実践的に活用できるようになっているでしょう。是非最後までご覧ください。

  • クラスはオブジェクトを作るための設計図。
  • インスタンスはその設計図から作られた実際のオブジェクト。
  • 基本の構文としては、クラスを定義し、必要なフィールド、コンストラクタ、メソッドを記述し、new キーワードでインスタンスを生成するという流れ。
スポンサーリンク

Java「クラス」と「インスタンス」

Javaはオブジェクト指向プログラミングという考え方を基本にして作られた言語です。このオブジェクト指向プログラミングを理解するために欠かせないのが、「クラス」と「インスタンス」という2つの概念。結論からざっくり説明すると、クラスは「設計図」、インスタンスはその設計図を元に作られた「製品」のようなもの。

例えば「車」を作る場合。車を作る場合に必要となるのがとりあえず必要となるのが設計図です。この設計図がクラス。で、設計図には車の種類や色、エンジンの種類などが記載されていますが、この設計図を元に実際に作られた車がインスタンスです。

クラスとインスタンスの概念
図1:クラスとインスタンスの概念

より具体的に説明すると、クラスはそのオブジェクトの性質や動きを定義するもの。つまり、車で言えば「車とは何か」「車はどう動くか」を決めるのがクラス。そして、そのクラスに基づいて作られた具体的な車、例えば「赤いスポーツカー」がオブジェクトです。

Java:クラスの定義

クラスはインスタンスの「設計図」のようなもので、オブジェクトが持つ属性(プロパティ)や、どのような動きをするか(メソッド)を定義します。

Java クラス,Java メソッド,Java プロパティ
図2:クラスとメソッド/プロパティ

ここでは日常生活の例を用いてスマートフォンのクラスを作っていきたいと思います。スマートフォンには、OSやメーカー、モデルなどの属性(プロパティ)があります。また、電話をかけたり、インターネットに接続したり、写真を撮ったりする機能(メソッド)も持っています。図にすると↑のような感じ。

Javaでは↓のように、スマートフォンを表現するクラスを定義します。

public class Smartphone {
    // フィールド(プロパティ)
    String os;       // OS
    String maker;    // メーカー
    String model;    // モデル

    // コンストラクタ(オブジェクトを初期化するための特別なメソッド)
    public Smartphone(String os, String maker, String model) {
        this.os = os;
        this.maker = maker;
        this.model = model;
    }

    // メソッド(動きや機能)
    public void makeCall(String number) {
        System.out.println("Calling " + number + "...");
    }

    public void connectToInternet() {
        System.out.println("Connecting to the internet...");
    }

    public void takePhoto() {
        System.out.println("Taking a photo...");
    }
}

↑の例では、Smartphoneという名前のクラスを作成しています。これが設計図の名前で、後で実際に製品を製造(オブジェクトを作る)際に利用されます。

そして、このクラスには、3つのプロパティ(osmakermodel)があることが分かります。プロパティと言っても、結局はクラスの中で定義する「変数」だと理解すればOKです。

    // フィールド(プロパティ)
    String os;       // OS
    String maker;    // メーカー
    String model;    // モデル

さらに、Smartphoneクラスにはコンストラクタと呼ばれる特別なメソッドがあり、新しいSmartphoneオブジェクトを作成するときにOS、メーカー、モデルを設定されていることが分かります。(「コンストラクタ」については別途詳細を解説するので、ここではひとまず初期化用のメソッドだと理解すればOKです。)

    // コンストラクタ(オブジェクトを初期化するための特別なメソッド)
    public Smartphone(String os, String maker, String model) {
        this.os = os;
        this.maker = maker;
        this.model = model;
    }

そして、最後にmakeCallconnectToInternettakePhotoという3つのメソッドを使って、オブジェクトが電話をかけたり、インターネットに接続したり、写真を撮ったりする機能を定義しています。

    // メソッド(動きや機能)
    public void makeCall(String number) {
        System.out.println("Calling " + number + "...");
    }

    public void connectToInternet() {
        System.out.println("Connecting to the internet...");
    }

    public void takePhoto() {
        System.out.println("Taking a photo...");
    }

参考 Javaのメソッドとは?メソッドの使い方を解説

ポイント クラスの主な構成要素

  1. プロパティ(フィールド)
    • オブジェクトが持っている「特徴」や「情報」を表すもの(例: OS、メーカー、モデル)。
  2. コンストラクタ
    • 新しいオブジェクトを作成するときに呼ばれる特別なメソッド。コンストラクタは、オブジェクトが持つプロパティを初期設定(最初の値をセット)するために使われる。
  3. メソッド
    • オブジェクトの動きや機能を定義する(例: 電話をかける、インターネットに接続する、写真を撮る)

補足)コンストラクタとは?

コンストラクタはオブジェクトを作成するときに呼び出される特別なメソッドです。コンストラクタの主な役割は、オブジェクトが生成されたときにそのオブジェクトの初期状態を設定することで、クラス名と同じ名称で定義されます。

public class Smartphone {
    String os;
    String maker;
    String model;

    // コンストラクタ
    public Smartphone(String os, String maker, String model) {
        this.os = os;
        this.maker = maker;
        this.model = model;
    }
}

このコンストラクタは、新しいSmartphoneオブジェクトを作成するときに、osmakermodelの値を設定しています。

ポイント コンストラクタとは?

  1. クラス名と同じ名前で定義されるメソッド
    • コンストラクタの名前は、そのクラスの名前と同じでなければなりません。これにより、コンストラクタがどのクラスのものであるかが明確になります。
  2. 戻り値の型がない
    • コンストラクタは値を返さないため、戻り値の型を指定しません。普通のメソッドとは異なり、voidすら書きません。
  3. オブジェクトの初期化
    • コンストラクタは、新しいオブジェクトが作られるときに、そのオブジェクトの初期状態を設定します。例えば、スマートフォンのOS、メーカー、モデルを設定します。

Java:インスタンスの作成(インスタンス化)

クラスが「設計図」だとすると、インスタンス(=オブジェクト)はクラスに基づいて作成される「具体的なもの・製品」です。インスタンスはクラスで定義されたプロパティ(属性)やメソッド(機能)を持ち、それらを使ってさまざまな動作をします。

先ほどのスマートフォンの例で言えば、「OS」や「メーカー」「モデル」といったプロパティ、「電話をかける」「インターネットに接続する」「写真を撮る」といったメソッドは全てクラスとして定義されますが、実際にそのクラスから作られる具体的なスマートフォンがオブジェクトです。

クラスとインスタンスの概念
図1:クラスとインスタンスの概念

具体的に、Javaでスマートフォンクラスのインスタンスを作成する例を見てみましょう。

public class Main {
    public static void main(String[] args) {
        // Smartphoneクラスからオブジェクトを作成
        Smartphone myPhone = new Smartphone("Android", "Google", "Pixel");
        
        // オブジェクトのメソッドを使う
        myPhone.makeCall("123-456-7890");
        myPhone.connectToInternet();
        myPhone.takePhoto();
    }
}

これはSmartphoneクラスを使ってmyPhoneという名前のオブジェクトを作成する例です。Javaでは、newキーワードを使ってオブジェクトを作成します。以下の部分がそれ。

// Smartphoneクラスのインスタンス化(オブジェクトを作る)
Smartphone myPhone = new Smartphone("Android", "Google", "Pixel 5");

この部分を簡単に説明すると、

  1. Smartphone myPhone →「Smartphone型の変数myPhoneを作っている」ということ。Smartphoneクラスは設計図であり、myPhoneという名前の変数をその設計図の型で作成しています。
  2. new Smartphone("Android", "Google", "Pixel 5") →「Smartphoneクラスに基づいて具体的なオブジェクトを作り、そのオブジェクトにOS、メーカー、モデルの情報をセットしている」ということ。

つまり、この行全体では「Smartphone型の変数myPhoneを作り、その変数に具体的なSmartphoneオブジェクト(AndroidOSのGooglePixel 5)を代入している」ことを示しています。これが本質です。

尚、クラスからオブジェクトを作成することを具体的に「インスタンス化」と言います。実際の現場でも、オブジェクトを作成する、とは言わず基本的には「インスタンス化」という言葉が利用されるので覚えておくと良いでしょう。

ポイント インスタンスのポイント

  1. インスタンス化
    • クラスを基にして具体的なオブジェクトを作成することを「インスタンス化」と呼ぶ。↑のサンプルコードでは、new Smartphone("Android", "Google", "Pixel")がインスタンス化の部分。
  2. プロパティの利用
    • オブジェクトはクラスで定義されたプロパティを持ち、それぞれのプロパティに特定の値が設定されます。↑のサンプルでは、myPhoneosmakermodelに値が設定されている。
  3. メソッドの利用
    • オブジェクトは、クラスで定義されたメソッドを使って動作します。↑のサンプルでは、makeCallconnectToInternettakePhotoといったメソッドを呼び出している。

オブジェクトは、実際にプログラムが動作する際に使われる具体的な「もの」です。クラスという設計図からオブジェクトを作成し、そのオブジェクトを操作することで、プログラムが様々な動きを実現します。

クラスとオブジェクトの利点

クラスとオブジェクトを使う利点はプログラムがとても効率的でわかりやすくなるということです。クラスは設計図なので、同じ設計図を使っていろいろなオブジェクトを作ることができます。これにより、コードを何度も書く必要がなくなります。

例えば、スマートフォンを例に考えてみましょう。まず、スマートフォンの設計図を作成します。

public class Smartphone {
    String os;
    String maker;
    String model;

    public Smartphone(String os, String maker, String model) {
        this.os = os;
        this.maker = maker;
        this.model = model;
    }

    public void makeCall(String number) {
        System.out.println("Calling " + number + "...");
    }

    public void connectToInternet() {
        System.out.println("Connecting to the internet...");
    }

    public void takePhoto() {
        System.out.println("Taking a photo...");
    }
}

この設計図を使って、具体的なスマートフォンを作ってみます。

public class Main {
    public static void main(String[] args) {
        Smartphone phone1 = new Smartphone("Android", "Google", "Pixel 5");
        Smartphone phone2 = new Smartphone("iOS", "Apple", "iPhone 12");

        phone1.makeCall("123-456-7890");
        phone1.connectToInternet();
        phone1.takePhoto();

        phone2.makeCall("098-765-4321");
        phone2.connectToInternet();
        phone2.takePhoto();
    }
}

このコードを見ると、クラスとオブジェクトの利点がよくわかるはず。まず、同じスマートフォンの設計図(クラス)を使って、異なるスマートフォン(オブジェクト)を簡単に作ることができます。phone1はGoogleのPixel 5、phone2はAppleのiPhone 12です。

設計図を一度作れば、いろいろなスマートフォンを作るのにその設計図を使い回せるので、非常に便利です。

また、設計図に変更があった場合、一箇所を修正するだけですべてのオブジェクトにその変更が反映されます。例えば、スマートフォンに新しい機能を追加したいとき、クラスにその機能を追加するだけで、すべてのスマートフォンオブジェクトがその新しい機能を持つようになります。

さらに、クラスを使うことで、プログラムが整理されてわかりやすくなります。設計図に基づいてオブジェクトが作られるため、それぞれのオブジェクトがどのような特性を持ち、どのような動きをするかが一目瞭然です。

クラスとオブジェクトを使うことで、コードの再利用が可能になり、プログラムの保守が簡単になり、全体の構造が明確になるという大きな利点があります。これが、クラスとオブジェクトの大きなメリットです。

まとめ クラスとオブジェクトの利点

  1. 再利用性
    • クラスを一度定義すれば、何度でもそのクラスを基にオブジェクトを作成できる。これにより、コードの再利用性が高まり、プログラムの開発効率が向上する。
  2. 保守性
    • クラスを使ってプログラムを構成することで、変更が必要な場合でも特定のクラスのみを修正すれば済むため、保守が容易になる。
  3. データの一貫性
    • クラスによってデータの構造が統一されるため、データの一貫性を保つことができる。

まとめ Javaのクラスとインスタンス

クラスとは?

  • 設計図のようなもの
    クラスは「インスタンス(実際に使うもの)」を作るための設計図です。
    例えるなら、「車」というクラスがあれば、そのクラスには「色」や「速さ」といった情報(フィールド)と、「走る」「止まる」といった機能(メソッド)が定義されています。
  • まとめるためのひとまとまり
    クラス内には、実際に必要なデータ(変数)や、そのデータに対する処理(関数)がひとつにまとまっています。

インスタンスとは?

  • 実際の「車」そのもの
    インスタンスは、クラスという設計図から実際に作られたモノ(=オブジェクト)です。
    例えば、「青い車」や「赤い車」は、どちらも「車」クラスから作られたインスタンスです。
  • 実際に使うために生成する
    インスタンスを作ることで、実際にプログラム内でその機能を利用することができます。

基本的な構文ルール

  • クラスを定義する基本的な構文
class クラス名 {
    // フィールド(変数)の宣言
    型 変数名;
    
    // コンストラクタ(初期化用のメソッド)
    クラス名(引数リスト) {
        // 初期化処理
    }
    
    // メソッド(処理を記述する関数)
    戻り値の型 メソッド名(引数リスト) {
        // 処理内容
    }
}
  • フィールド: クラスに含まれるデータ(例:名前、年齢など)
  • コンストラクタ: インスタンス生成時に呼び出され、フィールドの初期値を設定するためのメソッドです。
    ※ クラス名と同じ名前で、戻り値は指定しません。
  • メソッド: クラスが持つ動作や機能を記述する部分です。
  • インスタンスは、new キーワードを使って作成
クラス名 変数名 = new クラス名(引数);

サンプルコード Personクラスの定義のインスタンス化

// Personクラスの定義
class Person {
    // フィールド(変数)の宣言
    String name;
    int age;
    
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // メソッド
    void showInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

// クラスの利用例(インスタンスの生成と使用)
class Main {
    public static void main(String[] args) {
        // Personクラスからインスタンスを生成
        Person person = new Person("Taro", 30);
        // インスタンスのメソッドを呼び出す
        person.showInfo();
    }
}
タイトルとURLをコピーしました