Java 基本編 6日目

複数の命令文を一つにまとめて名前をつけたものをメソッドと呼びます
この章では、メソッドの宣言の方法や使い方を説明します

メソッドの定義と引数

メソッドは同じ処理を何度も実行したいときに便利です
メソッドを使うとコードがスリム化されて可読性が高くなり、変更や再利用が用意になるというメリットがあります

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

メソッドは、次のように定義します

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

アクセス修飾子
メソッドの公開範囲を決めるもので、public、private、protectedなどがあります
(応用編で詳しく説明します)

戻り値の型:
メソッドの処理結果を呼び出し元に返す値のデータ型を定義する

メソッド名:
メソッドの識別名で変数の命名規則と同じ規則に従います(基本編 2日目を参照)

引数:
メソッドに渡すパラメータのことです
型と引数のペアを複数指定できます

メソッドの呼び出し方は以下のように記述します

型名 変数名 = メソッド名(引数1,引数2,...;

※定義されているメソッドの戻り値の型や引数の型、引数の個数に合わせて呼び出します

以下は、addというメソッドを定義し呼び出しているサンプルプログラムです

public class Sample {
    public static int add(int a,int b){
        return a + b;
    }
    public static void main(String[] args){
        int x = 3;
        int y = 5;
        int n = add(x,y);
        System.out.println(("加算結果=" + n));
    }
}
public static int add(int a,int b){
    return a + b;
}

この行がメソッドの定義部分です

int n = add(x,y);

この行がメソッドの呼び出しの部分です
メソッドを呼び出した後、戻り値を変数nに代入しています

メソッドを呼び出すときの処理の流れは次のとおりです
①呼び出し側の処理からadd()前までの処理を実行
②add()を呼び出す
③add()内の処理を実行しadd()を抜ける
④add()の呼び出し元へ戻る
⑤add()の後の処理を実行

この処理の流れを表した図です

メソッドの引数

メソッドは引数を使って呼び出し元から処理に必要な値を受け取ることができます
一度に複数の値を渡すこともできます
実引数(メソッド呼び出しでの引数)の型、個数、並び順は仮引数( メソッド側の引数)と一致していなければなりません

前述したaddメソッドを呼び出しているサンプルプログラムでの引数を図に表しています

変数、引数の有効範囲(スコープ)

変数や引数は扱える範囲が決まっています
あるブロックの中({}で囲まれている部分)で宣言した変数は、そのブロックの中だけで参照したり代入したりでき、ブロックの外側では扱うことができません
このように扱える範囲のことをスコープといいます
変数のスコープは、変数の宣言が行われた場所から、そのブロックの終わりまでです
引数のスコープも、仮引数が宣言された場所からブロックの終わりまでです

この図は変数、引数のスコープを表しています
addメソッド内で定義した変数の有効範囲はaddメソッド内で有効となりますので、もし、addメソッド内にx、yという変数を定義したとしてもmainメソッドのx、yとは別のものとなります

配列を引数で渡す場合

以下に参照型の配列変数を引数に渡した場合の例を示します
このサンプルプログラムは、swapメソッドの仮引数が配列変数となっています
swapメソッド内で配列の値の入れ替えを実行しています

public class Sample {
    public static void swap(int[] a){
        int tmp;
        tmp = a[0];//値の入れ替え
        a[0] = a[1];
        a[1] = tmp;
    }
    public static void main(String[] args){
        int[] array = {2,5};
        System.out.println("[0]="+array[0]+" [1]=" + array[1]);
        swap(array);
        System.out.println("[0]="+array[0]+" [1]=" + array[1]);
    }
}
【実行結果】
[0]=2 [1]=5
[0]=5 [1]=2

swapメソッドから戻ってきたあと、配列の0番目と1番目の値が入れ替わっています
仮引数が参照型のため、このような結果になります

以下の図は、実引数、仮引数が配列の実体を参照していることを表しています

int[] array = {2,5};

配列変数arrayを初期化した際、配列の実体がメモリ領域に確保され、arrayはメモリ領域に確保された場所を参照します

swap(array)

swapメソッドの引数にarrayを渡すことで、arrayが参照しているメモリ領域の先頭アドレスがswapメソッドにわたっていきます

void swap(int[] a)

swapメソッドの仮引数aは、arrayが参照しているメモリ領域の先頭アドレスで初期化されるため、arrayと同じメモリ領域を参照します

a[0] = a[1];
a[1] = tmp;

この処理を実行することで、参照先のメモリ領域の値が変わることになります
このように、引数に配列を渡しメソッドを呼び出し、呼び出し先で配列の実体を書き換えると、呼び出し元にも影響します

メソッドの戻り値

戻り値とは、メソッドからreturn文を使って呼び出し元に返す値のことをいいます
呼び出し元で戻り値を受け取ることもできます

以下は、int型の引数を受け取り、値の大きい方を返すメソッドを作成したサンプルプログラムです

public class Sample {
    public static int max(int a, int b){
        if(a > b){
            return a;
        }else{
            return b;
        }
    }
    public static void main(String[] args){
        int a = 3;
        int b = 5;
        int v = max(a,b);
        System.out.println(a+""+b+"の大きい値="+v);
    }
}
実行結果
3と5の大きい値=5
int max(int a, int b)

戻り値のデータ型をint型と定義しています

return b;

戻り値としてint型を返しています

int v = max(a,b);

maxメソッドを呼び出した後、戻り値を受け取り、int型の変数vに代入しています

オーバーロード

すでに存在しているメソッドと同じ名前で、「引数が異なる」メソッドを宣言することをオーバーロードといいます
オーバーロードされたメソッドは、引数の数や種類によって、どのメソッドが呼び出されるか決定されます

たとえば、前述したaddメソッドはint型の引数を2つ必要としていました

以下は、addメソッドをオーバーロードしたサンプルプログラムです

public class Sample {
    // パターン① ( 引数:int型,int型 )
    public static int add(int num1, int num2) {
        return num1 + num2;
    }

    // パターン② ( 引数:int型,int型,int型 )
    public static int add(int num1, int num2, int num3) {
        return num1 + num2 + num3;
    }

    // パターン③ ( 引数:double型,double型 )
    public static double add(double num1, double num2) {
        return num1 + num2;
    }

    public static void main(String[] args) {
        System.out.println(add(1, 2));
        System.out.println(add(1, 2, 3));
        System.out.println(add(1.0, 2.0));
    }
}
// パターン① ( 引数:int型,int型 )
public static int add(int num1, int num2) {
    return num1 + num2;
}

パターン①は、int型の引数2つを受け取っています

// パターン② ( 引数:int型,int型,int型 )
public static int add(int num1, int num2, int num3) {
    return num1 + num2 + num3;
}

パターン②は、int型の引数3つを受け取っています

// パターン③ ( 引数:double型,double型 )
public static double add(double num1, double num2) {
    return num1 + num2;
}

パターン③は、double型の引数2つを受け取っています

System.out.println(add(1, 2));

パターン①のメソッドが呼び出されます

System.out.println(add(1, 2, 3));

パターン②のメソッドが呼び出されます

System.out.println(add(1.0, 2.0));

パターン③のメソッドが呼び出されます

このように引数の数や型が異なれば、同じ名前のメソッドを複数定義できます

しかし、引数は同じで戻り値の型がことなるメソッドは定義することができません
下記のように、引数の型、数が同じで戻り値の違うメソッドを定義した場合エラーが発生します

public class Sample{
    // パターン① ( 引数:int型,int型 )
    public static int add(int num1, int num2) {
        return num1 + num2;
    }

    // パターン③ ( 引数:double型,double型 )
    public static double add(int num1, int num2) {
        return (double)num1 + (double)num2;
    }

    public static void main(String[] args) {
        System.out.println(add(1, 2));

    }
}
Sample.java:9: error: method add(int,int) is already defined in class Sample
public static double add(int num1, int num2) {
                         ^
1 error

【演習問題】

  1. 以下の機能をもつプログラムを作成してみましょう
    (1) 2つの整数の⼤きい⽅を求めるメソッドを実装する
    ※同じ値の場合は、先に⼊⼒した整数を返す仕様とする
    (2) 乱数により2つの整数を取得し、(1)で作成したメソッドを呼び出す
    (3) (2)の結果を出⼒する
  実行結果
  2つの整数は3,5
  3と5では5が⼤きい
  1. 以下の機能をもつプログラムを作成してみましょう
    (1) 2つの整数の⼩さい⽅を求めるメソッドを実装する
    ※同じ値の場合は、先に⼊⼒した整数を返す仕様とする
    (2) ⻑さ5の整数型の配列変数を⽤意し、1から100までの乱数を代⼊し、代⼊した値を表⽰する
    (3) (1)のメソッドを使⽤し、配列の最⼩値を求める
  実行結果
  [0]=91
  [1]=97
  [2]=46
  [3]=67
  [4]=44
  最⼩値は44
  1. 以下の機能をもつプログラムを作成してみましょう
    (1) うるう年かどうかを判定するメソッドを作成する ※うるう年の判定⽅法は次の通り
    *4で割り切れかつ100では割り切れない年,もしくは,400で割り切れる年
    (2) 1900年から2024年までの間でうるう年と判定した年を列挙する
   実⾏結果
   1904 1908 1912 1916 1920 1924 1928 1932 1936 1940 1944 1948 1952 1956 1960
   1964 1968 1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020
   2024

コメント

この記事へのコメントはありません。

関連記事

Java 基本編 5日目

Java 応用編 4日目

Javaを使う上で知っておくべきツール

PAGE TOP