前回はオブジェクト指向とは何かについて書きました。
今回はクラスの役割と機能、そしてこれを用いる利点をを紹介します。
クラスとオブジェクト
Javaでオブジェクトを利用するために作らなければいけないものが「クラス」です。
まずクラスは、おおまかに言ってデータ型です。
intとかcharと同じように扱うことができます。
例えばString型はクラスです。
変数の型として宣言して使うことができる、ということは経験済みでしょう。
では、クラスは普通のデータ型と比べどのような違いがあるのでしょうか?
いくつかありますが、例えば以下のようなものがあります。
- 自分で作成する事ができる
- 自分で内容を記述できる
- フィールドやメソッドを持たせることができる
- 既存のものを利用して、機能を拡張することができる
クラスは自分で定義できます。
一般のデータ型よりも多くの機能を持たせることができるのです。
フィールドやメソッドが何か、という細かい説明については別途解説としますが、単純な基本データ型では不可能な複雑なデータも表すことができます。
そして、一度作ったものを改造することもできます。
まずはクラスを「型」ととらえて問題ないことを認識しましょう。
逆に今まで利用してきたデータ型は、クラスの中でも機能を限定して簡単に使えるようにしたものと考えられます。
クラスは型ですから、それだけでは何もできません。
変数を宣言しないとまったく使うことができないのです。
クラスのデータとして宣言された変数がオブジェクトです。
実はプログラム中の部品として働くのはこのオブジェクトで、クラスはあくまでもそれを作るための型紙に過ぎません。
つまり一度クラスを作ってしまえば、あとは普通の変数と同じようにオブジェクトを複数宣言できる、同じ機能を持つ部品をたくさん作ることができるのです。
インスタンスの生成
オブジェクトの利用方法を見てみましょう。
これはJava特有の仕様ですが、一般の変数と違いオブジェクトは宣言しただけでは使用できません。
基本データ型の変数は自動変数とも呼ばれ、宣言しただけで自動的にデータを保存するための場所がメモリに確保されます。
それに対してオブジェクトは宣言しただけではメモリが確保されません。
宣言したときに生成される変数は参照値といって、「実際のオブジェクトのデータがどこにあるか」という情報を格納します。
では、オブジェクトのデータを保存するためのメモリ上の領域はいつ作られるのでしょうか?
これのことを「インスタンス」と呼びますが、明示的にメモリを確保することを指定しなければいけません。
そのために用いられるのがnewキーワードです。
このキーワードは指定したクラスのインスタンスを作成し、その分のメモリ領域を確保します。
メモリ管理とガベージコレクション
変数を扱うときには、そのデータを入れるための領域がメモリ上に確保されます。
その変数が不要になったらデータは消えてしまってかまいません。
むしろ残っていては邪魔です。
使わなくなったデータがメモリの中に残っているのはスペースの無駄なので、その領域を解放しなければなりません。
自動変数はその名の通り自動でメモリを確保しますが、メモリの解放も自動で行います。
ではインスタンスはどうでしょうか。
new演算子を用いて確保した領域は、JavaVMが自動的に解放してくれます。
この機能を「ガベージコレクション」(Garbage Collection : GCと略します)といい、Javaを使うメリットの1つになっています。
他の言語、例えばC++言語では同じようにnewを用いてメモリを確保しますが、newで確保したメモリは自動的には解放されません。
deleteというキーワードでプログラマが明示的に解放します。
解放しなければ確保されたままです。
そうすると利用しないデータがメモリの中に残され、メモリ上のスペースがどんどん少なくなっていく問題が発生します。
これを「メモリリーク」と呼び、アプリケーション開発においてかなり気を使わなければいけない場面です。
メモリリークが発生するとプログラムの動作が遅くなったり、最悪の場合、パソコンが止まったりなどの問題に繋がります。
newしたならば必ずdeleteを行えばいいだけ、と言えば簡単そうですがアプリケーションが大規模化するとなかなか大変です。
これらのnewやdeleteの作業をメモリ管理と言いますが、これは最もバグの生じやすく大変な部分です。
一方JavaではGCがあるため、メモリ管理自体が不要です。
その分の労力や品質においてアドバンテージがあるのです。
GCはJavaVMが自動で起動します。
これがいつ行われるかはJavaVM次第のため、プログラマがコントロールすることはできません。
明示的にGCを起動したい場合はソースコードにSystem.gc( )あるいはRuntime.getRuntime( ).gc( )と記述することによってJavaVMに依頼することができます。
しかしこれはやはり依頼できるだけで、アプリケーションには実行する権限がありません。
つまりGCは適当なときに起動されます。
そして、その時点で使用されていないメモリを解放するのです。
Javaのインスタンスはnew演算子を用いてメモリ上に生成(インスタンス化と言います)しなければ使用できません。
例外として配列と、Stringクラスのインスタンスはnewを書かない方法がありますが、あくまで特別な書き方です。
String s = new String( ); String greeting = “こんにちは”; //特別な書き方! int a[ ] = new int[3]; int b[ ] = {1, 2, 3} //特別な書き方!
クラスの使用例
実際にクラスを使用してみましょう。
Javaでは、すでにいろいろなクラスが用意されており、プログラマは自由に利用できます。
これをライブラリと呼びます。
様々なクラスがファイルに格納されているだけなので誰でも利用することができます。
自分でクラスを作る事も出来ます。
文字列を表すStringクラスは文字列を操作するためのさまざまな機能が用意されています。
このプログラムで使用されているものはごく一部です。
オブジェクトの持つ機能を使用するには.(ピリオド)の記号で指定します。
【クラスの使い方2】
public class StringSample{ public static void main(String[ ] args){ String str1 = "hello"; //そのまま表示してみる System.out.println(str1); //文字列を大文字に変換する機能 String str2 = str1.toUpperCase( ); System.out.println(str2); //文字列の中の'l'の文字をすべて'x'に変換する機能 String str3 = str1.replace('l', 'x'); System.out.println(str3); //文字列の長さを調べる機能 int size = str1.length( ); System.out.println("文字列の長さは" + size + "です"); } }
実行結果
hello HELLO hexxo 文字列の長さは5です
まとめ
- オブジェクト指向とは何か
プログラムのデータと処理をひとまとめにしてオブジェクトとして扱うことです。
Javaはオブジェクト指向プログラミング言語です。
- クラスとオブジェクト
クラスはデータ型、オブジェクトは変数、インスタンスはデータにあたります。
- インスタンスの生成
オブジェクトは宣言し、newによってインスタンス化することによって利用ですることができます。
また、生成したインスタンスはGCが自動的に消去するので使いっぱなしで良いです。
- クラスの使用例
Javaにはクラスライブラリと呼ばれる、最初から用意されているクラスが多くあります。
独学で挫折しそうになったら、オンラインプログラミングスクール