Prokumaの雑記

限りなく日記帳に近いブログ

講義「オブジェクト指向プログラミング」特集/2. クラスとメソッド

講義「オブジェクト指向プログラミング」特集、二番目の記事です。

今回は、クラスとメソッド、そしてJavaでの定義の仕方について説明します。この特集は、みなさんが講義でC言語の基礎的な文法を習ったという前提で作成したものなので、条件分岐・繰り返し等の説明はしません。もしその基礎的な文法がわからないという方は(条件分岐もわからないのに単位が取れたこと自体が不思議ですが、、、)、きちんと基礎的な文法を身に付けましょう。

1. クラスとメソッド

クラスとメソッドは、Javaという言語を説明することにあたって欠かせない存在です。クラスとメソッド、一体どういうものなのか、今から説明します。

1.1 クラス

クラス(Class)は学級、種類、階級等の意味を持ちますが、ここでは「インスタンスを生成する機械」として考えましょう。インスタンスは、クラスという機械から生成された「モノ」として考えましょう。そうするとクラスが如何にオブジェクト指向で重要な部分であるかわかるはずです。

クラスは「モノ」を定義する構文です。下のコードのように「モノ」を定義します。

public class Score {
    int math;
    int english;
    int science;
}

このコードは、「成績表」という「モノ」を定義しています。クラスの中には、math``english``scienceというint型変数が宣言されていますが、これは「成績表」の要素、つまり各科目の成績を定義しているのです。C言語での構造体と差がなさそうに見えますが、クラスは構造体にはない機能を持っています。構造体にはない機能については、下で説明することにします。

1.2 メソッド

メソッド(method)は方法、方式の意味を持ちます。単語から推測できると思いますが、「モノ」を動かす方法、つまり「モノ」の動作を定義する構文です。サブルーチンということは関数と同じですが、生成したインスタンスでそのインスタンスの操作に使うのが異なる点です。(インスタンスを生成せず使えるstaticメソッドというものもありますが、あとで説明します)

先ほど定義した「成績表」に相応しい動作を定義してみましょう。

public class Score {
    int math;
    int english;
    int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

成績を設定するsetScoreメソッドと成績を出力するprintScoreメソッドを定義しました。ちなみにthisはメソッド内部の局所変数ではないクラスの要素として定義された変数を明示的に示すものです。

1.3 カプセル化

カプセル化は、クラスを使用してインスタンスを生成し、利用する時、操作に必要のない内部でしか使われない変数、メソッドを隠蔽することを意味します。Javaでは、その隠蔽度の調整ができるアクセス修飾子というものを用いてカプセル化を行います。アクセス修飾子は、public、private、protected、指定なしがあります。ここでは、publicとprivateについて説明します。

publicは自分のクラスだけではなく、外部のどのクラスからもアクセスできるようにするものです。外部からアクセスできるようにする必要のある変数・メソッドはpublicにしましょう。

privateはそのクラス内でしかアクセスできないようにするアクセス修飾子です。外部から操作する必要のない変数・メソッドはprivateにしましょう。

その他は後ほど説明します。

先ほど定義したScoreクラスは、setScoreというメソッドがあるため、外部からmath``english``scienceへのアクセスは不要です。privateにしましょう。

public class Score {
    private int math;
    private int english;
    private int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

2. インスタンスの生成方法

成績表というモノを定義しましたので、成績表というモノを生成し、成績情報を入れ、成績を出力してみましょう。

// Program2.java
// 実はProgram2クラスとScoreクラスは別ファイルとして作成しても良いですが、授業では扱っていないため、一つのファイルにまとめました
// publicクラスは一つのファイルに一つしか定義できないため、Scoreクラスは指定なしにしています
public class Program2 {
    public static void main(String[] args){
        Score chino = new Score();
        chino.setScore(90, 90, 90);
        chino.printScore();

        Score cocoa = new Score();
        cocoa.setScore(100, 40, 100);
        cocoa.printScore();
    }
}
class Score {
    private int math;
    private int english;
    private int science;
    
    public void setScore(int m, int e, int s) {
        this.math = m;
        this.english = e;
        this.science = s;
    }

    public void printScore() {
        System.out.println(this.math);
        System.out.println(this.english);
        System.out.println(this.science);
    }
}

Scoreが型のように書かれていることがわかると思います。Score型の変数を定義し、new Score();インスタンスを生成し、変数に代入することができます。生成されたインスタンスは、操作によって違う情報や状態になります。上のプログラムを実行してみるとわかると思いますが、chinococoaprintScore()メソッドの実行結果が異なります。

3. static変数・メソッド

最後に、static修飾子について説明したいと思います。static修飾子は、インスタンスを生成しなくてもその変数・メソッドが使えるようにします。mainメソッドがその例の一つです。System.out.printlnメソッドもstaticメソッドです。Cの関数、全域変数のような使い方ができるようにするので、そのような操作をする必要があるときに使います。