Javaのクラスを極める!オブジェクト・インスタンスなどの概念。
この記事では、Javaの「クラス」とそれにまつわる多くの用語を勉強する。
クラスはオブジェクト指向言語であるJavaを理解するうえでもっとも重要なコンセプトだ。Javaのプロジェクトを制作するうえで要となってくる要素なのでしっかりと理解しておきたい。
なお、抽象クラスといった高度なクラスの使い方について知りたい人はこちらの記事を参考にしてほしい。
クラスに関連する用語
今回はまずクラスに関連する用語を理解するところから始めよう。
クラスとは?
まずはこの記事のテーマである「クラス」について。
クラスはJavaのプロジェクトにおけるひとつの構成単位。
class修飾子によって定義されており、変数やメソッドなどの要素を含む。
オブジェクトとは?
次にオブジェクト指向という言葉の由来にもなっている「オブジェクト」という概念について考えてみよう。
オブジェクトは私たちが住んでいる世界に存在する人や物を型にあてはまて定義したものと考えるとわかりやすい。
いくつか例を挙げてみよう。
- オブジェクト「Customer」⇨ 顧客を表すオブジェクト。名前・苗字・性別・年齢・住所などのプロパティを持つ。
- オブジェクト「Car」⇨ 車を表すオブジェクト。メーカー・車種・馬力などのプロパティを持つ。
インスタンスとは?
インスタンスはクラスという雛形から作られる実体と考えるといいだろう。
コード内でインスタンスを作ることを「インスタンスを生成する」などとという。
クラスの使い方
次に商品をモデルにしたクラス「Prodcut」を例にしてクラスの使い方を勉強していこう。
class Product { private Long id; private String name; private int price; public Product(){} public Product(Long id, String name, int price) { this.id = id; this.name = name; this.price = price; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "Product{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } } class MainClass { public static void main(String[] args) { Product product = new Product((long) 13, "高性能デスクトップPC" , 98000); System.out.println("id=" + product.getId() + ", name='" + product.getName() + ", price=" + product.getPrice()); } }
クラスを宣言する
クラスの宣言はclass修飾子を使っておこなう。
例としてクラス名がProductの場合は以下のような記述となる。
class Product {
// クラスの中身を記述する。
}
クラスをpublicで定義する場合はそのクラスを同じ名前のファイル内に作る必要がある。
通常、クラス内の定義はフィールド ⇨ コンストラクタ ⇨ メソッドの順に書かれる。
フィールド
フィールドとはクラス内に定義された変数や定数のことを指す。例のコードではid・name・priceの3つの変数がフィールドとなる。
private Long id;
private String name;
private int price;
コンストラクタ
コンストラクタはクラスからインスタンスを生成するために必要となる。
例のコードでは次の2つのコンストラクタが定義されている。
public Product(){}
public Product(Long id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
ひとつ目のコンストラクタはインスタンスを生成する際にその要素の指定をおこなわない。
ふたつ目のコンストラクタでは、引数としてid・name・priceの3つを渡さないといけない。渡された引数はすぐにフィールドとして代入される。
サンプルのコードでは、ふたつ目のコンストラクを使用している。
Product product = new Product((long) 13, "高性能デスクトップPC" , 98000);
コンストラクタを記述しない場合は、デフォルトコンストラクタと呼ばれる引数無しのコンストラクタが自動で生成される。
メソッド
メソッドはプログラムに対する処理をおこなう。メソッドの数やひとつのメソッドの長さはクラスの内容や役割により大きく異なる。メソッドは関数やファンクションとも呼ばれる。
この例では、Getter・Setterと呼ばれるフィールドにアクセスするために必要となるメソッドが定義されている。
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
クラスの種類
クラスには様々な役割を持たせることができるが、よくある使われ方は以下のように分類できる。
- モデルクラス ⇨ オブジェクトを定義するクラス。オブジェクトについては次の項で説明する。
- DTOクラス ⇨ バックエンドとのコミュニケーションの際に使われるクラスはDTOクラスと呼ばれる。
- ユーティリティクラス ⇨ 再利用可能なメソッドを集めたクラス。ユーティリティクラスに属するメソッドはStaticメソッドとして定義されることが多い。
- ラッパークラス ⇨ オブジェクトではない要素をオブジェクトとして使用する場合に用いられるクラス。
その他にも、クラスにまつわる用語には以下のようなものがある。
- finalクラス・staticクラス ⇨ クラスの持つ修飾子による分類。
- インナークラス・匿名クラス ⇨ クラスの構造による分類。
- 親クラス・抽象クラス・スーパークラス ⇨ 継承に基づいた分類。
親クラス・子クラス・スーパークラスなどは継承のテーマの中で説明する。