Java
2022.02.08
【Java初心者向け】メソッドの使い方まとめ!呼び出しや引数・戻り値をわかりやすく解説
2023.11.15

Javaのプログラミング学習をするうえで、「メソッドの使い方がわからない」と悩んでいる方も多いのではないでしょうか。


「メソッドの呼び出しはどうやって書くのだろうか?」


「引数の値渡しと参照渡しの違いは?」


といった疑問に対して、本記事ではJavaのメソッドの使い方を、サンプルを交えて解説していきます。


※本記事で紹介するサンプルコードは、macOS Montere、OpenJDK-11.0.13で動作確認しています。


1.Javaのメソッドとは?

メソッドとは、内容がまとまっている処理や反復する処理など、プログラムの処理をひとつにまとめたものです。

①メソッドを使うメリット

メソッドを使うメリットは、以下の通りです。


・コードがスリム化されるので可読性が高くなる

・変更が容易にできるので保守性が高くなる

・処理を再利用できるので生産性が高くなる

2.メソッドの基本構成


メソッドの基本構成を紹介します。

アクセス修飾子 戻り値の型 メソッド名 (引数1,引数2, …){
    処理
}

それぞれの用語は、以下の意味を持っています。

①アクセス修飾子

アクセス修飾子とは、他クラスへの公開範囲を決める予約語で、public、private、protectedがあります。

publicどのクラスからでもアクセスが可能
privateクラス内部からのみアクセスが可能で、他のクラスからはアクセス不可
protected継承したクラス、または同一パッケージ内のクラスからアクセス可能

②戻り値の型

戻り値とは、メソッド内の処理後、呼び出し元に返す値のことです。メソッドの定義時には、戻り値のデータ型を記述します。


例えばintやcharなどの基本データ型やStringなどのクラス名を記述します。

③メソッド名

メソッドの名前です。命名規則や一般的なルールについてはのちほど解説します。

④引数

メソッドに対して呼び出し元から渡すパラメーター情報を引数と呼びます。

「この値を使ってメソッド内で処理したい」といった場合に、値を引数としてメソッドに渡します。



3.メソッドの基本的な書き方


メソッドの基本的な書き方について、サンプルコードと共に解説していきます。

①メソッドの定義

メソッドの定義は、具体的には以下のように記載します。

public static int sample(int num){
    num++;
    return num;
}

②メソッドの呼び出し

メソッドを定義すると、プログラムからメソッドを呼び出せます。

メソッドの種類によって呼び出し方は異なり、また戻り値を返すかどうかでも違います。

次の例は、戻り値を返すメソッドです。

戻り値を格納する型 変数名 = メソッド名(引数1,引数2,…)

戻り値を返さないメソッドは、以下のように記述します。

メソッド名 (引数1,引数2, …)

具体的には次のように記述します。

public class App {
    public static void main(String[] args) {
        int num = sample(10);
        System.out.println(num);
    }
    public static int sample(int num){
        num++;
        return num;
    }
}

③引数を使ってメソッドに値を渡す

引数を使ってメソッドに値を渡すには、メソッド名の後の()内に値を指定します。

以下のサンプルコードで、引数を使ってメソッドに値を渡す方法を確認しましょう。

public class App {
    public static void main(String[] args) {
  // 引数として6と5を渡す
        areaOfTriangles(6,5);
    }

    public static void areaOfTriangles(int base, int height){
        //三角形の面積(底辺×高さ÷2)
        System.out.println(base*height/2);
    }
}

実行結果:

15

このサンプルコードは、6と5をメソッドの引数に指定し、メソッド内で三角形の面積を計算した結果を表示する処理です。

④メソッドの戻り値の使い方

メソッドの戻り値を使うと、呼び出し元でメソッドの処理結果を使えます。

以下は戻り値の使い方のサンプルコードです。呼び出し元に戻り値を返すには「return」を使います。

public class App {
    public static void main(String[] args) {
        int answer = areaOfTriangles(6,5);
        System.out.println(answer);
    }

    public static int areaOfTriangles(int base, int height){
        //三角形の面積(底辺×高さ÷2)
        return base*height/2;
    }
}

実行結果:

15

このプログラムは、メソッド内で処理した結果をreturnを使ってメソッド呼び出し元に戻し、表示しています。



4.メソッド処理の流れ


メソッドが処理されたときに、どのような流れで処理が実行されるのか解説します。

メソッドと呼び出し側の関係は以下になります。図を見ながら処理の流れを追っていきましょう。

メソッド処理の流れ

①2つの値を引数として、メソッドに渡す


②引数の値でメソッドの処理を行う

 ここでは変数a×変数b÷2で三角形の面積を計算し、戻り値として設定する


③return文の結果を呼び出し元に戻り値として返す


④変数areaにメソッドの戻り値を代入する



5.メソッドの応用的な書き方

ここではメソッドチェーンやstaticメソッドなど、メソッドの応用的な書き方を紹介します。

①メソッドチェーン

メソッドチェーンとは、”.”を使いメソッドをつなげて呼び出す方法のこと。処理の流れや順番が明確になり、コードが読みやすくなることから、多くのプログラマーが実務で使っています。


メソッドチェーンのサンプルコードを見てみましょう。

public class App {
    public static void main(String[] args) {
        Body bd = new Body();
        bd.setHeight(173.8).setWeight(64.9).print();
    }
}

class Body{
    private double height;
    private double weight;

    public Body setHeight(double b){
        this.height = b;
        return this;
    }
    public Body setWeight(double c){
        this.weight = c;
        return this;
    }
    public void print(){
        System.out.println(" 身長: " + height + " 体重:" + weight);
    }
}

実行結果:

身長: 173.8 体重:64.9

このサンプルコードでは、setHeight、setWeight、printメソッドを連結して呼び出しています。コードがシンプルになり、読みやすくなりましたね。

②staticメソッド

メソッドの前にstatic修飾子を付けると、staticメソッドになります。

staticメソッドは、クラスのインスタンス化なしに直接呼び出して使用できます。


staticメソッドを使用するメリットは以下の通りです。


・インスタンス化せずに利用できる

・状態に依存しないことが保証される

・インスタンスごとに動作が変わらないことが保証される

staticメソッドの使い方を紹介します。

public class App {
    private int instanceCounter = 0;
    private static int staticCounter = 0;
    public static void main(String[] args) {
        App ap1 = new App();
        ap1.instance_method();
        //1回目の実行
        static_method();

        App ap2 = new App();
        ap2.instance_method();
        //2回目の実行
        static_method();
    }
    public void instance_method(){
        System.out.println("インスタンスメソッドカウント; " + instanceCounter);
        instanceCounter++;
    }
    public static void static_method(){
        System.out.println("スタティックメソッドカウント; " + staticCounter);
        staticCounter++;
    }
}

実行結果:

インスタンスメソッドカウント; 0
スタティックメソッドカウント; 0
インスタンスメソッドカウント; 0
スタティックメソッドカウント; 1

ap1.instance_method内で”instanceCounter”を加算したのちに、ap2.instance_method内でも加算しています。ap1とap2は別のメモリ空間で実行されるので、”instanceCounter”は加算されずに0のままです。


次にstaticメソッドの処理ですが、1回目のstatic_methodで加算したのち、2回目のstatic_methodで加算すると、同じメモリ空間で実行されるので、”staticCounter”の値は保持されます。よって、2回目のstatic_method呼び出し時には、加算された”1”が表示されます。

③メソッド参照

メソッド参照はJava8で導入された構文で、すでに定義済みのメソッドを引数なしで呼び出せます。


メリットとしては、ラムダ式を書かずにメソッドを実行できる点です。

(ラムダ式については本記事では触れませんので、詳しく知りたい方は調べてみてください。)


メソッド参照は、以下の構文で書きます。

クラス名::メソッド名

具体的なサンプルコードを紹介します。

import java.util.function.Function;

public class App {
    public static void main(String[] args) {
        Human hm1 = new Human();
        //メソッド参照
        Function<String,String> human = hm1::getName;
        //applyメソッドで引数を渡して戻り値を取得後、表示
        System.out.println(human.apply("Mike"));
    }
}

class Human{
    public String getName(String name){
        return "My name is " + name;
    }
}

実行結果:

My name is Mike


6.メソッドを使う上で気をつけるべきポイント


メソッドを使う上で気をつけるべきポイントが2点あります。

①引数の値渡しと参照渡し

値渡しと参照渡しの違いは、引数として渡した変数の状態が変化する点です。


値渡しは、呼び出したメソッド内で引数の値が変わっても呼び出し元は変化しません。参照渡しは、呼び出したメソッド内で引数の値が変わると、呼び出し元も変わります。


値渡し・参照渡しどちらで引数を渡しているかをしっかりと把握していないと、思うような実行結果にならない場合があるので注意が必要です。


以下で詳しく説明します。

値渡し

値渡しは、値(プリミティブ)型の中身をコピーして渡します。


値(プリミティブ)型は、以下の8つです。


・boolean

・byte

・char

・short

・int

・float

・long

・double

実際にサンプルコードで確認しましょう。

public class App {
    public static void main(String[] args) {
        int cnt = 10;
        callByValue(cnt);
        System.out.println(cnt); //②値渡しのため、cntは10のまま
    }

    public static void callByValue(int cnt){
        cnt += 5;
        System.out.println(cnt); //①10+5=15 が表示される
    }
}

実行結果

15
10

値渡しは、呼び出したメソッド内で値を変更しても、呼び出し元には影響しないことがわかります。

参照渡し

一方、参照渡しでは引数のアドレスを渡します。


値渡しは引数の型を値(プリミティブ)型にする必要がありますが、参照渡しはアドレスを渡すので、クラス型や配列などを指定できます。


これもサンプルコードで確認してみましょう。

public class App {
    public static void main(String[] args) {
        int[] yen = {10,100,1000};
        callByReference(yen);

        //②参照渡しのため、メソッド内で計算された値が表示される
        System.out.println("yen配列:" + yen[0] + "," + yen[1] + "," + yen[2]); 
    }

    public static void callByReference(int[] tax){
        for (int i = 0; i < tax.length; i++){
            tax[i] *= 1.1;  //配列要素にそれぞれ1.1倍する
        }

        //①それぞれ1.1倍された値が表示される
        System.out.println("tax配列:" + tax[0] + "," + tax[1] + "," + tax[2]); 
    }
}

実行結果:

tax配列:11,110,1100
yen配列:11,110,1100

このように、参照渡しは呼び出したメソッド内で値を変更すると、呼び出し元に影響します。

②メソッド名の命名

プログラムでは、メソッド名をわかりやすく命名することが重要です。Javaは、言語仕様を守っていれば自由にソースコードを記述できます。


しかしメソッド名を適当に記述すると、あとで修正するときや調査するときに、ソースコードの理解に時間が掛かり作業効率が低下します。


また、メソッド名には日本語も使えますが、IDEの補完機能が使いにくい、異なるOS間での管理が複雑になる、などのデメリットがあるのでおすすめしません。

Javaのメソッドにおける基本的な命名規則

基本的には英数字を使用し、以下の命名規則に則ってメソッド名をつけるようにしましょう。


・1文字目は小文字

・単語区切りは大文字、それ以外は小文字

真偽値を返すメソッドの命名規則

真偽値を返すメソッドの場合は、以下のような命名規則を使用します。


・is + 形容詞

・has + 過去分詞

・can + 動詞

フィールド変数の値を受け取る・設定するメソッドの命名規則

フィールド変数の値を受け取る・設定するメソッドの場合は、以下のような命名規則を使用しましょう。


・受け取るメソッドの先頭はget

・設定するメソッドの先頭はset





この記事をシェア