Javaはオブジェクト指向プログラミング(OOP)を基盤としたプログラミング言語です。つまり、その中核をなすのが「クラス」と「オブジェクト」の概念です。この2つの概念の基礎理解なしでは、Javaのプログラム設計や、複雑なJavaアプリケーションの開発を行うことはできません。
ですが、特にプログラミング初心者にとってはこの概念が鬼門で「オブジェクト指向」って何?というところで挫折してしまう方も多くいらっしゃいます。なので、このページでは①クラスとオブジェクトの基本的な概念から解説し、②具体的なコード例を通じてその使い方を詳しく解説していきます。日常生活に例えながら説明していきますので、初心者の方でもきっと理解できるでしょう。
この記事を読み終える頃には、クラスとオブジェクトの役割を深く理解し、実践的に活用できるようになっているでしょう。
関連 Javaの1stステップ:基本的な構文ルールを1分で復習!
Java「クラス」と「オブジェクト」
Javaはオブジェクト指向プログラミングという考え方を基本にして作られた言語です。このオブジェクト指向プログラミングを理解するために欠かせないのが、「クラス」と「オブジェクト」という2つの概念。結論からざっくり説明すると、クラスは「設計図」、オブジェクトはその設計図を元に作られた「製品」のようなもの。
例えば「車」を作る場合。車を作る場合に必要となるのがとりあえず必要となるのが設計図です。この設計図がクラス。で、設計図には車の種類や色、エンジンの種類などが記載されていますが、この設計図を元に実際に作られた車がオブジェクトです。
より具体的に説明すると、クラスはそのオブジェクトの性質や動きを定義するもの。つまり、車で言えば「車とは何か」「車はどう動くか」を決めるのがクラス。そして、そのクラスに基づいて作られた具体的な車、例えば「赤いスポーツカー」がオブジェクトです。
Java:クラスの定義
クラスは、オブジェクトの「設計図」のようなものです。クラスは、オブジェクトが持つ属性(プロパティ)や、どのような動きをするか(メソッド)を定義します。
ここでは日常生活の例を用いてスマートフォンのクラスを作っていきたいと思います。スマートフォンには、OSやメーカー、モデルなどの属性(プロパティ)があります。また、電話をかけたり、インターネットに接続したり、写真を撮ったりする機能(メソッド)も持っています。図にすると↑のような感じ。
Javaでは↓のように、スマートフォンを表現するクラスを定義します。
public class Smartphone { // フィールド(プロパティ) String os; // OS String maker; // メーカー String model; // モデル // コンストラクタ(オブジェクトを初期化するための特別なメソッド) public Smartphone(String os, String maker, String model) { this.os = os; this.maker = maker; this.model = model; } // メソッド(動きや機能) public void makeCall(String number) { System.out.println("Calling " + number + "..."); } public void connectToInternet() { System.out.println("Connecting to the internet..."); } public void takePhoto() { System.out.println("Taking a photo..."); } }
↑の例では、Smartphone
という名前のクラスを作成しています。これが設計図の名前で、後で実際に製品を製造(オブジェクトを作る)際に利用されます。
public class Smartphone { ------------------------- }
そして、このクラスには、3つのプロパティ(os
、maker
、model
)があることが分かります。プロパティと言っても、結局はクラスの中で定義するただの「変数」です。
// フィールド(プロパティ) String os; // OS String maker; // メーカー String model; // モデル
参考 変数とは?
さらに、Smartphone
クラスにはコンストラクタと呼ばれる特別なメソッドがあり、新しいSmartphone
オブジェクトを作成するときにOS、メーカー、モデルを設定されていることが分かります。(「コンストラクタ」については別途詳細を解説するので、ここではひとまず初期化用のメソッドだと理解すればOKです。)
// コンストラクタ(オブジェクトを初期化するための特別なメソッド) public Smartphone(String os, String maker, String model) { this.os = os; this.maker = maker; this.model = model; }
そして、最後にmakeCall
、connectToInternet
、takePhoto
という3つのメソッドを使って、オブジェクトが電話をかけたり、インターネットに接続したり、写真を撮ったりする機能を定義しています。
// メソッド(動きや機能) public void makeCall(String number) { System.out.println("Calling " + number + "..."); } public void connectToInternet() { System.out.println("Connecting to the internet..."); } public void takePhoto() { System.out.println("Taking a photo..."); }
ポイント クラスの主な構成要素
- プロパティ(フィールド)
- オブジェクトが持っている「特徴」や「情報」を表すもの(例: OS、メーカー、モデル)。
- コンストラクタ
- 新しいオブジェクトを作成するときに呼ばれる特別なメソッド。コンストラクタは、オブジェクトが持つプロパティを初期設定(最初の値をセット)するために使われる。
- メソッド
- オブジェクトの動きや機能を定義する(例: 電話をかける、インターネットに接続する、写真を撮る)
補足)コンストラクタとは?
コンストラクタはオブジェクトを作成するときに呼び出される特別なメソッドです。コンストラクタの主な役割は、オブジェクトが生成されたときにそのオブジェクトの初期状態を設定することで、クラス名と同じ名称で定義されます。
public class Smartphone { String os; String maker; String model; // コンストラクタ public Smartphone(String os, String maker, String model) { this.os = os; this.maker = maker; this.model = model; } }
このコンストラクタは、新しいSmartphone
オブジェクトを作成するときに、os
、maker
、model
の値を設定しています。
ポイント コンストラクタとは?
- クラス名と同じ名前で定義されるメソッド
- コンストラクタの名前は、そのクラスの名前と同じでなければなりません。これにより、コンストラクタがどのクラスのものであるかが明確になります。
- 戻り値の型がない
- コンストラクタは値を返さないため、戻り値の型を指定しません。普通のメソッドとは異なり、
void
すら書きません。
- コンストラクタは値を返さないため、戻り値の型を指定しません。普通のメソッドとは異なり、
- オブジェクトの初期化
- コンストラクタは、新しいオブジェクトが作られるときに、そのオブジェクトの初期状態を設定します。例えば、スマートフォンのOS、メーカー、モデルを設定します。
Java:オブジェクトの作成(インスタンス化)
オブジェクトは、クラスに基づいて作成される「具体的なもの」です。クラスが設計図なら、オブジェクトはその設計図から作られた実際の製品にあたります。オブジェクトはクラスで定義されたプロパティ(属性)やメソッド(機能)を持ち、それらを使ってさまざまな動作をします。
先ほどのスマートフォンの例で言えば、「OS」や「メーカー」「モデル」といったプロパティ、「電話をかける」「インターネットに接続する」「写真を撮る」といったメソッドが全てクラスで定義されますが、実際にそのクラスから作られる具体的なスマートフォンがオブジェクトです。
具体的に、Javaでスマートフォンのオブジェクトを作成する例を見てみましょう。
public class Main { public static void main(String[] args) { // Smartphoneクラスからオブジェクトを作成 Smartphone myPhone = new Smartphone("Android", "Google", "Pixel"); // オブジェクトのメソッドを使う myPhone.makeCall("123-456-7890"); myPhone.connectToInternet(); myPhone.takePhoto(); } }
これはSmartphone
クラスを使ってmyPhone
という名前のオブジェクトを作成する例です。Javaでは、new
キーワードを使ってオブジェクトを作成します。以下の部分がそれ。
// Smartphoneクラスのインスタンス化(オブジェクトを作る) Smartphone myPhone = new Smartphone("Android", "Google", "Pixel 5");
この部分を簡単に説明すると、
Smartphone myPhone
→「Smartphone
型の変数myPhone
を作っている」ということ。Smartphone
クラスは設計図であり、myPhone
という名前の変数をその設計図の型で作成しています。new Smartphone("Android", "Google", "Pixel 5")
→「Smartphone
クラスに基づいて具体的なオブジェクトを作り、そのオブジェクトにOS、メーカー、モデルの情報をセットしている」ということ。
つまり、この行全体では「Smartphone
型の変数myPhone
を作り、その変数に具体的なSmartphone
オブジェクト(Android
OSのGoogle
製Pixel 5
)を代入している」ことを示しています。これが本質です。
尚、クラスからオブジェクトを作成することを具体的に「インスタンス化」と言います。実際の現場でも、オブジェクトを作成する、とは言わず基本的には「インスタンス化」という言葉が利用されるので覚えておくと良いでしょう。
ポイント オブジェクトのポイント
- インスタンス化
- クラスを基にして具体的なオブジェクトを作成することを「インスタンス化」と呼ぶ。↑のサンプルコードでは、
new Smartphone("Android", "Google", "Pixel")
がインスタンス化の部分。
- クラスを基にして具体的なオブジェクトを作成することを「インスタンス化」と呼ぶ。↑のサンプルコードでは、
- プロパティの利用
- オブジェクトはクラスで定義されたプロパティを持ち、それぞれのプロパティに特定の値が設定されます。↑のサンプルでは、
myPhone
のos
、maker
、model
に値が設定されている。
- オブジェクトはクラスで定義されたプロパティを持ち、それぞれのプロパティに特定の値が設定されます。↑のサンプルでは、
- メソッドの利用
- オブジェクトは、クラスで定義されたメソッドを使って動作します。↑のサンプルでは、
makeCall
、connectToInternet
、takePhoto
といったメソッドを呼び出している。
- オブジェクトは、クラスで定義されたメソッドを使って動作します。↑のサンプルでは、
オブジェクトは、実際にプログラムが動作する際に使われる具体的な「もの」です。クラスという設計図からオブジェクトを作成し、そのオブジェクトを操作することで、プログラムが様々な動きを実現します。
クラスとオブジェクトの利点
クラスとオブジェクトを使う利点はプログラムがとても効率的でわかりやすくなるということで。クラスは設計図なので、同じ設計図を使っていろいろなオブジェクトを作ることができます。これにより、コードを何度も書く必要がなくなります。
例えば、スマートフォンを例に考えてみましょう。まず、スマートフォンの設計図を作成します。
public class Smartphone { String os; String maker; String model; public Smartphone(String os, String maker, String model) { this.os = os; this.maker = maker; this.model = model; } public void makeCall(String number) { System.out.println("Calling " + number + "..."); } public void connectToInternet() { System.out.println("Connecting to the internet..."); } public void takePhoto() { System.out.println("Taking a photo..."); } }
この設計図を使って、具体的なスマートフォンを作ってみます。
public class Main { public static void main(String[] args) { Smartphone phone1 = new Smartphone("Android", "Google", "Pixel 5"); Smartphone phone2 = new Smartphone("iOS", "Apple", "iPhone 12"); phone1.makeCall("123-456-7890"); phone1.connectToInternet(); phone1.takePhoto(); phone2.makeCall("098-765-4321"); phone2.connectToInternet(); phone2.takePhoto(); } }
このコードを見ると、クラスとオブジェクトの利点がよくわかるはず。まず、同じスマートフォンの設計図(クラス)を使って、異なるスマートフォン(オブジェクト)を簡単に作ることができます。phone1
はGoogleのPixel 5、phone2
はAppleのiPhone 12です。
設計図を一度作れば、いろいろなスマートフォンを作るのにその設計図を使い回せるので、非常に便利です。
また、設計図に変更があった場合、一箇所を修正するだけですべてのオブジェクトにその変更が反映されます。例えば、スマートフォンに新しい機能を追加したいとき、クラスにその機能を追加するだけで、すべてのスマートフォンオブジェクトがその新しい機能を持つようになります。
さらに、クラスを使うことで、プログラムが整理されてわかりやすくなります。設計図に基づいてオブジェクトが作られるため、それぞれのオブジェクトがどのような特性を持ち、どのような動きをするかが一目瞭然です。
クラスとオブジェクトを使うことで、コードの再利用が可能になり、プログラムの保守が簡単になり、全体の構造が明確になるという大きな利点があります。これが、クラスとオブジェクトの大きなメリットです。
まとめ クラスとオブジェクトの利点
- 再利用性
- クラスを一度定義すれば、何度でもそのクラスを基にオブジェクトを作成できる。これにより、コードの再利用性が高まり、プログラムの開発効率が向上する。
- 保守性
- クラスを使ってプログラムを構成することで、変更が必要な場合でも特定のクラスのみを修正すれば済むため、保守が容易になる。
- データの一貫性
- クラスによってデータの構造が統一されるため、データの一貫性を保つことができる。