Help us understand the problem. What is going on with this article?

【Java】基本的なメソッドのノート

More than 1 year has passed since last update.

シンプルなメソッド定義

必要最低限な定義は下記の通り。
ここではmainメソッドでhelloメソッドを呼び出して使っている。

  • 呼び出し元:mainメソッド
  • 呼び出し先:helloメソッド

↑こういう言い方をする時もある。

public class Main{

    // メインメソッド定義
    public static void main(String[] args){
        hello();
    }

    // helloメソッド定義
    public static void hello(){
        System.out.println("Hello World!");
    }
}

メソッド呼び出しを入れ子構造にすることももちろんできる。

    // メインメソッド定義
    public static void main(String[] args){
        methodA();
    }

    // methodA定義
    public static void methodA(){
        System.out.println("this is methodA");
        methodB();
    }

    // methodB定義
    public static void methodB(){
        System.out.println("this is methodB");
    }

※class定義分は省略。

引数の利用

メソッド定義文で引数を設定することができる。
呼び出し先の方で記述される引数は仮引数というらしい。

    // メインメソッド定義
    public static void main(String[] args){
        printName("tanaka");
        printName("suzuki");
        printName("satou");
    }

    // printNameメソッド定義
    public static void printName(String name){
        System.out.println( name + "さん、こんにちは");
    }

複数の引数を利用する場合、オーバーロードを利用することができる。
この場合、引数の個数・型・並び順が異なれば良い。
シグネチャが異なれば良いとも言う。
※シグネチャ:メソッド名+引数の個数・型・並び順

    // メインメソッド定義
    public static void main(String[] args){
        System.out.println("引数は2:"+ov(10,20));
        System.out.println("引数は3:"+ov(10,20,30));
        System.out.println("引数は4:"+ov(10,20,30,40));
        System.out.println("引数は文字でも良い:"+ov("takahashi"));
    }

    // ovメソッドの定義
    public static int ov(int p, int q){ //仮引数2
        int ans = p *q;
        return ans;
    }
    public static int ov(int p, int q, int r){ //仮引数3
        int ans = p * q - r;
        return ans;
    }
    public static int ov(int p, int q, int r, int s){ //仮引数4
        int ans = p * q - r * s;
        return ans;
    }
    public static String ov(String name){ //
        String ans = name;
        return ans;
    }

ちなみにmainメソッド自体も例外なくメソッドなので、ターミナルでコマンドライン引数を引数を打ってやれば、その情報をプログラムに追加することもできる。

例えばターミナルで

java Main 24歳 学生

と打ってやると、Main.javaファイルのmainメソッドで

public static void main (String[] args)

このString型の配列args24歳,学生という要素が追加される。
args[0]==24歳, args[1]==学生ということ 。

戻り値の利用

メソッド宣言文で戻り値を設定することで、mainメソッドに値を渡すことができる。
ここではint型の戻り値をreturnでメインメソッドに返すようにしている。

    // mainメソッド定義
    public static void main(String[] args){
        System.out.println("100と200の積は"+ret(100,200));
    }

    //retメソッド定義
    public static int ret(int x, int y){
        int ans = x * y;
        return ans;
    }

配列を用いる時の注意点

普通に引数として配列をメソッドに渡す場合はこんな感じ。
ここではprintArrayメソッド定義時に引数の型をint->int[]とするだけで良い。

    // mainメソッド定義
    // こっちで配列作成
    public static void main(String[] args){
        int[] array={10,20,30,40};
        printArray(array);
    }

    // printArrayメソッドの定義
    public static void printArray(int[] x){
        for(int value: x){
            System.out.println(value);
        }
    }

もちろん戻り値に配列を用いることもできる。
その場合は、makeArrayメソッド定義文の戻り値をvoid -> int[]にしてやる。
このプログラムはメインメソッドで指定した値を元に、makeArrayメソッドがその値に従って要素数を決め、配列を1,2,3,...と作る。それを戻り値としてメインメソッドに返している。

    // mainメソッド定義
    public static void main(String[] args){
        int[] newArray= makeArray(5);
        for(int value: newArray){
            System.out.println(value);
        }
    }

    // makeArrayメソッドの定義
    // こっちで配列作成
    public static int[] makeArray(int size){
        int[] x = new int[size];
        for(int i=1; i<x.length; i++){
            x[i] = i;
        }
        return x;
    }

値渡しと参照渡し

普通に引数・戻り値をメソッド間でやりとりする場合は、それは値そのものをやりとりしていると言っていい(値渡し, call by value)。
ただ、配列を引数・戻り値としてメソッド間でやりとりする場合は、値そのものではなく、メモリ上のアドレスを渡している(参照渡し, call by reference)。
したがって、mainメソッドで作成した配列

int[] array = {1,2,3,4} // mainメソッド

を引数として他のメソッドに渡した後、そのメソッド内で

array[0]=10; // 呼び出し先メソッド

とか代入してしまうと、メモリ上の値が変わることになる。そのため、mainメソッドで

System.out.println(array[0]);

とか打つと、返ってくる値は1ではなく10になる。
配列が10,2,3,4と書き換えられるということ。

P.S

値そのものではなく、メモリ上のアドレスが代入される変数は参照型と呼ばれる。配列型以外のものではクラス型が参照型に含まれる。

サンプルコード

参照渡しで配列が書き換えられる例としてはこんなところか。

    // mainメソッド定義
    public static void main(String[] args){
        int[] array={1,2,3,4};
        incArray(aray);
        for (int value: aray){
            System.out.println(value);
        }
    }

    // incArrayメソッド定義
    public static void incArray(int[] x){
        for(int i=0; i<x.length; i++){
            x[i]++;
        }
    }

返ってくる配列は2,3,4,5になっているはず。

参考書籍

スッキリわかるJava入門第2版
第5章 Pp.170-202, 336.

shg3
学習
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away