Java道|メソッドと引数の使い方

技に力を込めるように、メソッドにも値を渡せる。引数が分かると、処理はもっと自由に動かせる

ここまでで、メソッドはクラスの中に機能をまとめるためのしくみだと分かってきました。

たとえば、鬼殺隊士の情報を表示する、任務前に案内メッセージを出す、状態を確認する、といった処理をひとつのまとまりとして定義できました。

ただ、メソッドの便利さは「同じ処理をまとめる」だけではありません。

呼び出すときに値を渡して、その値に応じて動きを変えることもできます。
このしくみが引数です。

鬼滅の刃風にたとえるなら、隊士に「呼吸を使って」と命じるだけでなく、「名前を水月にして」「体力を100にして」というように、具体的な情報を渡して動かすイメージです。

メソッドが引数を受け取れるようになると、クラスの機能はぐっと柔軟になります。

この記事では、メソッドに値を渡す引数のしくみを、鬼殺隊士に情報を渡して設定する流れとして、やさしく整理していきます。具体的な例示プログラムは Sample4.java のみを使います。

引数はメソッドに値を渡すためのしくみ

メソッドを学び始めたばかりのころは、次のように何も受け取らないメソッドをよく見ます。

void show()
{
    System.out.println("隊士の名前は" + name + "です。");
    System.out.println("体力は" + stamina + "です。");
}

この show は、今そのオブジェクトの中に入っている name や stamina を表示するメソッドです。

これは大切な基本ですが、この形だけでは、呼び出す側から値を渡して、その値に応じて処理を変えることはできません。

そこで使うのが引数です。

引数があるメソッドは、呼び出し元から値を受け取れます。

たとえば、隊士の名前を設定する、体力を設定する、といった処理では、どんな名前にするのか、体力をいくつにするのかを外から渡したくなります。

そのときに引数が活躍します。

鬼滅の刃風で考える引数の感覚

鬼滅の刃風に考えると、引数は「技や命令に添えて渡す具体的な情報」です。

たとえば、隊士に向かって次のように伝える場面を想像してください。

指示渡す情報
名前を設定して水月
体力を設定して100
呼吸を設定して水の呼吸

このときの 水月 や 100 や 水の呼吸 のような具体的な情報が、メソッドに渡す値です。

そして、その値を受け取って処理するための入り口が引数です。

つまり引数は、

メソッドに外から情報を持ち込むための入り口

と考えると分かりやすいです。

↓クリックすると拡大表示されます。

引数つきのメソッドを定義する

実際に、引数を持つメソッドの形を見てみましょう。

たとえば、隊士の名前を設定する setName というメソッドを考えます。

void setName(String n)
{
    name = n;
    System.out.println("隊士の名前を" + name + "にしました。");
}

このメソッドの () の中にある String n が引数です。

意味としては、次のようになります。

部分意味
String文字列を受け取る
n受け取った値を入れる変数
name = n;受け取った値をフィールド name に代入する

つまり、このメソッドは外から文字列を1つ受け取り、その値を name に入れる処理をしています。

体力を設定するなら、次のような形になります。

void setStamina(int s)
{
    stamina = s;
    System.out.println("体力を" + stamina + "にしました。");
}

この int s は、int 型の値を受け取る引数です。

setStamina(100) のように呼び出すと、100 が s に入り、その値が stamina に代入されます。

引数は呼び出されたときに値が入る変数

引数で大事なのは、引数がメソッドの呼び出し時に値を受け取る変数だということです。

たとえば、次のメソッドを見てください。

void setStamina(int s)
{
    stamina = s;
    System.out.println("体力を" + stamina + "にしました。");
}

この s は、最初から値を持っているわけではありません。

次のようにメソッドを呼び出したときに、値が入ります。

mizuki.setStamina(100);

このとき、100 が s に渡されます。

そして、メソッドの中で次の処理が実行されます。

stamina = s;

その結果、フィールド stamina に 100 が入ります。

つまり引数は、

呼び出し元から届いた値を、一時的に受け取るための変数

です。

仮引数と実引数

引数の説明では、仮引数と実引数という言葉が出てきます。

最初は少し似ていて分かりにくいですが、役割ははっきり違います。

仮引数

仮引数は、メソッドの定義側に書かれている、値を受け取るための変数です。

void setStamina(int s)

この中の int s が仮引数です。

実引数

実引数は、メソッドを呼び出すときに実際に渡す値です。

mizuki.setStamina(100);

この中の 100 が実引数です。

用語意味
仮引数メソッド定義側で値を受け取る変数s
実引数呼び出し側から実際に渡す値100

鬼滅の刃風にたとえるなら、仮引数は「受け取るための器」、実引数は「実際に渡される中身」です。

実際のプログラムで確認する

ここでは、引数を持つメソッドを使ったプログラムを見ていきます。

ファイル名:Sample4.java

class DemonSlayer
{
    String name;
    int stamina;

    void setName(String n)
    {
        name = n;
        System.out.println("隊士の名前を" + name + "にしました。");
    }

    void setStamina(int s)
    {
        stamina = s;
        System.out.println("体力を" + stamina + "にしました。");
    }

    void show()
    {
        System.out.println("隊士の名前は" + name + "です。");
        System.out.println("体力は" + stamina + "です。");
    }
}

class Sample4
{
    public static void main(String[] args)
    {
        DemonSlayer mizuki = new DemonSlayer();

        mizuki.setName("水月");
        mizuki.setStamina(100);
    }
}

このプログラムでは、DemonSlayer クラスに3つのメソッドがあります。

メソッド引数役割
setNameString n隊士の名前を設定する
setStaminaint s体力を設定する
showなし隊士の情報を表示する

setName と setStamina は引数を持つメソッドです。
show は引数を持たないメソッドです。

setName の動きを見る

setName メソッドを見てみます。

void setName(String n)
{
    name = n;
    System.out.println("隊士の名前を" + name + "にしました。");
}

このメソッドは、String 型の値を1つ受け取ります。

main メソッドでは、次のように呼び出しています。

mizuki.setName("水月");

このときの流れは、次のようになります。

順番内容
1実引数 水月 が渡される
2仮引数 n に 水月 が入る
3name = n; が実行される
4フィールド name に 水月 が入る
5隊士の名前を水月にしました。 と表示される

つまり、呼び出し側で渡した 水月 が、メソッド側の n に入り、その値がフィールド name に代入されます。

setStamina の動きを見る

次に setStamina メソッドを見ます。

void setStamina(int s)
{
    stamina = s;
    System.out.println("体力を" + stamina + "にしました。");
}

このメソッドは、int 型の値を1つ受け取ります。

main メソッドでは、次のように呼び出しています。

mizuki.setStamina(100);

このときの流れは、次のようになります。

順番内容
1実引数 100 が渡される
2仮引数 s に 100 が入る
3stamina = s; が実行される
4フィールド stamina に 100 が入る
5体力を100にしました。 と表示される

setName と setStamina は、受け取る値の型は違いますが、考え方は同じです。

外から値を受け取り、その値をフィールドに設定しています。

実行結果から確認する

Sample4.java を実行すると、次のように表示されます。

隊士の名前を水月にしました。
体力を100にしました。

この結果を見ると、呼び出し時に渡した値が、きちんとメソッドの中で使われていることが分かります。

ここで大切なのは、メソッドが固定された処理しかできないわけではないということです。

渡された値に応じて、処理の内容を変えられます。

たとえば、別の隊士を作るなら、同じメソッドでも次のように違う値を渡せます。

raito.setName("雷斗");
raito.setStamina(85);

setName や setStamina というメソッドは同じでも、渡す値が変われば、設定される内容も変わります。

引数があると同じメソッドをいろいろな値で使える

引数なしのメソッドは、基本的に決まった形で動きます。

一方で、引数ありのメソッドは、呼び出すたびに違う値を受け取れます。

メソッドの種類特徴
引数なしのメソッド毎回ほぼ同じ形で動く
引数ありのメソッド渡された値に応じて動きを変えられる

鬼滅の刃風に言えば、

show は「今の自分の状態を表示する技」
setStamina は「受け取った値で体力を設定する技」

という違いがあります。

引数があることで、メソッドはもっと実用的になります。

たとえば setStamina は1つだけでも、渡す値によって次のように使えます。

呼び出し結果
mizuki.setStamina(100);水月の体力を100にする
raito.setStamina(85);雷斗の体力を85にする
kazega.setStamina(70);風牙の体力を70にする

同じメソッドを使い回せるので、コードも整理しやすくなります。

図:実引数が仮引数に渡される流れ

↓クリックすると拡大表示されます。

この図が示していること

この図は、呼び出し側で渡した値が、メソッド側の仮引数に入る流れを示しています。

mizuki.setStamina(100); の 100 が実引数です。
void setStamina(int s) の s が仮引数です。

呼び出し時に 100 が s に渡され、そのあと stamina = s; によって、オブジェクトの stamina フィールドに 100 が設定されます。

この図から分かることは、引数は「呼び出し側の値をメソッドの中へ持ち込むための橋渡し」だということです。

型が合っていることも大切

引数では、渡す値の型が合っていることも大切です。

たとえば setStamina は、次のように定義されています。

void setStamina(int s)

つまり、このメソッドには int 型の値を渡す必要があります。

mizuki.setStamina(100);

100 は int 型の値なので渡せます。

しかし、文字列を渡すことはできません。

mizuki.setStamina("百");

これは、setStamina が int 型を受け取るメソッドだからです。

同じように setName は、次のように定義されています。

void setName(String n)

このメソッドには String 型の値を渡します。

mizuki.setName("水月");

表で整理すると、次のようになります。

メソッド仮引数の型渡す値の例
setNameString水月
setStaminaint100

引数は便利ですが、どんな型の値を受け取るのかは、メソッド定義で決まっています。

引数ありメソッドと引数なしメソッドの違い

Sample4.java には、引数ありのメソッドと引数なしのメソッドが両方あります。

引数あり

void setName(String n)
void setStamina(int s)

引数なし

void show()

呼び出すときの形も違います。

引数ありの呼び出し

mizuki.setName("水月");
mizuki.setStamina(100);

引数なしの呼び出し

mizuki.show();

引数ありのメソッドでは、() の中に値を書きます。

引数なしのメソッドでは、() の中は空です。

種類定義呼び出し
引数ありvoid setName(String n)mizuki.setName("水月");
引数ありvoid setStamina(int s)mizuki.setStamina(100);
引数なしvoid show()mizuki.show();

この違いが見えるようになると、コードを読むときに「このメソッドは外から値を受け取るのか」が分かりやすくなります。

show メソッドがある意味

Sample4.java では、main メソッドの中で show は呼び出していません。

しかし、DemonSlayer クラスの中には show が定義されています。

void show()
{
    System.out.println("隊士の名前は" + name + "です。");
    System.out.println("体力は" + stamina + "です。");
}

このメソッドは、すでにオブジェクトの中に入っている name と stamina を表示するためのものです。

役割としては、次のようになります。

メソッド役割
setName名前を設定する
setStamina体力を設定する
show設定された値を表示する

このように、クラスの中には複数の役割を持つメソッドを用意できます。

値を設定するメソッド
値を表示するメソッド
状態を確認するメソッド

というように役割を分けることで、クラスの使い方が分かりやすくなります。

図:setName と setStamina の役割

この図が示していること

この図は、引数を使ってオブジェクトの状態を設定する流れを示しています。

mizuki.setName("水月"); では、水月 という値が setName の仮引数 n に渡され、name フィールドに設定されます。

mizuki.setStamina(100); では、100 という値が setStamina の仮引数 s に渡され、stamina フィールドに設定されます。

この図から分かることは、引数を使うと、呼び出し側から渡した値によって、オブジェクトの中の状態を変えられるということです。

引数を使うとメソッドはもっと便利になる

引数が使えるようになると、メソッドはただ決まった処理をするだけではなくなります。

そのときどきに必要な値を受け取りながら、同じしくみを何度も再利用できます。

たとえば setStamina というメソッドは1つだけでも、渡す値によっていろいろな場面で使えます。

mizuki.setStamina(100);
raito.setStamina(85);
kazega.setStamina(70);

このように、同じメソッドでも渡す値が違えば、設定される内容も変わります。

鬼滅の刃風に言えば、同じ「体力を設定する技」でも、隊士ごとに違う数値を込められるようなものです。

引数によって、メソッドは固定された動きではなく、外からの情報に応じて動ける機能になります。

いちばん大事な感覚

メソッドと引数の使い方で大切なのは、次の感覚です。

ポイント内容
引数呼び出し元からメソッドへ値を渡すしくみ
仮引数メソッド定義側で値を受け取る変数
実引数呼び出し側で実際に渡す値
渡す値は仮引数の型に合わせる
便利さ同じメソッドを違う値で使い回せる

鬼滅の刃風に言いかえるなら、隊士にただ「動け」と命じるだけでなく、名前や体力のような具体的な情報を渡して動かせるようになる、ということです。

mizuki.setName("水月"); と呼び出せば、水月 という値がメソッドに渡ります。
mizuki.setStamina(100); と呼び出せば、100 という値がメソッドに渡ります。

その値を受け取ったメソッドが、オブジェクトの状態を変えていきます。

この感覚がつかめると、メソッドは単なる処理のまとまりではなく、外から情報を受け取りながら働く機能として見えてきます。