Javaのメソッドはプログラムを効率的にかつ再利用性の高い形で構築するための基本要素で、メソッドを理解することはJavaプログラミングの第一歩です。このページでは、Java初心者の方でも理解できるようにメソッドの定義方法、呼び出し方法、そしてその背後にある動作原理を、ステップバイステップで詳しく解説します。
メソッドを理解し、適切に活用することでより効率的で管理しやすいプログラムを作成することが可能になります。是非最後までご覧ください。
関連 Javaの1stステップ:基本的な構文ルールを1分で復習!
Javaのメソッドとは?
メソッドとは、特定の機能や処理をまとめたコードの塊です。プログラム内で同じ処理を繰り返し使いたい場合、メソッドを使うことでコードを簡潔かつ整理された形に保つことができます。あらかじめ料理のレシピを用意しておいて、後から何度も効率よく同じ料理を作れるようにするイメージです。
似たような概念に「関数」が存在しますが、Javaには「関数」という独立した概念は存在せずすべて「メソッド」として定義されるのが特徴です。
メソッドの定義方法
ここからは本題のJavaでメソッドを定義するための基本的なルールを説明していきます。
メソッドの基本構造
メソッドを定義するための基本的な構文は以下の通り。
修飾子 戻り値の型 メソッド名(引数) { // メソッドの中の処理 return 戻り値; // 戻り値がある場合 }
- 修飾子
- メソッドのアクセスレベル。例えば、
public
はどこからでも呼び出せることを意味。
- メソッドのアクセスレベル。例えば、
- 戻り値の型
- メソッドが返すデータの型。データを返さない場合は
void
を利用。
- メソッドが返すデータの型。データを返さない場合は
- メソッド名
- メソッドを識別するための名前で分かりやすく、何をするメソッドかを表す名前にする。
- 引数
- メソッドが受け取るデータ。複数の引数がある場合は、カンマで区切る。
サンプルコード 2つの整数を加算するメソッド
public int add(int num1, int num2) { int sum = num1 + num2; return sum; } // public:他のクラスからもアクセス可能であることを示す // int:このメソッドは整数型の値を返すことを示す // add:メソッド名 // (int num1, int num2):二つの整数を引数として受け取る // return sum;:計算結果を呼び出し元に返す
このコードは、整数(int
)を返すadd
というメソッドを定義しています。このメソッドは2つの整数を引数として受け取った後2つの整数を加算し、その結果を返します。
引数はメソッドに与える「インプット」で、戻り値は「アウトプット」。料理の具材を渡したら一品作ってくれるシェフのようなもので、具材にあたるのが引数、出来上がった料理が戻り値です。
戻り値がないメソッド:void
戻り値がないメソッドを定義する場合は、戻り値の型としてvoid
を指定します。例えば、戻り値のない「挨拶を表示するメソッド」であれば↓のように定義します。
public void greet(String name) { System.out.println("Hello, " + name); }
このメソッドは、name
という引数を受け取り、「Hello (名前)」を表示するだけで戻り値はありません。そのため戻り値の型には「void」を指定してます。
メソッドの呼び出し
Javaのメソッドの呼び出し方には3つの種類があり、それぞれのケースで微妙に使い方が異なります。ここでは、それぞれのメソッド呼び出しの違いと具体例を詳しく解説します。
- クラス内からのメソッド呼び出し(同じクラス内のメソッド呼び出し)
- インスタンスメソッドの呼び出し
- クラスメソッド(staticメソッド)の呼び出し
1.クラス内からのメソッド呼び出し
クラス内で定義したメソッドは、同じクラスの他のメソッドから直接呼び出すことができます。
ルール:
- 同じクラス内のメソッドは、そのまま呼び出すことが可能。
- インスタンスを使わずに、そのまま別のメソッドを呼び出します。
public class ClassInternalCall { // method1: シンプルなメッセージを表示する public void method1() { System.out.println("こんにちは!クラス内メソッドの呼び出しです。"); } // method2: method1を呼び出す public void method2() { method1(); // クラス内のメソッドをそのまま呼び出し } // mainメソッド public static void main(String[] args) { ClassInternalCall obj = new ClassInternalCall(); // インスタンスを生成 obj.method2(); // method2を呼び出し、その中でmethod1が呼ばれる } }
解説:
method1()
:- 「こんにちは!クラス内メソッドの呼び出しです。」と表示するシンプルなメソッドです。
method2()
:method1()
をクラス内から直接呼び出しています。- **
this.method1()
**と書くこともできますが、暗黙的にthis
が使われるため省略しています。
main
メソッド:- インスタンスを生成し、そのインスタンスから
method2()
を呼び出しています。 method2()
内でmethod1()
が呼ばれるため、プログラムの実行結果としてメッセージが表示されます。
- インスタンスを生成し、そのインスタンスから
2.インスタンスメソッドの呼び出し
ルール:
- インスタンス(オブジェクト)を生成してから、インスタンスメソッドを呼び出します。
参考 Javaのクラスの基本(オブジェクト&インスタンス化の基本)
ステップ1 クラスのインスタンスを作成
クラス名 オブジェクト名 = new クラス名();
ステップ2 メソッドの呼び出し
オブジェクト名.メソッド名(引数);
わかりやすい例として、自動車(クラス)に「エンジンをかける」(メソッド)という機能を定義し、それを呼び出す例を考えます。
public class Car { // メソッドの定義 public void startEngine() { System.out.println("エンジンがかかりました"); } } public class Main { public static void main(String[] args) { // Carクラスのインスタンスを作成 Car myCar = new Car(); // インスタンスを使ってメソッドを呼び出し myCar.startEngine(); } }
日常生活でも同じですが、エンジンをかけるためには車そのものが存在しないといけません。これと同じでメソッドを呼び出すには、まず自動車のインスタンス(具体的な車)を作るステップが必要です。↑のサンプルコードでは、Car
クラスのstartEngine
メソッドを使ってエンジンをかける動作を実行しています。
3.クラスメソッド(staticメソッド)の呼び出し
一部のメソッドはインスタンス化せず、直接クラスを指定することで呼び出すことが可能です。このようなメソッドをクラスメソッド(=staticメソッド)と呼びます。
ルール:
static
キーワードを使って定義したメソッドは、クラス名から直接呼び出します。- インスタンスの生成が不要です。
ポイント:
- クラスメソッドはクラス全体で共有される。
- オブジェクトを作成せずに使用できる。
クラスメソッドは、クラス名.メソッド名()
という形で呼び出します。
public class MathUtils { public static int add(int a, int b) { return a + b; } } public class Main { public static void main(String[] args) { int result = MathUtils.add(5, 3); System.out.println("結果は:" + result); } }
呼び出し方法 | 説明 | 例 |
---|---|---|
クラス内呼び出し | 同じクラス内のメソッドを呼び出す。インスタンス不要。 | method1(); |
インスタンスメソッド呼び出し | インスタンスを生成してから呼び出す。 | obj.greet(); |
クラスメソッド呼び出し | クラス名から直接呼び出す。static メソッド。 | StaticMethodCall.sayHello(); |
メソッドの動作原理をシステムの観点から理解する
メソッドがどのように動作するのか。これをシステム的な観点から正しく理解することで、プログラムの効率やバグの原因を把握しやすくなります。ここではJavaメソッドのシステム的な動作原理を詳しく解説します。
スタックフレームとメソッド呼び出し
定義したメソッドは呼び出しされると、メモリ上に作成されるスタックフレームと呼ばれる領域にメソッドの情報が保持されます。
- スタック:メソッド呼び出しの履歴を管理するデータ構造です。
- スタックフレーム:各メソッド呼び出しごとに作成され、ローカル変数や引数、戻り先の情報を保持します。
スタックフレームはレストランの注文票のようなもの。注文ごとに新しい注文票が作成され、料理が提供されるとその注文票は破棄されます。
動作の流れ:
- メソッド呼び出し時:新しいスタックフレームがスタックに積まれる。
- メソッド実行中:スタックフレーム内でローカル変数や引数が管理される。
- メソッド終了時:スタックフレームがスタックから取り除かれ、制御が呼び出し元に戻る。
引数の受け渡し
Javaでは、引数は基本的に値渡しで行われます。
- プリミティブ型:値そのものがコピーされる。
- 参照型:オブジェクトの参照(アドレス)がコピーされる。
注意点:参照型の場合、オブジェクト自体は同じものを指しているため、メソッド内でオブジェクトの状態を変更すると、呼び出し元にも影響します。
public class Example { public static void changeValue(int num) { num = 10; } public static void changeArray(int[] arr) { arr[0] = 10; } public static void main(String[] args) { int number = 5; changeValue(number); // 静的メソッドの呼び出し System.out.println(number); // 出力: 5 int[] array = {1, 2, 3}; changeArray(array); // 静的メソッドの呼び出し System.out.println(array[0]); // 出力: 10 } }
Javaメソッド練習問題
メソッドの使い方をマスターするためには、実際に手を動かしてみるのが一番です。ここでは、初心者でも取り組みやすい計算機プログラムを中心に、メソッドを使った練習問題を3つ用意しました。
問題 1:足し算メソッドを作成するプログラム
課題内容:
- 2つの整数を引数として受け取り、それらを加算して結果を返すメソッドを作りましょう。
条件:
- メソッド名は
add
とする。 - メインメソッドから
add
メソッドを呼び出して、結果を表示してください。
public class Calculator { // 2つの整数を加算するメソッド public static int add(int a, int b) { return a + b; } public static void main(String[] args) { int result = add(3, 4); // メソッドの呼び出し System.out.println("足し算の結果: " + result); // 出力: 足し算の結果: 7 } }
問題 2:簡単な電卓プログラム
課題内容:
- 4つの基本的な計算を行うメソッド(足し算、引き算、掛け算、割り算)をそれぞれ作りましょう。
条件:
- メソッド名は以下のようにします:
add(int a, int b)
:足し算subtract(int a, int b)
:引き算multiply(int a, int b)
:掛け算divide(int a, int b)
:割り算(割り算の際、割る数が0にならないようにチェック)
- 各メソッドの結果を表示するプログラムを作成してください。
public class SimpleCalculator { // 足し算メソッド public static int add(int a, int b) { return a + b; } // 引き算メソッド public static int subtract(int a, int b) { return a - b; } // 掛け算メソッド public static int multiply(int a, int b) { return a * b; } // 割り算メソッド (0除算のチェック付き) public static double divide(int a, int b) { if (b == 0) { System.out.println("エラー: 0で割ることはできません。"); return 0; } return (double) a / b; } public static void main(String[] args) { System.out.println("足し算: " + add(5, 3)); // 出力: 足し算: 8 System.out.println("引き算: " + subtract(5, 3)); // 出力: 引き算: 2 System.out.println("掛け算: " + multiply(5, 3)); // 出力: 掛け算: 15 System.out.println("割り算: " + divide(6, 2)); // 出力: 割り算: 3.0 divide(5, 0); // 出力: エラー: 0で割ることはできません。 } }
問題 3:最大値を求めるプログラム
課題内容:
- 3つの整数を引数として受け取り、その中で最大の値を返すメソッドを作りましょう。
条件:
- メソッド名は
findMax
とする。 - メインメソッドから
findMax
を呼び出して、3つの値のうち最大値を表示してください。
public class MaxValueFinder { // 3つの整数の最大値を求めるメソッド public static int findMax(int a, int b, int c) { int max = a; // 初期値としてaを設定 if (b > max) { max = b; } if (c > max) { max = c; } return max; } public static void main(String[] args) { int maxValue = findMax(42, 35, 27); // メソッドの呼び出し System.out.println("最大値は: " + maxValue); // 出力: 最大値は: 42 } }