Javaプログラミング入門

11. メソッド

最終更新:

javatutorial

- view
管理者のみ編集可
サンプル:MethodExample.java
  1. public class MethodExample {
  2. public static void main(String[] args) {
  3. System.out.println("おはようございます!");
  4. System.out.println("今日も一日頑張りましょう!");
  5. System.out.println("おはようございます!");
  6. System.out.println("今日も一日頑張りましょう!");
  7. System.out.println("おはようございます!");
  8. System.out.println("今日も一日頑張りましょう!");
  9. }
  10. }

上記のプログラムでは、同じ挨拶を3回繰り返しています。
今は6行だけですが、これが100回、1000回と増えると、コードが長くなってしまい、修正も大変になります。
また、挨拶の内容を変更したい場合、すべての箇所を手作業で修正する必要があり、修正漏れのリスクも高まります。
この問題を解決する方法の一つがメソッドです。
メソッドを使えば、同じ処理をまとめて管理できるため、コードがスッキリし、修正作業も簡単になります。

メソッドとは


メソッドとは、いくつかの処理をひとまとめにして、名前を付けたものです。
身近な例で説明すると、メソッドは「料理のレシピ」のようなものです。

例えば、「カレーを作る」というレシピには以下のような手順があります:
1. 野菜を切る
2. 肉を炒める
3. 水を入れて煮込む
4. カレールーを入れる

この一連の手順をまとめて「カレーを作る」という名前を付けたのがレシピです。
プログラムでも同様に、複数の処理をまとめて名前を付けたものがメソッドなのです。

メソッドを使うことで、以下のようなメリットがあります

同じ処理を何度でも使える(再利用性)
一度メソッドを作れば、何度でも呼び出すことができます。
同じコードを何度も書く必要がなくなります。

プログラムが読みやすくなる(可読性)
処理に名前を付けることで、何をしているのかが分かりやすくなります。
「挨拶をする」「計算をする」など、処理の意味が明確になります。

修正が簡単になる(保守性)
処理を変更したい場合、メソッドの中身を1箇所修正するだけで済みます。
同じ処理を使っているすべての場所に自動的に反映されます。

メソッドの基本構造


Javaでメソッドを作るときは、以下のような形で記述します

修飾子 戻り値の型 メソッド名() {
    // ここに実行したい処理を書く
} 
それぞれの部分について詳しく説明していきます。
修飾子
メソッドの性質を決める部分です。
今のところはpublic staticと書くことを覚えておいてください。
これについては後の章で詳しく説明します。

戻り値の型
メソッドが処理の結果として返す値の種類を指定します。
値を返さない場合はvoidと書きます。
今のところはvoidと書くことを覚えておいてください。
これについては後の章で詳しく説明します。

メソッド名
そのメソッドを識別するための名前です。
変数名と同じように、意味が分かりやすい名前を付けましょう。

メソッドを作ってみよう

それでは、実際にメソッドを作ってみましょう。
先ほどの挨拶を表示する処理をメソッドにしてみます。

サンプル:MethodExample.java
  1. public class MethodExample {
  2. public static void main(String[] args) {
  3. // メソッドを呼び出す
  4. }
  5.  
  6. // 挨拶を表示するメソッド
  7. public static void greetings() {
  8. System.out.println("おはようございます!");
  9. System.out.println("今日も一日頑張りましょう!");
  10. }
  11. }

メソッドの呼び出し方

メソッドの呼び出し方は以下の通りです
メソッド名(); 

重要なポイントは、メソッド名の後に丸括弧()を付けることです。
この丸括弧は「このメソッドを実行してください」という合図になります。
また、文の最後にはセミコロン(;)を忘れずに付けましょう。

それでは、メソッドを実際に作成して呼び出してみましょう。
以下のプログラムでは、挨拶を表示するgreetingsというメソッドを作成し、それを呼び出しています。

サンプル:MethodExample.java
  1. public class MethodExample {
  2. public static void main(String[] args) {
  3. System.out.println("メソッドを呼び出す前");
  4. greetings(); // greetingsメソッドを呼び出し
  5. System.out.println("メソッドを呼び出した後");
  6. }
  7.  
  8. // 挨拶を表示するメソッド
  9. public static void greetings() {
  10. System.out.println("おはようございます!");
  11. System.out.println("今日も一日頑張りましょう!");
  12. }
  13. }
実行結果
メソッドを呼び出す前
おはようございます!
今日も一日頑張りましょう!
メソッドを呼び出した後 

メソッドの実行順序

プログラムは必ずmainメソッドから実行が開始されます。
mainメソッドより上に他のメソッドが定義されていても、プログラムは必ずmainメソッドから動き始めます

メソッドが呼び出されると、プログラムの実行はそのメソッドに移り、メソッドの処理が終わると、呼び出した場所に戻ってきます

先ほどのプログラムの実行順序を詳しく見てみましょう
1. mainメソッドが開始される
2. 【メソッドを呼び出す前】という文字列が表示される
3. 4行目:greetings()が呼び出される
 → greetingsメソッドの処理(1011行目)が実行される
 → greetingsメソッドが終了し、mainメソッドに戻る
4. 【メソッドを呼び出した後 】という文字列が表示される
3. mainメソッドが終了し、プログラム全体が終了する 

引数を使ってメソッドに値を渡そう

これまでのメソッドは、いつも同じ処理しかできませんでした。
しかし、メソッドに引数を渡すことで、より柔軟な処理ができるようになります。

引数とは、メソッドに渡す値のことです。
料理のレシピで例えると、「材料」にあたります。
「カレーを作る」レシピでも、「何人分作るか」という情報があれば、材料の量を調整できますよね。

引数を使うメソッドは以下のように書きます
public static void メソッド名(データ型 引数名) {
    // 引数を使った処理
} 

実際に引数を使ったメソッドを作ってみましょう。

サンプル:MethodWithParameter.java
public class MethodWithParameter {
    public static void main(String[] args) {
        // 引数を渡してメソッドを呼び出す
        greet("田中さん");
        greet("佐藤さん");
        greet("鈴木さん");
    }
 
    // 名前を受け取って挨拶するメソッド
    public static void greet(String name) {
        System.out.println(name + "、おはようございます!");
        System.out.println("今日も一日よろしくお願いします!");
    }
}
 
実行結果
田中さん、おはようございます!
今日も一日よろしくお願いします!
佐藤さん、おはようございます!
今日も一日よろしくお願いします!
鈴木さん、おはようございます!
今日も一日よろしくお願いします! 
このプログラムでは、greetメソッドがString型の引数【name】を受け取っています。
メソッドを呼び出すときにgreet("田中さん")のように値を渡すと
その値がnameという変数に格納され、メソッドの中で使用できます。

引数を渡すときに使う値を実引数、メソッドで受け取る変数を仮引数と呼びます。

メソッドには複数の引数を渡すこともできます。
複数の引数を使う場合は、カンマ(,)で区切って記述します。

サンプル:MultipleParameters.java
  1. public class MultipleParameters {
  2. public static void main(String[] args) {
  3. // 複数の引数を渡してメソッドを呼び出す
  4. introduce("田中太郎", 25, "東京都");
  5. introduce("佐藤花子", 30, "大阪府");
  6. }
  7.  
  8. // 名前、年齢、出身地を受け取って自己紹介するメソッド
  9. public static void introduce(String name, int age, String hometown) {
  10. System.out.println("はじめまして、" + name + "です。");
  11. System.out.println("年齢は" + age + "歳で、" + hometown + "出身です。");
  12. System.out.println("よろしくお願いします!");
  13. System.out.println(); // 空行を入れる
  14. }
  15. }
実行結果
はじめまして、田中太郎です。
年齢は25歳で、東京都出身です。
よろしくお願いします!
 
はじめまして、佐藤花子です。
年齢は30歳で、大阪府出身です。
よろしくお願いします!
 

複数の引数を使うときは、引数の順番と型が重要です。
メソッドを呼び出すときに渡す値の順番と型は、メソッドの定義と一致している必要があります。

戻り値を使ってメソッドから値を返そう


これまでのメソッドは、処理を実行するだけでした。
しかし、メソッドは処理の結果を戻り値として呼び出し元に返すことができます。

戻り値とは、メソッドが処理した結果として返す値のことです。
料理のレシピで例えると、「完成した料理」にあたります。

戻り値を返すメソッドは以下のように書きます
public static 戻り値の型 メソッド名() {
    // 処理
    return 戻り値;
} 
戻り値を返すときはreturn文を使います。
return文が実行されると、その値が呼び出し元に返され、メソッドの実行が終了します。

実際に戻り値を使ったメソッドを作ってみましょう。
サンプル:MethodWithReturn.java
  1. public class MethodWithReturn {
  2. public static void main(String[] args) {
  3. // メソッドの戻り値を変数に格納
  4. int result1 = add(10, 20);
  5. int result2 = add(5, 15);
  6.  
  7. System.out.println("10 + 20 = " + result1);
  8. System.out.println("5 + 15 = " + result2);
  9.  
  10. // 戻り値を直接使用することも可能
  11. System.out.println("100 + 200 = " + add(100, 200));
  12. }
  13.  
  14. // 2つの数値を足し算して結果を返すメソッド
  15. public static int add(int num1, int num2) {
  16. int sum = num1 + num2;
  17. return sum;
  18. }
  19. }
  20.  
実行結果
10 + 20 = 30
5 + 15 = 20
100 + 200 = 300
このプログラムでは、addメソッドが2つの数値を受け取って、その合計をint型の戻り値として返しています。

戻り値を受け取る方法は2つあります
1. 変数に格納する
int result1 = add(10, 20);
2. 直接使用する
System.out.println("100 + 200 = " + add(100, 200));
💡注意!
戻り値の型とreturn文で返す値の型は一致している必要があります。
例えば、戻り値の型がintなのに、return文でString型の値を返そうとするとエラーになります。

引数と戻り値を組み合わせよう

引数と戻り値を組み合わせることで、より実用的なメソッドを作ることができます。

サンプル:PracticalMethod.java
public class PracticalMethod {
    public static void main(String[] args) {
        // 消費税込み価格を計算
        double price1 = calculateTaxIncludedPrice(1000);
        double price2 = calculateTaxIncludedPrice(2500);
 
        System.out.println("1000円の税込み価格: " + price1 + "円");
        System.out.println("2500円の税込み価格: " + price2 + "円");
 
        // 2つの数値の大きい方を取得
        int max1 = getMax(10, 20);
        int max2 = getMax(100, 50);
 
        System.out.println("10と20の大きい方: " + max1);
        System.out.println("100と50の大きい方: " + max2);
    }
 
    // 消費税込み価格を計算するメソッド
    public static double calculateTaxIncludedPrice(int basePrice) {
        final double TAX_RATE = 1.10; // 消費税率10%
        return basePrice * TAX_RATE;
    }
 
    // 2つの数値のうち大きい方を返すメソッド
    public static int getMax(int a, int b) {
        if (a > b) {
            return a;
        } else {
            return b;
        }
    }
}
 
実行結果
1000円の税込み価格: 1100.02500円の税込み価格: 2750.01020の大きい方: 20
10050の大きい方: 100

配列の引数渡しの仕組み

これまで学習してきた配列をメソッドに渡すとき、実は特別な仕組みが働いています。
例えば、友達に「この箱の中身を見てきて」と頼んだとき、友達が箱の中身を変更してしまったら、元の箱の中身も変わってしまいます。
これと似たような現象がJavaの配列でも起こります。

値渡し

まずは、これまで学習した基本型(int、doubleなど)がメソッドに渡されるときの動作を確認しましょう。
  1. public class BasicTypeTest {
  2. public static void main(String[] args) {
  3. int number = 10;
  4. System.out.println("メソッド呼び出し前: " + number);
  5.  
  6. changeNumber(number);
  7.  
  8. System.out.println("メソッド呼び出し後: " + number);
  9. }
  10.  
  11. public static void changeNumber(int num) {
  12. num = 100;
  13. System.out.println("メソッド内での値: " + num);
  14. }
  15. }
メソッド呼び出し前: 10
メソッド内での値: 100
メソッド呼び出し後: 10
このように、基本データ型では値そのものがコピーされて渡されるため
メソッド内で値を変更しても元の変数には影響しません。
これを値渡しと呼びます。

参照渡し

それでは、配列をメソッドに渡した場合はどうなるでしょうか。
public class ArrayTest {
    public static void main(String[] args) {
        int[] scores = {85, 92, 78};
        System.out.println("メソッド呼び出し前:");
        printArray(scores);
 
        changeArray(scores);
 
        System.out.println("メソッド呼び出し後:");
        printArray(scores);
    }
 
    public static void changeArray(int[] array) {
        array[0] = 100;
        System.out.println("メソッド内で配列を変更しました");
    }
 
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}
 

メソッド呼び出し前:
85 92 78 
メソッド内で配列を変更しました
メソッド呼び出し後:
100 92 78  
おや?基本データ型とは違って、元の配列の中身が変更されてしまいました!
これはなぜでしょうか?
Javaにおいて、配列をメソッドに渡すときは参照渡しという仕組みが使われます。

重要なポイント
1. 配列のデータそのものは渡されない
2. 配列がメモリのどこにあるかを示す住所(参照)が渡される
3. この住所は値としてコピーされて渡される
4. 結果として、呼び出し元とメソッド側で同じ配列を参照することになる

図解で理解する配列の引数渡し

メモリ上のイメージ


なぜこの仕組みが採用されているのか

メリット

1. メモリ効率が良い
大きな配列であってもすべての要素をコピーする必要がないため
2. 処理速度が速い
複雑なコピー処理は要らず、参照する住所の値だけを渡せばよいため
3. 配列の内容を変更できる
メソッドで配列を操作したい場合に便利

注意点

1. 意図しない変更が起こる可能性がある
2. 元の配列が変更されることを意識する必要がある

メソッド名の付け方

良いメソッド名を付けることは、プログラムの可読性を向上させるために重要です。
以下のルールに従ってメソッド名を付けましょう
①動詞で始める
メソッドは「何かを行う」ものなので、動詞で始めるのが一般的です。
例:calculate(計算する)、display(表示する)、find(見つける)

②キャメルケースを使う
複数の単語を組み合わせる場合は、2番目以降の単語の先頭を大文字にします。
例:calculateSum、displayArray、findMaxValue

③意味が分かりやすい名前にする
メソッドが何をするのかが名前から分かるようにします。
良い例:calculateTaxIncludedPrice(消費税込み価格を計算する)
悪い例:calc(何を計算するのか分からない)

コラム

準備中

ウィキ募集バナー