PR

Javaメソッド完全ガイド:定義方法・呼び出し方法と動作原理を徹底解説

Java

Javaのメソッドはプログラムを効率的にかつ再利用性の高い形で構築するための基本要素で、メソッドを理解することはJavaプログラミングの第一歩です。このページでは、Java初心者の方でも理解できるようにメソッドの定義方法、呼び出し方法、そしてその背後にある動作原理を、ステップバイステップで詳しく解説します。

メソッドを理解し、適切に活用することでより効率的で管理しやすいプログラムを作成することが可能になります。是非最後までご覧ください。

関連 Javaの1stステップ:基本的な構文ルールを1分で復習!

スポンサーリンク

Javaのメソッドとは?

メソッドとは、特定の機能や処理をまとめたコードの塊です。プログラム内で同じ処理を繰り返し使いたい場合、メソッドを使うことでコードを簡潔かつ整理された形に保つことができます。あらかじめ料理のレシピを用意しておいて、後から何度も効率よく同じ料理を作れるようにするイメージです。

似たような概念に「関数」が存在しますが、Javaには「関数」という独立した概念は存在せずすべて「メソッド」として定義されるのが特徴です。

参考)関数とメソッド
  • 関数(Function)
    • 一般的なプログラミング言語(例えば、PythonJavaScript)では、関数は独立して存在し、特定のタスクを実行する。
  • メソッド(Method)
    • メソッドは、オブジェクト指向プログラミング(OOP)で使われる用語で、特定のクラスに関連付けられた関数です。

メソッドは、クラスの中で定義され、クラスを通して利用するものであるということを理解できればOKです。

メソッドの定義方法

ここからは本題の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つの整数を加算し、その結果を返します。

引数はメソッドに与える「インプット」で、戻り値は「アウトプット」。料理の具材を渡したら一品作ってくれるシェフのようなもので、具材にあたるのが引数、出来上がった料理が戻り値です。

Javaメソッドの引数と戻り値
図1:Javaメソッドの引数/戻り値

戻り値がないメソッド:void

戻り値がないメソッドを定義する場合は、戻り値の型としてvoidを指定します。例えば、戻り値のない「挨拶を表示するメソッド」であれば↓のように定義します。

public void greet(String name) {
    System.out.println("Hello, " + name);
}

このメソッドは、nameという引数を受け取り、「Hello (名前)」を表示するだけで戻り値はありません。そのため戻り値の型には「void」を指定してます。

voidは英語で「空(から)」や「無(なし)」を意味します。

Q
戻り値が複数になることはある?
A

Javaでは、1つのメソッドが複数の戻り値を直接返すことはできません。が、複数の値を返す方法として、以下の方法があります。

パターン1 オブジェクトを使う方法

複数の値を格納するクラスを作成し、そのクラスのインスタンスを返す。

public class Result {
    int sum;
    int product;

    public Result(int sum, int product) {
        this.sum = sum;
        this.product = product;
    }
}

public Result calculate(int a, int b) {
    int sum = a + b;
    int product = a * b;
    return new Result(sum, product);
}

パターン2 配列を使う方法

配列に複数の値を格納して返す。

public int[] calculate(int a, int b) {
    int[] results = new int[2];
    results[0] = a + b;
    results[1] = a * b;
    return results;
}
Q
Javaのメソッド定義時の修飾子は必須?
A

メソッドを定義する際、修飾子(例えば、publicprivateprotectedstaticなど)は必須ではありません。修飾子を省略すると、デフォルトのアクセス修飾子(パッケージプライベート)が適用されます。

修飾子を省略することは可能ですが、設計意図が明確でなくなる場合があります。そのため、適切な修飾子を付与することが可読性や保守性向上のために重要です。

メソッドの呼び出し

Javaのメソッドの呼び出し方には3つの種類があり、それぞれのケースで微妙に使い方が異なります。ここでは、それぞれのメソッド呼び出しの違いと具体例を詳しく解説します。

  1. クラス内からのメソッド呼び出し(同じクラス内のメソッド呼び出し)
  2. インスタンスメソッドの呼び出し
  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が呼ばれる
    }
}

解説:

  1. method1()
    • 「こんにちは!クラス内メソッドの呼び出しです。」と表示するシンプルなメソッドです。
  2. method2()
    • method1()をクラス内から直接呼び出しています。
    • **this.method1()**と書くこともできますが、暗黙的にthisが使われるため省略しています。
  3. mainメソッド
    • インスタンスを生成し、そのインスタンスからmethod2()を呼び出しています。
    • method2()内でmethod1()が呼ばれるため、プログラムの実行結果としてメッセージが表示されます。

2.インスタンスメソッドの呼び出し

ルール:

  • インスタンス(オブジェクト)を生成してから、インスタンスメソッドを呼び出します。
図1:インスタンス化

参考 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メソッドのシステム的な動作原理を詳しく解説します。

スタックフレームとメソッド呼び出し

定義したメソッドは呼び出しされると、メモリ上に作成されるスタックフレームと呼ばれる領域にメソッドの情報が保持されます。

  • スタック:メソッド呼び出しの履歴を管理するデータ構造です。
  • スタックフレーム:各メソッド呼び出しごとに作成され、ローカル変数や引数、戻り先の情報を保持します。

スタックフレームはレストランの注文票のようなもの。注文ごとに新しい注文票が作成され、料理が提供されるとその注文票は破棄されます。

動作の流れ

  1. メソッド呼び出し時:新しいスタックフレームがスタックに積まれる。
  2. メソッド実行中:スタックフレーム内でローカル変数や引数が管理される。
  3. メソッド終了時:スタックフレームがスタックから取り除かれ、制御が呼び出し元に戻る。

引数の受け渡し

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メソッドの定義と呼び出し

  • メソッドとは: 特定の動作を実行するコードのまとまり
  • メソッドの定義:
    • 修飾子、戻り値の型、メソッド名、引数リストを指定
  • メソッドの呼び出し: 基本的にはクラスのインスタンスを通じて行う(例外:クラスメソッド
  • 戻り値:
    • ある場合: 戻り値の型を指定し、return文で返す
    • ない場合: voidを使う
public class Calculator {

    // 戻り値があるメソッドの定義
    public int addNumbers(int a, int b) {
        return a + b;
    }

    // 戻り値がないメソッドの定義
    public void greet(String name) {
        System.out.println("Hello, " + name);
    }

    // 複数の戻り値を返すメソッドの定義
    public int[] calculate(int a, int b) {
        int[] results = new int[2];
        results[0] = a + b; // 合計
        results[1] = a * b; // 積
        return results;
    }

    public static void main(String[] args) {
        // Calculatorクラスのインスタンスを作成
        Calculator calc = new Calculator();

        // 戻り値があるメソッドの呼び出し
        int sum = calc.addNumbers(5, 3);
        System.out.println("Sum: " + sum);

        // 戻り値がないメソッドの呼び出し
        calc.greet("Alice");

        // 複数の戻り値を返すメソッドの呼び出し
        int[] results = calc.calculate(4, 2);
        System.out.println("Sum: " + results[0]);
        System.out.println("Product: " + results[1]);
    }
}

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
    }
}

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Java
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました