復習 (2)

今回の内容

今回は「関数」から「複合データ」までの復習を行います。知識に抜けがないかチェックしておきましょう。

復習

メソッド

関数」の回では、「手続き」の回で紹介したメソッドが、さらに値を返せるようにする方法を紹介しました。

package j1.review02;

import javax.swing.JOptionPane;

public class Add {

    public static void main(String[] args) {
        new Add().start();
    }

    void start() {
        String input1 = JOptionPane.showInputDialog("1つ目の整数を入力");
        String input2 = JOptionPane.showInputDialog("2つ目の整数を入力");
        int a = Integer.parseInt(input1);
        int b = Integer.parseInt(input2);
        int result = add(a, b);
        JOptionPane.showMessageDialog(null, "合計は" + result);
    }

    int add(int a, int b) {
        return a + b;
    }
}

値を返すメソッドは、メソッドの宣言時に返す値の型を指定し、メソッドのブロックでreturn文を使って起動元に返す値を指定します。

<戻り値の型> <メソッドの名前>(<仮引数の一覧>) {
    <命令>
    return <起動元に渡す値>;
}

return文はメソッドのどこに書いてもかまいませんが、return文が処理された瞬間にそのメソッドは処理を終了して指定された値を起動元に返します。このため、値を返すメソッドではif文などで分岐してもかならずreturn文を通るようにプログラミングする必要があります。

値を返すメソッドは、プログラムの中でリテラルの代わりに使用できます。


    int score = add(50, 70) / 2;

int add(int a, int b) {
    return a + b;
}

戻り値の種類については、整数 (int)、実数 (double)、文字列 (String)に加え、論理値 (boolean)などを指定できます。それぞれのメソッドでは、return文を利用して対応する値を起動元に返してやります。

int <メソッドの名前>(<仮引数の一覧>) {
    <命令>
    return <整数>;
}
double <メソッドの名前>(<仮引数の一覧>) {
    <命令>
    return <実数>;
}
String <メソッドの名前>(<仮引数の一覧>) {
    <命令>
    return <文字列>;
}
boolean <メソッドの名前>(<仮引数の一覧>) {
    <命令>
    return <trueまたはfalse>;
}

論理値を返すメソッドは、if文の条件式を書くところで起動できます。起動先のメソッドがtrueを返せば条件が成立したとみなされ、falseを返せば条件が成立しなかったとみなされます。また、先頭に ! をつけることでtrueとfalseを反転させられます。

if (<メソッドの名前>(<実引数の一覧>)) {
    <成立する場合の命令>
}
if (!<メソッドの名前>(<実引数の一覧>)) {
    <成立しない場合の命令>
}

値の列

値の列」の回では、プログラムで多数の値を取り扱うための仕組みとして、「配列」というものを紹介しました。

package j1.review02;

import javax.swing.JOptionPane;

public class FirstArray {

    public static void main(String[] args) {
        new FirstArray().start();
    }

    void start() {
        String[] messages = new String[3];
        messages[0] = "おはよう";
        messages[1] = "こんにちは";
        messages[2] = "こんばんは";
        String input = JOptionPane.showInputDialog("表示するメッセージは?(0-2)");
        int number = Integer.parseInt(input);
        JOptionPane.showMessageDialog(null, messages[number]);
    }
}

配列にはこれまでに紹介した整数や実数、または文字列などの値を複数記憶させられます。

int[] array = new int[10];
array[0] = 100;
array[1] = 200;
...

配列をプログラムから利用するには、まず配列を生成して変数に記憶させます。配列を生成する際には、配列が記憶できる値の種類と、長さ(記憶できる値の個数)を指定します。

int[] <変数の名前> = new int[<配列の長さ>];
double[] <変数の名前> = new double[<配列の長さ>];
String[] <変数の名前> = new String[<配列の長さ>];

配列に記憶させた個々の値を利用するには、変数名の後に角かっこでインデックスを指定します。

int element = array[5];

インデックスは整数で指定し、配列の最初の要素を参照する場合には0、最後の要素を参照する場合には(配列の長さ – 1)を指定します。この配列の長さは、変数名の後に「.length」と指定すればプログラム中から利用できます。

図: 配列の構造とインデックス

生成した配列を他のメソッドで利用する場合、メソッドの引数として受け渡せます。このとき、仮引数の型には配列型を指定します。

void show(int[] array) {
    JOptionPane.showMessageDialog(null, array[0]);
}

同様に、生成した配列を起動元に返すこともできます。こちらは戻り値の型に配列型を指定します。

String[] create() {
    String[] array = new String[10];
    ...
    return array;
}

つまり、int[], double[], String[]などの配列を表す型は、int, double, Stringなどのこれまでの型と同様に取り合え使えます。

繰り返し

繰り返し」の回では、for文を利用して特定の処理を繰り返し行う方法について紹介しました。また、繰り返しと配列を組み合わせて、配列の内容を集計するようなプログラムについても紹介しました。

package j1.review02;

import javax.swing.JOptionPane;

public class Sum {

    public static void main(String[] args) {
        new Sum().start();
    }

    void start() {
        int[] values = getValues();
        int total = 0;
        for (int i = 0; i < values.length; i++) {
            total = total + values[i];
        }
        JOptionPane.showMessageDialog(null, total);
    }

    int[] getValues() {
        int[] values = new int[5];
        values[0] = 10;
        values[1] = 20;
        values[2] = 30;
        values[3] = 40;
        values[4] = 50;
        return values;
    }
}

Javaのfor文は次の形式で書きます。ここで宣言した繰り返し変数はfor文のブロック内で利用でき、ブロック内の命令を処理するたびに繰り返し変数が更新されます。また、毎回のブロックを処理する前には繰り返し条件が判定され、条件が成立しない場合には繰り返しが終了します。

for (<変数の宣言>; <繰り返し条件>; <変数の更新>) {
    <命令>
}

図: for文の構造多くの場合、for文は次のような形式で書きます。これは指定した繰り返し回数だけ処理を繰り返します。このとき、変数iに記憶させる値は、順に0, 1, …, (繰り返し回数 – 1)です。

for (int i = 0; i < (繰り返し回数); i++) {
    <命令>
}

この繰り返しを配列と組み合わせると、配列に記憶させた要素を順番に取り出して処理できます。配列の長さにかかわらず同じ書き方ができるので、データの列に対して柔軟に処理を行えます。講義では、配列の中身を合計するプログラムについて紹介しました。

int[] values = getValues();
int total = 0;
for (int i = 0; i < values.length; i++) {
    total = total + values[i];
}

複合データ

複合データ」の回では、複数のデータを組み合わせた複合データをプログラムで利用するために、「クラス」と「インスタンス」について紹介しました。

package j1.review02;

import javax.swing.JOptionPane;

public class Quiz {

    public static void main(String[] args) {
        new Quiz().start();
    }

    void start() {
        Question question = new Question();
        question.statement = "10 + 20 = ?";
        question.correct = 30;
        String input = JOptionPane.showInputDialog(question.statement);
        int answer = Integer.parseInt(input);
        if (answer == question.correct) {
            JOptionPane.showMessageDialog(null, "正解です");
        }
        else {
            JOptionPane.showMessageDialog(null, "不正解です");
        }
    }
}

class Question {
    String statement;
    int correct;
}

クラスはプログラムの末尾に次のような形式で宣言します。

class <クラスの名前> {
    <フィールドの宣言>
}

クラスは複合データがどのようなデータの組合せであるかという「形式」を表すもので、組み合わせるデータはフィールドとして宣言します。

<フィールドの型> <フィールドの名前>;

クラスはあくまで形式であり、プログラムから使える具体的なデータではありません。複合データをプログラムから利用するには、クラスからその具体例である「インスタンス」を生成して使います。生成したインスタンスを変数に記憶させる場合には、クラスと同じ名前の型で変数を宣言します。

<クラスの名前> <変数の名前> = new <クラスの名前>();

クラスからインスタンスを生成したら、それぞれのフィールドに値を代入します。また、同じ形式でフィールドを参照することもできます。

<変数の名前>.<フィールドの名前>

生成したインスタンスを配列に記憶させることもできます。配列は整数(int)や実数(double)、文字列(String)などのほかに、クラスと同じ名前の型を要素の型の指定できます。クラスと同じ名前の型を指定した場合、その配列に記憶させられるのは同じクラスのインスタンスです。

<要素の型>[] <変数の名前> = new <要素の型>[<配列の大きさ>];

達成度の確認

以下それぞれの項目について、問題ないか確認してみましょう。不安な要素があればそれぞれの回をさらに復習してください。