Javaプログラミング初心者の方は、「クラス」「メソッド」「クラスメソッド」など似たような言葉が多すぎて混乱してしまいがちです。
本記事では、Javaの学習を始めたばかりの方向けに、「クラス」「メソッド」「クラスメソッド」それぞれの意味合いの違いについてご紹介していきます。
Javaのクラスとは
Javaなどのオブジェクト指向プログラミング言語では、「クラス」という概念を理解することが最初の難関として挙げられます。
クラスは「設計図」として例えられることが多いのですが、簡単にいうと役割毎に必要な機能をまとめたもののことを指します。
クラスとインスタンス
Javaにはクラスと混乱する概念として「インスタンス」の存在が挙げられます。
先程クラスが設計図と説明したように、基本的にクラスに定義した機能はインスタンス化して利用する必要があります。
建築に例えると、クラスが設計図で、インスタンスが実際のビルということです。
クラスに定義されるもの
クラスに定義されるものとして「フィールド」と「メソッド」が挙げられます。
フィールドは、データの値を保管するために利用する機能です。
対してメソッドは、処理を記述する機能で、クラスの振る舞いを定義することが出来ます。
Javaのメソッドとは
Javaのメソッドは上述したように、クラスの中で処理を定義する機能のことを指します。
もう少し詳細を確認してみると、メソッドには「クラスメソッド」と「インスタンスメソッド」が存在します。
クラスメソッド
クラスメソッドは、クラスに紐付けられたメソッドであり、クラス全体に関連する処理を定義します。
別名「静的メソッド」とも呼ばれており、「static」と明示する必要があります。
クラスメソッドからは直接後述するインスタンスメソッドやインスタンスフィールドを呼び出すことは出来ず、クラスをインスタンス化して呼び出すことが必要です。
記述法
アクセス修飾子 static 戻り値 メソッド名(引数) { // 処理内容 }
インスタンスメソッド
インスタンスメソッドは名前の通り、インスタンスに紐付けられたメソッドであるため、クラスからインスタンスを生成しないと利用することが出来ません。
別名「動的メソッド」とも呼ばれるインスタンスメソッドでは、インスタンス固有の処理を定義していきます。
基本的にJavaでは、役割を明確に分けることが特徴となるため、クラスメソッドで定義しなければいけない理由がない限り、インスタンスメソッドを利用するのが一般的です。
記述法
アクセス修飾子 戻り値 メソッド名(引数) { // 処理内容 }
クラスメソッドとインスタンスメソッドの違いをJavaサンプルコードで確認
ではここから実際にクラスメソッドとインスタンスメソッドの違いを、Javaのサンプルコードで確認していきましょう。
クラスメソッドの利用サンプル
まずクラスメソッドの動きからですが、staticメソッドとして定義することにより、呼び出し側でインスタンス化を行わずにメソッドを利用することが出来るようになります。
public class Main { public static void main(String[] args) { Sub.classMethod(); // Sub.instanceMethod(); インスタンスメソッドは直接呼び出せない } } class Sub { int num = 2; static String str = "クラスフィールドとして定義しました。"; public static void classMethod() { System.out.println("クラスメソッドから出力しています。"); // instanceMethod(); インスタンスメソッドは呼び出せない // System.out.println(num); インスタンスフィールドは呼び出せない System.out.println(str); } public void instanceMethod() { System.out.println("インスタンスメソッドから出力しています。"); } }
実行した結果が下記です。
クラスメソッドから出力しています。 クラスフィールドとして定義しました。
4行目がクラスメソッドを呼び出している処理ですが、インスタンス化の工程を実施せず、いきなりクラスから直接メソッドを呼び出していることをご確認頂けます。
ちなみに15,16行目でコメントアウトしているように、同じクラス内に定義されたフィールドやメソッドの場合でも、インスタンスフィールドとインスタンスメソッドをクラスメソッドから直接呼び出すことは出来ません。
ただし、11行目でクラスフィールドとして定義している変数に関しては、17行目で利用しているようにクラスメソッドの中から呼び出すことが可能です。
インスタンスメソッドの利用サンプル
次はインスタンスメソッドの利用方法についてサンプルコードで確認しておきましょう。
基本的にJavaのプログラム開発では、今回のサンプルのようなインスタンスメソッドが利用されます。
public class Main { public static void main(String[] args) { Sub subClass = new Sub(); subClass.instanceMethod(); subClass.classMethod(); // staticの呼び出し方ではないためIDEで警告は出るが、実行は可能 } } class Sub { int num = 2; static String str = "クラスフィールドとして定義しました。"; public static void classMethod() { System.out.println("クラスメソッドから出力しています。"); System.out.println(str); } public void instanceMethod() { System.out.println("インスタンスメソッドから出力しています。"); System.out.println(num); } }
実行結果が下記です。
インスタンスメソッドから出力しています。 2 クラスメソッドから出力しています。 クラスフィールドとして定義しました。
インスタンスメソッドに関しては、呼び出し元で一度インスタンスを生成し、作成したインスタンスからメソッドを呼び出す必要があります。
4行目がインスタンス化を実施している部分で、生成されたインスタンスから「インスタンス名.メソッド名()」の形式で、5行目のようにインスタンスメソッドを呼び出しています。
11行目で定義している変数はインスタンスフィールドですが、21行目で利用しているように、もちろんインスタンスメソッド内部から参照することが可能です。
6行目に記述しているように実はクラスメソッドはインスタンス化したオブジェクトからでも呼び出すことが可能です。
ただし、正式な呼び出し方ではないため、上述したクラスメソッドの呼び出し方で利用するようにしましょう。
さいごに: Javaのクラスメソッドを使いこなそう
本記事では、Javaの「クラス」「メソッド」「クラスメソッド」という3つのワードについて、初心者向けに解説してきました。
クラスやインスタンスの説明では、クラスに定義されたメソッドはインスタンス化してからしか利用出来ないと記述されていることも多いのですが、クラスメソッドならインスタンス化せずに利用することが可能です。
ただしオブジェクト指向の考え方では、機能を細分化することが望ましいとされているため、クラスメソッドはあくまで補助的な役割と認識し、基本はインスタンスメソッドを利用して開発出来るようチャレンジしてみてください。
クラスメソッドは別名staticメソッドとも呼ばれています。