導入
今回から数回に渡ってオブジェクト指向について学習します。今回はクラスが何者で、
展開
クラスとは
クラスとは、
ずいぶん思い切った定義・
クラスを使ったばっかりに脂汗が出るようならば、
私はこの認識がとても大切だと思っています。
多くの場合、
クラスを使うメリット
では、
- 既に便利な部品・
仕組みがたくさんあるので、 自分で新しく作らなくて済む。 - 便利な部品・
仕組みを後付けしやすいので、 必要に応じた最低限のコード追加で済む。 - 段取りと後始末を自動で行わせられるので、
うっかりミスを防げる。 - バラバラだった、
あるいはゆるやかだった 「コードのまとまり」 を明確にできる。 - 必要なコードを見て、
不必要なコードを見ないようにできるため、 コードが大きくなっても途方に暮れることを防げる。 - デザインパターンやリファクタリングを学べば、
プログラマ同士の意思共通理解手段を得られる。
挙げればまだたくさんあるのですが、
まず今回と次回は特殊な場合から紹介します。特殊から一般へ。入門書や文法書では逆の道を辿るのが正統でしょうが、
数学関数の充実したMathクラス
Math
クラスはとても便利です。ProcessingやJava言語を使ったことがあれば、
MathClassSample.pde
println("便利なMathクラス (期待される値) = 得られた値");
println("PI ( = 3.14...) = " + Math.PI);
println("3^2 ( = 9 ) = " + Math.pow(3,2));
println("-2の絶対値 ( = 2 ) = " + Math.abs(-2));
println("Pi[rad] -> [deg] ( = 180[deg] ) = " + Math.toDegrees(Math.PI));
println("sin(30[deg]) ( = 0.5 ) = " + Math.sin(Math.toRadians(30)));
println("IEEEに従った7/4の剰余( = -1 ) = " + Math.IEEEremainder(7.0,4.0));
Math
クラスについてはJava言語のドキュメントを参照してください。Math
クラスにどんなメソッドやフィールドがあるかを知っておくことは必要ですし、
例えばMath
クラスのほとんどのメソッドの引数や戻り値はdouble
型です。実数を取り扱う場合、float
型の方が良い理由があれば別ですが、float
型は基本的に使うべきではありません。float
型は有効桁数が少ないので、
もっと表面的なところでは、PI
)IEEEremainder
)
スタティック
さて、Math
がクラスであることとや、Math
クラスの使われたsketchを読んで
TypeInt.pde
クラスは使用する際に演算子`new`によってインスタンスを生成します。
この一文の理解に苦しむ人は、Math
クラスのすべてのフィールドやメソッドは、new
によってMath
クラスのインスタンスを生成せずに使えます。このようなフィールドやメソッドのことをスタティックフィールド、new
して新しいインスタンスを生成して使うのは面倒です。ちょっと使うだけのインスタンスの名前を考えるのは無駄な仕事であり、Integer
クラスはインスタンスを生成して使うことができますが、Math
クラスのように使えます。適宜使い分けて楽をしましょう。
基本データ型のラッパークラス
基本データ型とは、int
型やfloat
型といった、
単純で分かりやすい例はInteger
クラスです。Integer
クラスは整数を取り扱うために用意された既存のクラスです。入門書ではあまり紹介されることが無いでしょう。基本データ型であるint
型にはない便利な機能をたくさん持っています。
「int
型の変数で取り扱える値の範囲はどれだけだったっけ?」
基本データ型であるint
型は単純に数値を代入したり、int
型の変数で取り扱える値の範囲はどれだけだったっけ?」
おもむろに書籍やWEBで調べればすぐに分かることですか? int
型の変数のビット長が32ビットの符号つき整数で-2147483648~2147483647ですね。これを自分のコードの中に打ち込めば、
例えばこんなコードです。
final int MIN = -2147483648;
final int MAX = 2147483647;
long val1 = 123;
long val2 = -2147483649L;
if ( MAX < val1 ) {
println(val1 + "は、int型には大きすぎる値です。");
} else {
println(val1 + "は、int型で取り扱えます。");
}
if ( val2 < MIN ) {
println(val2 + "は、int型には小さすぎる値です。");
} else {
println(val2 + "は、int型で取り扱えます。");
}
きちんと調べて打ち込んで、MIN
やMAX
の値を変更してしまうリスクがあります。そもそも、
こんなとき、Integer
クラスを使っていると便利です。
UsingClassInteger.pde
long val1 = 123;
long val2 = -2147483649L;
println("Integerクラスで取り扱える最大値は" + Integer.MAX_VALUE);
println("Integerクラスで取り扱える最小値は" + Integer.MIN_VALUE);
if ( Integer.MAX_VALUE < val1 ) {
println(val1 + "は、Integerクラスには大きすぎる値です。");
} else {
println(val1 + "は、Integerクラスで取り扱えます。");
}
if ( val2 < Integer.MIN_VALUE ) {
println(val2 + "は、Integerクラスには小さすぎる値です。");
} else {
println(val2 + "は、Integerクラスで取り扱えます。");
}
たったこれだけのことですが、int
型を使わずInteger
クラスを使うのは、
「整数を2進数表示したいんだけど?」
整数を2進数表示することも学生ならば一度は経験した苦行では無いでしょうか? 桁が小さいうちは良いのですが、
IntToBinary.pde
void setup(){
int a = 21;
Integer b = 85;
println("<<Reinventing the Wheel>>");
showBinary(a);
showBinary(b);
showBinary(0);
}
void showBinary(int v){
if ( v == 0) {
println(v + " = (0)B");
} else if ( 0 < v ){
print(v + " = (");
while( 1 <= v ){
print(v%2);
v /= 2;
}
println(")B");
} else {
println("Error!");
}
}
これは、Integer
クラスを使うとこれだけで済んでしまいます。
IntegerToBinary.pde
void setup(){
int a = 21;
Integer b = 85;
Integer c = -5;
println("<<Existing Wheel>>");
showBinary(a);
showBinary(b);
showBinary(c);
showBinary(0);
}
void showBinary(Integer v){
println(v + " = ("+Integer.toBinaryString(v) + ")B");
}
そもそもコンピュータは、
既存のクラスを積極的に使って楽をしよう
Math
クラスはどの入門書でも必ず紹介される便利なクラスです。これがクラスとして提供されていることは興味深いことです。やがて必要なクラスを自分で作ることを学びますが、Math
クラスの出力に細工をした新しいクラスを作りたい場合、Math
クラスをラップしたクラスを考えても良いのです。クラス、
演習
演習1 (難易度: easy)
二次方程式の解の公式を使って次の方程式を解くsketchを作りましょう。Math
クラスを上手に使ってください。sketch名はQuadraticFormula.
としてください。
x^2 + 2x + 1 = 0
演習2(難易度:middle)
IntToBinary.
のshowBinary
メソッドに負の値を与えると、IntegerToBinary.
と同じ結果が得られるようにIntToBinary.
を変更しましょう。変換の処理にはInteger
クラスを使わないでください。実行結果の確認のために使うのは良しとします。sketchの名称はIntToBinary2.
としてください。
まとめ
- クラスを使うとプログラミングが楽になることを学習しました。
- スタティックフィールドとスタティックメソッドについて学習しました。
Math
クラスとInteger
クラスを例に挙げました。
学習の確認
それぞれの項目で、
- クラスを使うと楽になる意味が理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
- スタティッククラスやスタティックメソッドを使うとプログラミングが楽になる意味が理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
参考文献
- 『本格学習Java入門
[改訂新版]』(佐々木整 著、 技術評論社) - Java言語の基本的な文法が良くまとめられています。また、
大変広い範囲をカバーしているので、 はじめてJava言語に触る人が、 Javaがどんな言語なのかを知るために役立つ資料になるでしょう。
- Java言語の基本的な文法が良くまとめられています。また、
- 『Javaで学ぶコンピュータ数学』
(平田敦 著、 カットシステム) - 高校生から学べるコンピュータ数学のテキストです。P.
23から 「実数型のしくみ」 としてコンピュータ特有の問題をまとめています。
- 高校生から学べるコンピュータ数学のテキストです。P.