オブジェクト指向プログラミング入門
Javaプログラミングの核となる概念がオブジェクト指向です。このプログラミング手法では、データとその処理方法をオブジェクトという単位でまとめます。
例として、学生の名前、国語の点数、数学の点数を処理する場合を考えます。従来の手続き型プログラミングでは、各データを個別のパラメータとしてメソッドに渡す必要がありました。
// 従来のアプローチ
public double calculateTotal(String name, int japaneseScore, int mathScore) {
return japaneseScore + mathScore;
}
public double calculateAverage(String name, int japaneseScore, int mathScore) {
return (japaneseScore + mathScore) / 2.0;
}
オブジェクト指向では、これらのデータを一つのオブジェクトにまとめ、そのオブジェクト自身に処理を行わせます。
オブジェクト指向の理解
オブジェクト指向の利点
現実世界の事物をモデル化できるため、より直感的なプログラミングが可能になります。データとその処理方法が一つの単位にまとまることで、コードの保守性と再利用性が向上します。
プログラムにおけるオブジェクト
オブジェクトは特殊なデータ構造として理解できます。データテーブルのようなもので、そのテーブルに記録されたデータを処理する能力を持ちます。
オブジェクトの生成
オブジェクトはクラスという設計図から生成されます。クラスで定義された構造に基づいて、具体的なオブジェクトが作成されます。
// 学生クラスの定義
public class Student {
private String studentName;
private int japaneseMark;
private int mathMark;
// コンストラクタ
public Student(String name, int japanese, int math) {
this.studentName = name;
this.japaneseMark = japanese;
this.mathMark = math;
}
// メソッド
public int computeTotal() {
return japaneseMark + mathMark;
}
public double computeAverage() {
return computeTotal() / 2.0;
}
}
オブジェクトのメモリ管理
オブジェクトはヒープメモリ上に作成され、参照変数を通じてアクセスされます。
Student pupil = new Student("田中", 85, 92);
このコードの実行時:
- スタックメモリにpupil変数が作成される
- ヒープメモリにStudentオブジェクトが生成される
- オブジェクトのアドレスがpupil変数に格納される
クラスとオブジェクトの注意点
- 一つのファイルに複数のクラスを定義できるが、public修飾子を持つクラスは一つだけ
- publicクラスはファイル名と一致する必要がある
- 異なるオブジェクトは独立したデータを持つ
- 同一オブジェクトを参照する変数間ではデータ変更が共有される
thisキーワード
thisは現在のオブジェクトを参照する変数です。メソッド内で使用され、現在のオブジェクトのメンバ変数やメソッドにアクセスします。
public class Example {
private int value;
public void assignValue(int value) {
this.value = value; // メンバ変数にアクセス
}
}
コンストラクタ
コンストラクタはオブジェクト生成時に実行される特殊なメソッドです。
public class Product {
private String itemName;
private double cost;
// デフォルトコンストラクタ
public Product() {
this.itemName = "未設定";
this.cost = 0.0;
}
// パラメータ付きコンストラクタ
public Product(String name, double price) {
this.itemName = name;
this.cost = price;
}
}
コンストラクタの特徴:
- 戻り値型を持たない
- クラス名と同一名を持つ
- オブジェクト生成時に自動実行
カプセル化
カプセル化はオブジェクト指向の重要な原則で、データとその操作を一つの単位にまとめ、外部からの不適切なアクセスを制限します。
public class BankAccount {
private String accountNumber;
private double balance;
public BankAccount(String accNum, double initialBalance) {
this.accountNumber = accNum;
this.balance = initialBalance;
}
public void deposit(double amount) {
if(amount > 0) {
balance += amount;
}
}
public boolean withdraw(double amount) {
if(amount > 0 && amount <= balance) {
balance -= amount;
return true;
}
return false;
}
public double getBalance() {
return balance;
}
}
JavaBeanエンティティクラス
データ保持を専門とするクラスで、以下の特徴を持ちます:
public class Employee {
private int employeeId;
private String fullName;
private String department;
public Employee() {}
public Employee(int id, String name, String dept) {
this.employeeId = id;
this.fullName = name;
this.department = dept;
}
// ゲッターとセッター
public int getEmployeeId() { return employeeId; }
public void setEmployeeId(int id) { this.employeeId = id; }
public String getFullName() { return fullName; }
public void setFullName(String name) { this.fullName = name; }
public String getDepartment() { return department; }
public void setDepartment(String dept) { this.department = dept; }
}
実践例:書籍管理システム
書籍クラスの定義
public class Book {
private int bookId;
private String title;
private String author;
private double price;
private int stock;
public Book() {}
public Book(int id, String bookTitle, String writer, double cost, int quantity) {
this.bookId = id;
this.title = bookTitle;
this.author = writer;
this.price = cost;
this.stock = quantity;
}
// ゲッターとセッター
public int getBookId() { return bookId; }
public void setBookId(int id) { this.bookId = id; }
public String getTitle() { return title; }
public void setTitle(String bookTitle) { this.title = bookTitle; }
public String getAuthor() { return author; }
public void setAuthor(String writer) { this.author = writer; }
public double getPrice() { return price; }
public void setPrice(double cost) { this.price = cost; }
public int getStock() { return stock; }
public void setStock(int quantity) { this.stock = quantity; }
}
書籍操作クラス
public class BookManager {
private Book[] bookCollection;
public BookManager(Book[] books) {
this.bookCollection = books;
}
public void displayAllBooks() {
System.out.println("--- 書籍一覧 ---");
for(Book b : bookCollection) {
System.out.println("ID: " + b.getBookId());
System.out.println("タイトル: " + b.getTitle());
System.out.println("価格: " + b.getPrice());
System.out.println("在庫: " + b.getStock());
System.out.println("----------------");
}
}
public void findBookById(int id) {
for(Book b : bookCollection) {
if(b.getBookId() == id) {
System.out.println("書籍詳細:");
System.out.println("ID: " + b.getBookId());
System.out.println("タイトル: " + b.getTitle());
System.out.println("著者: " + b.getAuthor());
System.out.println("価格: " + b.getPrice());
System.out.println("在庫: " + b.getStock());
return;
}
}
System.out.println("該当する書籍が見つかりません");
}
}
テストクラス
import java.util.Scanner;
public class LibrarySystem {
public static void main(String[] args) {
Book[] books = new Book[3];
books[0] = new Book(1, "Javaプログラミング", "山田太郎", 3500, 10);
books[1] = new Book(2, "データ構造とアルゴリズム", "佐藤花子", 4200, 5);
books[2] = new Book(3, "オブジェクト指向設計", "鈴木一郎", 3800, 8);
BookManager manager = new BookManager(books);
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("=== 書籍管理システム ===");
System.out.println("1. 全書籍表示");
System.out.println("2. IDで検索");
System.out.println("操作を選択してください:");
int choice = input.nextInt();
switch(choice) {
case 1:
manager.displayAllBooks();
break;
case 2:
System.out.println("書籍IDを入力:");
int searchId = input.nextInt();
manager.findBookById(searchId);
break;
default:
System.out.println("無効な選択です");
}
}
}
}
メンバ変数とローカル変数の違い
| 特徴 | メンバ変数 | ローカル変数 |
|---|---|---|
| 宣言位置 | クラス内、メソッド外 | メソッド内またはブロック内 |
| 初期値 | デフォルト値あり | 明示的初期化が必要 |
| スコープ | クラス全体 | 宣言されたブロック内 |
| メモリ領域 | ヒープメモリ | スタックメモリ |
オブジェクト指向プログラミングの核心は、データとその処理方法をオブジェクトにカプセル化することです。適切に設計されたクラスとオブジェクトは、保守性の高い効率的なコードの基盤となります。