Javaを学び始めた方は、「変数の型にクラスを使う」という表現に戸惑うことがあるかもしれません。この概念を理解することは、Javaのオブジェクト指向プログラミングをマスターする上で非常に重要です。
一方で多くの初心者にとって少し理解しづらい部分なので、当サイトにも多くの質問が寄せられましたので、個別に記事化しました。
本記事では、このテーマを初心者の方にもわかりやすく、丁寧に深掘りして解説します。
関連 Javaの変数の基本 / Javaのクラスの基本
【前提】変数とデータ型の基本
変数とは?
変数とは、プログラム内でデータを一時的に保存するための名前付きの領域です。変数を使うことで、データを後から参照したり、操作したりすることができます。
int number = 10; // 'number'は整数値10を保持する変数
上記の例では、number
という名前の変数に整数値10
を格納しています。
データ型とは?
データ型は、変数が保持できるデータの種類と、そのデータに対して可能な操作を定義します。Javaでは、変数を宣言する際に必ずデータ型を指定します。
double price = 199.99; // 'price'は小数点を含む数値を保持する変数
ここで、double
がデータ型で、price
が変数名です。
【前提】プリミティブ型と参照型の違い
Javaのデータ型は大きく分けてプリミティブ型と参照型の2つがあります。
プリミティブ型
- 特徴:基本的な値を直接保持します。
- 種類:
- 数値型:
byte
,short
,int
,long
,float
,double
- 文字型:
char
- 論理型:
boolean
- 数値型:
int age = 30; boolean isStudent = false;
これらの変数は実際の値を直接メモリ上に保持します。
参照型
- 特徴:オブジェクトのアドレス(参照)を保持します。
- 種類:
- クラス(
String
,Scanner
など) - 配列
- インターフェース
- 列挙型
- 自作のクラス
- クラス(
String name = "山田太郎"; int[] scores = {90, 85, 78};
これらの変数は、実際のデータが存在する場所(メモリ上のアドレス)を指しています。
「参照型」についてより詳細に学習したい方は以下のページをご覧ください。
クラスをデータ型として使う理由
オブジェクト指向プログラミングとは
Javaはオブジェクト指向プログラミング(OOP)の言語です。OOPでは、データとそれに関連する操作をひとまとめにしたオブジェクトを使ってプログラムを構築します。
クラスとオブジェクトの関係
- クラス:オブジェクトの設計図。属性(フィールド)と動作(メソッド)を定義します。
- オブジェクト:クラスから生成された実体。実際に操作やデータの保持を行います。
なぜクラスをデータ型として使うのか
クラスをデータ型として使うことで、そのクラスが持つ属性や動作を備えたオブジェクトを変数に格納できます。これにより、複雑なデータ構造や機能を簡潔に扱うことができます。
Date currentDate = new Date();
ここでは、Date
クラスをデータ型として使い、currentDate
という変数に現在の日付を表すオブジェクトを格納しています。
オブジェクトの生成とメモリ構造
オブジェクトの生成方法
オブジェクトは通常、new
キーワードを使って生成します。
Person person = new Person();
ここで、
Person
:クラス名(データ型)person
:変数名new Person()
:Person
クラスの新しいオブジェクトを生成
メモリ上の動き
- ヒープ領域:
new
で生成されたオブジェクトが格納される領域。 - スタック領域:メソッド内で宣言された変数や、プリミティブ型の値が格納される領域。
変数person
は、ヒープ領域にあるPerson
オブジェクトへの参照をスタック領域に保持しています。
自作クラスを変数の型として使う方法
クラスの定義
自分でクラスを定義することで、そのクラスをデータ型として使用できます。
public class Person { String name; int age; void introduce() { System.out.println("私は" + name + "、" + age + "歳です。"); } }
クラスをデータ型として使う
Person person = new Person(); person.name = "佐藤"; person.age = 28; person.introduce(); // 出力: 私は佐藤、28歳です。
ここでは、Person
クラスをデータ型として使い、person
という変数にPerson
オブジェクトを格納しています。
既存のクラスを変数の型として使う方法
Javaにはあらかじめ多くのクラスが用意されており、それらをデータ型として使用できます。
例:Stringクラス
String greeting = "こんにちは"; System.out.println(greeting); // 出力: こんにちは
String
クラスをデータ型として使い、文字列を扱います。
例:ArrayListクラス
ArrayList<String> list = new ArrayList<>(); list.add("りんご"); list.add("みかん");
ArrayList
クラスをデータ型として使い、可変長の配列を扱います。
実際のコード例
例1:自作クラスでのオブジェクト操作
public class Book { String title; String author; void displayInfo() { System.out.println("タイトル: " + title + ", 著者: " + author); } } // メインメソッド内 Book book1 = new Book(); book1.title = "吾輩は猫である"; book1.author = "夏目漱石"; book1.displayInfo(); // 出力: タイトル: 吾輩は猫である, 著者: 夏目漱石
- ポイント:
Book
クラスをデータ型として使用。book1
変数にBook
オブジェクトを格納。- オブジェクトのフィールドとメソッドを操作。
例2:参照型の挙動を理解する
Person personA = new Person(); personA.name = "田中"; Person personB = personA; personB.name = "鈴木"; System.out.println(personA.name); // 出力: 鈴木
- 解説:
personA
とpersonB
は同じオブジェクトを参照している。personB.name
を変更すると、personA.name
も変更される。
例3:プリミティブ型との違い
int numA = 10; int numB = numA; numB = 20; System.out.println(numA); // 出力: 10
- 解説:
- プリミティブ型の場合、値そのものがコピーされる。
numB
を変更しても、numA
には影響しない。
8. まとめ
「変数の型にクラスを使う」とは、クラス名をデータ型として指定し、そのクラスのオブジェクトを変数に格納することです。これにより、オブジェクトの持つ属性や動作を変数を通じて操作できます。
- プリミティブ型は値そのものを保持するのに対し、参照型はオブジェクトへの参照(アドレス)を保持します。
- クラスをデータ型として使うことで、オブジェクト指向の利点である再利用性や拡張性を活かしたプログラミングが可能になります。
- 自作クラスや既存のクラスを使って、複雑なデータや機能を扱うことができます。
Javaのオブジェクト指向プログラミングは、最初は難しく感じるかもしれませんが、クラスとオブジェクトの関係や参照型の挙動を理解することで、より高度なプログラムを作成できるようになります。ぜひ、自分でもクラスを定義して、変数の型として活用してみてください。