導入
今回から数回に渡ってオブジェクト指向について学習します。今回はクラスが何者で、
展開
クラスとは
クラスとは、
ずいぶん思い切った定義・
クラスを使ったばっかりに脂汗が出るようならば、
私はこの認識がとても大切だと思っています。
多くの場合、
クラスを使うメリット
では、
- 既に便利な部品・
仕組みがたくさんあるので、 自分で新しく作らなくて済む。 - 便利な部品・
仕組みを後付けしやすいので、 必要に応じた最低限のコード追加で済む。 - 段取りと後始末を自動で行わせられるので、
うっかりミスを防げる。 - バラバラだった、
あるいはゆるやかだった 「コードのまとまり」 を明確にできる。 - 必要なコードを見て、
不必要なコードを見ないようにできるため、 コードが大きくなっても途方に暮れることを防げる。 - デザインパターンやリファクタリングを学べば、
プログラマ同士の意思共通理解手段を得られる。
挙げればまだたくさんあるのですが、
まず今回と次回は特殊な場合から紹介します。特殊から一般へ。入門書や文法書では逆の道を辿るのが正統でしょうが、
数学関数の充実した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.
