この記事では、Javaのオブジェクト指向の基本的な概念を理解できます。オブジェクト指向の基本原則、実際のプログラム例、そしてJava 14以降に導入された機能について学ぶことができます。特に、クラスの設計と使用方法、そしてレコードという新しい言語機能に焦点を当てています。
はじめに
この記事のコードをコピペしてEclipseで出力結果を確認してみよう!
オブジェクト指向の基本
オブジェクト指向プログラミングは、データとそれを操作するメソッドを一つの単位(オブジェクト)にまとめる考え方です。主要な概念は以下の通りです:
- クラスとオブジェクト: クラスはオブジェクトの設計図、オブジェクトはクラスの実体です。
- メソッド: オブジェクトの振る舞いを定義する関数です。
- フィールド: オブジェクトのデータを保持する変数です。
プログラム例(車クラス)
以下は、簡単な「車」クラスの例です:
Car.java
// Carクラスの定義
public class Car {
// フィールド(属性)
String brand; // 車のブランド
String color; // 車の色
// startメソッド:車を始動させる
public void start() {
System.out.println(color + " " + brand + " が始動しました。");
}
// stopメソッド:車を停止させる
public void stop() {
System.out.println(color + " " + brand + " が停止しました。");
}
}
Main.java
// Mainクラス
public class Main {
// mainメソッド:プログラムのエントリーポイント
public static void main(String[] args) {
// Carクラスのインスタンスを作成
Car myCar = new Car();
// フィールドに値を設定
// ドット記法を使って、オブジェクトのフィールドに直接アクセスし値を設定します
myCar.brand = "Toyota";
myCar.color = "赤";
// メソッドを呼び出す
myCar.start();
myCar.stop();
}
}
出力結果:
赤 Toyota が始動しました。
赤 Toyota が停止しました。
Car.javaの解説
クラス定義:
public class Car {
// ...
}
public
キーワードは、このクラスが他のクラスからアクセス可能であることを示します。class Car
は、Car
という名前のクラスを定義しています。- このクラスは車の概念をモデル化しています。
フィールド(属性):
String brand; // 車のブランド
String color; // 車の色
- これらはクラスのフィールド(インスタンス変数)です。
brand
とcolor
はそれぞれ車のブランドと色を表す文字列(String)型の変数です。- これらのフィールドは各
Car
オブジェクトの状態を保持します。
startメソッド:
public void start() {
System.out.println(color + " " + brand + " が始動しました。");
}
public
はこのメソッドが他のクラスからアクセス可能であることを示します。void
はこのメソッドが値を返さないことを示します。start()
メソッドは車の始動を表現しています。System.out.println()
を使用して、車の色とブランド、そして始動したことをコンソールに出力します。
stopメソッド:
public void stop() {
System.out.println(color + " " + brand + " が停止しました。");
}
- このメソッドも
start()
と同様の構造を持ちます。 stop()
メソッドは車の停止を表現しています。- 車の色とブランド、そして停止したことをコンソールに出力します。
重要なポイント:
- このクラスはカプセル化の原則を完全には守っていません。フィールドが
public
でないにもかかわらず、直接アクセス可能になっています。 - メソッドは車の行動を表現しており、これはオブジェクト指向プログラミングの基本原則に従っています。
- このクラスは再利用可能で、複数の車オブジェクトを作成するのに使用できます。
- フィールドとメソッドの組み合わせにより、データ(属性)と振る舞い(メソッド)が一つの単位にまとめられています。これはオブジェクト指向プログラミングの核心的な特徴です。
Main.javaの解説
クラス定義:
public class Main {
// ...
}
public class Main
はメインクラスを定義しています。- このクラスにはプログラムのエントリーポイントとなる
main
メソッドが含まれています。
mainメソッド:
public static void main(String[] args) {
// ...
}
public static void main(String[] args)
はJavaプログラムの標準的なエントリーポイントです[1]。public
: このメソッドが他のクラスからアクセス可能であることを示します。static
: このメソッドがクラスに属し、インスタンス化なしで呼び出せることを示します[3]。void
: このメソッドが値を返さないことを示します。String[] args
: コマンドライン引数を受け取るための配列パラメータです。
Carオブジェクトの作成:
Car myCar = new Car();
new Car()
でCar
クラスの新しいインスタンス(オブジェクト)を作成しています。myCar
は作成されたオブジェクトを参照する変数です。
フィールドの設定:
myCar.brand = "Toyota";
myCar.color = "赤";
- 作成した
Car
オブジェクトのフィールドに直接値を設定しています。 - これはカプセル化の原則に反するため、実際のプログラムではセッターメソッドを使用することが推奨されます。
メソッドの呼び出し:
myCar.start();
myCar.stop();
- 作成した
Car
オブジェクトのメソッドを呼び出しています。 - これらのメソッド呼び出しにより、コンソールに車の状態が出力されます。
重要なポイント:
main
メソッドはプログラムの実行開始点であり、JVMによって最初に呼び出されます。- このクラスは
Car
クラスのオブジェクトを作成し、操作するための制御クラスとして機能しています。 - オブジェクト指向プログラミングの基本原則である、オブジェクトの作成、属性の設定、メソッドの呼び出しが実践されています。
- このコードは
Car
クラスとMain
クラスの相互作用を示しており、オブジェクト指向プログラミングの基本的な構造を表現しています。
プログラム例(本クラス)
以下は、簡単な「本」クラスの例です:
Book.java
// Bookクラスの定義
public class Book {
// フィールド(属性)
// これらの変数は各Bookオブジェクトの特性を表します
String title; // 本のタイトル
String author; // 著者名
int pages; // ページ数
// メソッド
// このメソッドは本の情報を表示します
public void displayInfo() {
// System.out.printlnは、コンソールに文字列を出力するメソッドです
System.out.println("タイトル: " + title);
System.out.println("著者: " + author);
System.out.println("ページ数: " + pages);
}
}
Main.java
// Mainクラス
public class Main {
// mainメソッド:プログラムの実行開始点
public static void main(String[] args) {
// Bookクラスのインスタンス(オブジェクト)を作成
// newキーワードを使って新しいBookオブジェクトを生成し、myBook変数に代入します
Book myBook = new Book();
// フィールドに値を設定
// ドット記法を使って、オブジェクトのフィールドに直接アクセスし値を設定します
myBook.title = "Java入門";
myBook.author = "山田太郎";
myBook.pages = 300;
// メソッドを呼び出す
// displayInfo()メソッドを呼び出して、本の情報を表示します
myBook.displayInfo();
}
}
出力結果:
タイトル: Java入門
著者: 山田太郎
ページ数: 300
Book.javaの解説
クラス定義:
public class Book {
// ...
}
public class Book
はBook
という名前のクラスを定義しています。public
キーワードは、このクラスが他のクラスからアクセス可能であることを示します。- このクラスは本の概念をモデル化しています。
フィールド(属性):
String title; // 本のタイトル
String author; // 著者名
int pages; // ページ数
- これらはクラスのフィールド(インスタンス変数)です。
title
とauthor
は文字列(String)型で、それぞれ本のタイトルと著者名を表します。pages
は整数(int)型で、本のページ数を表します。- これらのフィールドは各
Book
オブジェクトの状態を保持します。
displayInfoメソッド:
public void displayInfo() {
System.out.println("タイトル: " + title);
System.out.println("著者: " + author);
System.out.println("ページ数: " + pages);
}
public
はこのメソッドが他のクラスからアクセス可能であることを示します。void
はこのメソッドが値を返さないことを示します。displayInfo()
メソッドは本の情報を表示する機能を提供します。System.out.println()
を使用して、本のタイトル、著者、ページ数をコンソールに出力します。
重要なポイント:
- このクラスはカプセル化の原則を完全には守っていません。フィールドが
public
でないにもかかわらず、直接アクセス可能になっています。 - メソッドは本の情報を表示する行動を表現しており、これはオブジェクト指向プログラミングの基本原則に従っています。
- このクラスは再利用可能で、複数の本オブジェクトを作成するのに使用できます。
- フィールドとメソッドの組み合わせにより、データ(属性)と振る舞い(メソッド)が一つの単位にまとめられています。これはオブジェクト指向プログラミングの核心的な特徴です。
このクラス設計により、本の情報を効率的に管理し、必要に応じて表示することができます。ただし、より堅牢なプログラムにするためには、フィールドをprivateにし、ゲッターとセッターメソッドを追加することが推奨されます。
Main.javaの解説
クラス定義:
public class Main {
// ...
}
public class Main
はメインクラスを定義しています。- このクラスにはプログラムのエントリーポイントとなる
main
メソッドが含まれています。
mainメソッド:
public static void main(String[] args) {
// ...
}
public static void main(String[] args)
はJavaプログラムの標準的なエントリーポイントです。public
: このメソッドが他のクラスからアクセス可能であることを示します。static
: このメソッドがクラスに属し、インスタンス化なしで呼び出せることを示します。void
: このメソッドが値を返さないことを示します。String[] args
: コマンドライン引数を受け取るための配列パラメータです。
Bookオブジェクトの作成:
Book myBook = new Book();
new Book()
でBook
クラスの新しいインスタンス(オブジェクト)を作成しています。myBook
は作成されたオブジェクトを参照する変数です。
フィールドの設定:
myBook.title = "Java入門";
myBook.author = "山田太郎";
myBook.pages = 300;
- 作成した
Book
オブジェクトのフィールドに直接値を設定しています。 - ドット記法を使用して、オブジェクトのフィールドにアクセスしています。
- これはカプセル化の原則に反するため、実際のプログラムではセッターメソッドを使用することが推奨されます。
メソッドの呼び出し:
myBook.displayInfo();
- 作成した
Book
オブジェクトのdisplayInfo()
メソッドを呼び出しています。 - このメソッド呼び出しにより、コンソールに本の情報が出力されます。
重要なポイント:
main
メソッドはプログラムの実行開始点であり、JVMによって最初に呼び出されます。- このクラスは
Book
クラスのオブジェクトを作成し、操作するための制御クラスとして機能しています。 - オブジェクト指向プログラミングの基本原則である、オブジェクトの作成、属性の設定、メソッドの呼び出しが実践されています。
- このコードは
Book
クラスとMain
クラスの相互作用を示しており、オブジェクト指向プログラミングの基本的な構造を表現しています。
このMainクラスは、Bookクラスの使用方法を示す良い例となっています。ただし、より良いプログラム設計のためには、フィールドへの直接アクセスを避け、適切なメソッドを通じてオブジェクトを操作することが推奨されます。
Java 14以降の便利な機能
Java 14以降、複数クラスを用いた開発に役立つ新機能がいくつか導入されました。その中でも特に有用なのは以下の機能です:
レコード(Java 14から、Java 16で正式導入)
レコードは、データを保持するだけの簡潔なクラスを定義するための機能です。
- Person.java
public record Person(String name, int age) {}
- Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 30
System.out.println(person); // Person[name=Alice, age=30]
}
}
出力結果:
Alice
30
Person[name=Alice, age=30]
解説:
- レコードは自動的に
equals()
,hashCode()
,toString()
メソッドを生成します。 - getterメソッドが自動的に生成されるため、ボイラープレートコードが大幅に削減されます。
- 不変オブジェクトを簡単に作成できるため、複数クラスを用いた開発でデータ転送オブジェクト(DTO)として特に有用です。
この新機能により、複数クラスを用いた開発がより簡潔で効率的になります。
Person.java
public record Person(String name, int age) {}
- これは
record
という Java の新しい機能を使用しています。 record
は、データを保持するためのシンプルなクラスを作成する簡潔な方法です。- この
Person
レコードは、name
(文字列)とage
(整数)という2つのフィールドを持ちます。 - レコードは自動的にコンストラクタ、getter メソッド、
equals()
,hashCode()
,toString()
メソッドを生成します。
Main.java
public class Main {
public static void main(String[] args) {
// メソッドの中身
}
}
- これは メインクラス と
main
メソッド を定義しています。 main
メソッドは、プログラムの 実行開始点 です。
Person オブジェクトの作成
Person person = new Person("Alice", 30);
- この行は 新しい
Person
オブジェクトを作成 しています。 new
キーワードを使用して、Person
レコードのインスタンスを生成しています。- “Alice” という名前と 30 という年齢を指定しています。
フィールドへのアクセス
System.out.println(person.name()); // Alice
System.out.println(person.age()); // 30
person.name()
は、Person
オブジェクトのname
フィールドにアクセスしています。person.age()
は、Person
オブジェクトのage
フィールドにアクセスしています。- レコードは自動的に getter メソッド を生成するため、これらのメソッドを使ってフィールドの値を取得できます。
オブジェクトの文字列表現
System.out.println(person); // Person[name=Alice, age=30]
- この行は
Person
オブジェクトの 文字列表現 を出力します。 - レコードは自動的に
toString()
メソッド を生成するため、オブジェクトをそのまま出力すると、フィールドの値を含む文字列が表示されます。
重要なポイント:
record
は、データを保持するための簡潔なクラスを定義する新しい Java の機能です。- レコードは 自動的に多くのボイラープレートコードを生成 するため、コードの量を減らすことができます。
- レコードのフィールドは
final
(変更不可)であり、イミュータブル(不変)なオブジェクトを作成するのに適しています。 - レコードを使用すると、データクラスを簡単に作成でき、getter メソッドや
toString()
メソッドを自動的に利用できます。
このコードは、Java の record
機能を使用して簡潔なデータクラスを定義し、それを使用する方法を示しています。これにより、データを保持するクラスを効率的に作成し、使用することができます。
まとめ
- オブジェクト指向プログラミングの基本概念(クラス、オブジェクト、メソッド、フィールド)
- 実際のプログラム例(車クラスと本クラス)を通じて、クラスの設計と使用方法
Car.java
とMain.java
の解説により、クラスの定義と使用の関係Book.java
とMain.java
の例で、異なるタイプのオブジェクトの作成と操作方法- Java 14以降に導入されたレコードという機能について
Javaプログラミングにおいて、オブジェクト指向の原則を理解し適用することは非常に重要です。この内容を通じて、基本的なクラス設計の知識を得ることができます。特に、レコードの導入はコードの簡潔性と可読性を向上させることができます。
コメント