メソッドについて

この節の要点

  • メソッドとはオブジェクトに含まれる関数のことである。
  • 関数とメソッドの違いは、引数に基づいて処理が変わるのが関数、オブジェクトの内部状態に基づいて処理が変わるのがメソッドである。
  • メソッドを呼び出すためにはオブジェクトを介して呼び出す方法、あるいはクラスを介して呼び出す方法の2種類がある。
  • オブジェクトを介してメソッドを呼び出すためには、new演算子を使ってオブジェクトを作らなければならない。
  • クラス名.メソッド名()のように.(ピリオド)を介してクラスから直接呼び出すことができるメソッドをクラスメソッドと呼ぶ。

メソッドとは、先に述べたようにプログラムの処理を1まとまりにして名前を付けたものです。この名前を使って処理を呼び出すことができます。Cなどの、関数をイメージしてもらえば、それとほぼ同等の意味ですが、少し意味合いが異なります。

まず、Cの関数をソースコードに定義する際に、なるべく近い目的の関数が集められて定義されますが、特に制約はありません。

対して、メソッドはクラス内に定義する際に、クラスから作られたオブジェクトが持つデータを改変する・利用して実現される目的で定義されます。 つまり、オブジェクトが表現する役割、に対して操作が定義されます。

この違いを見るために例として、電灯の機能をプログラムで実現してみます。Cであれば、例えば以下のように定義できます。

  • データ
    • 電灯を表す情報が集められた構造体(変数の集合)
  • 操作
    • 渡された電灯をオンにする関数
    • 渡された電灯をオフにする関数

直感的に、データが先に定義され、それを使った操作を定義するでしょう。では次に、以下のような電灯オブジェクトを例に挙げて考えてみましょう。

  • 電灯オブジェクト
    • データ
      • スイッチの状態: ONかOFFか
    • 操作
      • 電灯をオンにする
      • 電灯をオフにする

ここで仮定した電灯オブジェクトは、データであるスイッチの状態を変更する操作から構成されています。 これを見る限り、まず、電灯そのものをオブジェクトに置き換えて、その電灯に対する操作(メソッド)を定義しています。

以上をまとめると、関数は定義するにあたって特に制約はなく、メソッドは定義するにあたってクラスの役割に沿う、という違いがあります。

また、Cの関数は定義されているソースコードを読み込みさえすれば、関数名を使ってどこでも呼び出すことができました。 ですが、メソッドはクラス内に定義されており、つまりクラスが持っているわけです。つまり、何らかの形でクラスを介してしかメソッドを実行できません。

メソッドを実行する際には、次の2つの方法があります。

  • オブジェクトを介してメソッドを呼び出す。
  • クラスを介してメソッドを呼び出す。

オブジェクトを介してメソッドを呼び出している例を図65に示します。

Scanner scan = new Scanner(System.in); // クラスからnew演算子でオブジェクトを生成
String input = scan.nextLine(); // オブジェクトを介してメソッドを呼び出し
図65:Scannerオブジェクトを介したメソッド呼び出し例

まず、new演算子を使って、ScannerクラスからScannerオブジェクトを作成し、scan変数に代入します。 このscan変数(が指し示すScannerオブジェクト)を介して、nextLineメソッドを呼び出しています。 このように、(オブジェクトが割り当てられた変数名).(メソッド名)のようにピリオドを使ってオブジェクトの内部にあるものを呼び出しているわけです。

一般的に、Javaではこのオブジェクトを介したメソッド呼び出しを主体にプログラムが構成されます。

次に、クラスを介してメソッドを呼び出している例を図66に示します。

String nstr = "42";
int x = Integer.parseInt(nstr); // クラスを介したメソッド呼び出し
図66:Integerクラスを介したメソッド呼び出し例

このIntegerクラスは整数を表すクラスで、parseIntメソッドは文字列を整数型に変換するメソッドです。先のオブジェクトを介したメソッドと違う点は、new演算子を使ってオブジェクトを作成することなく、(クラス名).(メソッド名)のように、ピリオドを使ってクラスから直接呼び出しています。 このようなクラスを介して直接呼び出すことができるメソッドのことを クラスメソッド と呼びます。

Javaでは、以上の2種類のメソッドがあって、これらを場合に応じて定義、利用します。

なおこれ以降、特に指定がない限り、単に メソッド と記述している場合はオブジェクトを介した呼び出し方ができるメソッド\(\dagger\) 、クラスメソッド はクラスを介した呼び出し方ができるメソッドとします。


\(\dagger\): なお非クラスメソッドはインスタンスメソッドと呼ばれることが多いです。これはオブジェクト(インスタンス)を介した呼び出し方をするメソッドであることに由来します。ですが、本演習ではインスタンスの定義を避けたため、この呼称を使わないようにしています。