Java入門|メソッドに値を渡す引数のしくみ

技にパワーを込めるように、メソッドにも値を渡せる。引数がわかると処理はもっと自由になる

「メソッドに値を渡す引数のしくみ」の序章
ここまでで、メソッドはクラスの中に機能をまとめるためのしくみだとわかってきました。たとえば、戦士の情報を表示する、案内メッセージを出す、といった処理をひとつのまとまりとして定義できましたね。

でも、メソッドの便利さはそれだけではありません。毎回まったく同じ処理だけをするのではなく、呼び出すたびに違う値を渡して、その値に応じて動きを変えることもできます。これが引数の考え方です。

ドラゴンボールでたとえるなら、戦士に「技を出して」とだけ命令するのではなく、「戦闘力を9000に設定して」「技名をかめはめ波にして」というように、具体的な情報を渡して動かすイメージです。メソッドが引数を受け取れるようになると、クラスの機能はぐっと柔軟になります。ここでは、この引数のしくみをドラゴンボールの世界に置きかえながら、やさしく丁寧に整理していきます。

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

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

void show()
{
    System.out.println("戦士の名前は" + name + "です。");
    System.out.println("戦闘力は" + power + "です。");
}

この show は、今そのオブジェクトの中に入っている name や power を表示するだけのメソッドです。
とても大切な基本ですが、これだけだと「外から値を渡して、その値に応じた処理をする」ことはできません。

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

引数があるメソッドは、呼び出し元から値を受け取れます。
たとえば、戦士の名前を設定する、戦闘力を設定する、といった処理を考えると、どんな値を設定するのかを外から渡したくなりますよね。そんなときに引数が活躍します。

ドラゴンボールで考える引数の感覚

ドラゴンボールで考えると、引数は「技を発動するときに一緒に渡す指示」だと思うとわかりやすいです。

たとえば悟空に向かって、

  • 名前を悟空にして
  • 戦闘力を9000にして
  • 必殺技をかめはめ波にして

と伝える場面を想像してみてください。

このときの「悟空」「9000」「かめはめ波」のような具体的な情報が、メソッドに渡す値です。
そして、それを受け取って処理するのが引数です。

つまり引数は、
メソッドに外から情報を持ち込むための入り口
だと考えると、とても理解しやすくなります。

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

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

たとえば、戦士の名前を設定する setName というメソッドを考えると、こんな形になります。

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

このメソッドの () の中にある String n が引数です。
ここでの n は、メソッドの中だけで使える変数です。

意味としては、

  • String 型の値を1つ受け取る
  • 受け取った値を n に入れる
  • その n を使って処理する

という流れです。

戦闘力を設定するなら、こんな形も考えられます。

void setPower(int p)
{
    power = p;
    System.out.println("戦闘力を" + power + "にしました。");
}

このように、引数を使うとメソッドの中に値を持ち込めるようになります。

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

引数の感覚で大事なのは、引数がただの飾りではなく、メソッドが呼び出された瞬間に値が入る変数だということです。

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

void setPower(int p)
{
    power = p;
    System.out.println("戦闘力を" + power + "にしました。");
}

この p は、メソッドの呼び出しより前から値を持っているわけではありません。
呼び出し元が値を渡したときに、はじめてその値が p に入ります。

たとえば、

goku.setPower(9000);

と書いたとすると、9000 という値が p に渡されます。
そして、メソッドの中で power = p; が実行されることで、フィールド power に 9000 が入ります。

つまり、引数は
呼び出し元から届いた値を、一時的に受け取るための変数
ということです。

仮引数と実引数をわかりやすく整理する

引数の説明では、仮引数と実引数という2つの言葉が出てきます。ここは最初に少し整理しておくと安心です。

仮引数

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

void setPower(int p)

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

実引数

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

goku.setPower(9000);

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

表で整理するとこうなります。

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

この2つの関係は、
受け取る箱が仮引数、実際に入れる中身が実引数
と考えるとわかりやすいです。

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

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

ファイル名:Sample4.java

class Saiyan
{
    String name;
    int power;

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

    void setPower(int p)
    {
        power = p;
        System.out.println("戦闘力を" + power + "にしました。");
    }

    void show()
    {
        System.out.println("戦士の名前は" + name + "です。");
        System.out.println("戦闘力は" + power + "です。");
    }
}

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

        goku.setName("悟空");
        goku.setPower(9000);
    }
}

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

  • setName
  • setPower
  • show

このうち、setName と setPower が引数を持つメソッドです。
show は引数を持たないメソッドです。

setName と setPower の動きを見る

まず setName を見てみましょう。

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

ここでは、呼び出し元から受け取った文字列が n に入ります。
そのあと name = n; によって、フィールド name にその値が代入されます。

つまり、

goku.setName("悟空");

と呼び出すと、

  • 実引数は "悟空"
  • 仮引数は n
  • n に "悟空" が入る
  • その値が name に代入される

という流れです。

setPower も同じ考え方です。

void setPower(int p)
{
    power = p;
    System.out.println("戦闘力を" + power + "にしました。");
}

これを

goku.setPower(9000);

と呼び出すと、

  • 実引数は 9000
  • 仮引数は p
  • p に 9000 が入る
  • その値が power に代入される

という流れになります。

実行結果から見ると理解しやすい

この Sample4.java を実行すると、次のような表示になります。

戦士の名前を悟空にしました。
戦闘力を9000にしました。

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

ここで大事なのは、メソッドが固定された処理しかできないわけではなく、渡された値に応じて内容を変えて動けるということです。

もし別の戦士を作るなら、

vegeta.setName("ベジータ");
vegeta.setPower(8500);

のようにすれば、同じメソッドでも違う値で処理できます。

これが引数の大きな便利さです。

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

引数なしのメソッドは、基本的に同じ形の処理をします。
でも引数があるメソッドは、呼び出すたびに違う値を受け取れるので、同じメソッドをより柔軟に使えます。

表にするとこんな違いがあります。

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

ドラゴンボールでいえば、

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

という違いがあります。

つまり引数は、メソッドをもっと実用的にしてくれるしくみです。

仮引数と実引数の対応を図式で考える

たとえば次の呼び出しを考えます。

goku.setPower(9000);

このときの対応関係は、次のようになります。

呼び出し側メソッド側
9000p

つまり、呼び出し側の 9000 が、メソッド定義側の p に渡されます。

同じように、

goku.setName("悟空");

なら、

呼び出し側メソッド側
"悟空"n

となります。

このように、「呼び出し側の値」が「メソッド側の引数変数」に渡るのが、引数の基本です。

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

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

たとえば setPower はこう定義されています。

void setPower(int p)

ということは、ここには int 型の値を渡す必要があります。
だから 9000 は大丈夫ですが、文字列をそのまま渡すことはできません。

同じように setName はこうです。

void setName(String n)

だから、ここには文字列を渡します。

この点を表で整理するとこうなります。

メソッド仮引数の型渡す値の例
setNameString"悟空"
setPowerint9000

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

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

Sample4.java の中には、引数ありのメソッドと引数なしのメソッドが両方出てきます。これを見比べると理解が深まります。

引数あり

void setName(String n)
void setPower(int p)

引数なし

void show()

この違いは、呼び出すときにも表れます。

引数ありの呼び出し

goku.setName("悟空");
goku.setPower(9000);

引数なしの呼び出し

goku.show();

このように、引数ありのメソッドでは () の中に値を書きます。
引数なしのメソッドでは () の中は空です。

この形の違いを見分けられるようになると、コードがかなり読みやすくなります。

show メソッドがある意味

このサンプルでは main メソッドの中で show は呼び出していませんが、Saiyan クラスの中には show が定義されています。

void show()
{
    System.out.println("戦士の名前は" + name + "です。");
    System.out.println("戦闘力は" + power + "です。");
}

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

  • setName や setPower は値を設定するためのメソッド
  • show は設定された値を確認するためのメソッド

という役割分担になっています。

こうして見ると、クラスの中にはいろいろな種類のメソッドを持たせられることも見えてきます。

この図では、左側が呼び出し側です。ここで "悟空" や 9000 といった具体的な値をメソッドへ渡しています。
中央の Saiyan クラスの中には、setName(String n) と setPower(int p) があり、それぞれの n と p が仮引数です。

左から渡された実引数が、中央の仮引数に入っていき、その結果として右側で name = "悟空"、power = 9000 という状態ができあがります。
この流れを見ると、呼び出し側の値と、メソッド側の引数変数がどう結びつくのかがひと目でわかります。

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

引数が使えるようになると、メソッドはただ決まったことをするだけの機能ではなくなります。
そのときどきに必要な値を受け取りながら、同じ仕組みを何度も再利用できるようになります。

たとえば setPower というメソッドは1つだけでも、

  • 9000 を渡せば悟空向けの設定
  • 8500 を渡せばベジータ向けの設定
  • 7000 を渡せば別の戦士向けの設定

というふうに、同じメソッドをいろいろな場面で使えます。

これはオブジェクト指向の考え方とも相性がよくて、クラスの機能を部品としてきれいに整理しやすくなります。

いちばん大事な感覚

「メソッドに値を渡す引数のしくみ」で大事なのは、次の感覚です。

  • 引数は、呼び出し元からメソッドへ値を渡すためのしくみ
  • メソッド定義側で受け取る変数が仮引数
  • 呼び出し側で渡す実際の値が実引数
  • メソッドは、渡された値に応じて処理できる
  • 引数があることで、同じメソッドをもっと柔軟に使える

ドラゴンボールで言いかえるなら、

  • 戦士にただ技を使わせるだけでなく
  • 名前や戦闘力という具体的な情報を渡して動かせる
  • その値に応じて結果が変わる

ということです。

この感覚がつかめると、メソッドは単なる処理のまとまりではなく、外から情報を受け取りながら働く機能として見えるようになります。ここまで理解できると、この先に出てくる戻り値やさらに複雑なメソッドの使い方も、かなり自然に受け止められるようになります。