講義「オブジェクト指向プログラミング」特集/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();
でインスタンスを生成し、変数に代入することができます。生成されたインスタンスは、操作によって違う情報や状態になります。上のプログラムを実行してみるとわかると思いますが、chino
とcocoa
のprintScore()
メソッドの実行結果が異なります。
3. static変数・メソッド
最後に、static修飾子について説明したいと思います。static修飾子は、インスタンスを生成しなくてもその変数・メソッドが使えるようにします。main
メソッドがその例の一つです。System.out.println
メソッドもstaticメソッドです。Cの関数、全域変数のような使い方ができるようにするので、そのような操作をする必要があるときに使います。