オブジェクト指向(Java基礎)
基本データ型
Javaで定義されている8種類のデータ型は以下である.C言語と同じ型もあるが,C言語にはなかった型,C言語にもあるが内容が異なる型もあるので,注意が必要である.
型名 | ビット数 | 意味 | 範囲または取り得る値 |
---|---|---|---|
boolean | 1 | 真偽値 | 「false」または「true」 |
char | 16 | Unicode文字 | \u0000〜\uFFFF |
byte | 8 | 符号つき整数 | -128〜127 |
short | 16 | 符号つき整数 | -32768〜32767 |
int | 32 | 符号つき整数 | -2147483648〜147483647 |
long | 64 | 符号つき整数 | -9223372036854775808〜9223372036854775807 |
float | 32 | 浮動小数点数 | ±3.40282347E+38 〜±1.40239846E-45 |
double | 64 | 浮動小数点数 | ±1.79769313486231570E+308 〜 ±4.94065645841246544E-324 |
boolean
C言語では,true,falseの2値で十分なときでも,byte型やint型の領域を確保して0と1の値を保存していたことがあるだろう.Javaでは,2値の場合は1bitで十分であるときに適切な型として確保することができる.
char
C言語では,charとして8bit・1byteとしていた.文字を扱うかどうかにかかわらず,1byteが欲しいときにも用いていたことがあるかもしれない.Javaでは,文字を扱うために,UTF-16の文字コードを用いて表わされる型として定義されている.C言語だと,EUCだったり,Shift-JISだったり,システムによって異なる文字コードが用いられているが,Javaでは明確に決められている.
参照型
C言語では,データを関数に渡すときに,そのまま渡すとコピーが関数に渡される.ポインタを渡すと,ポインタが指す値を参照して,値を読んだり,値を書き替えたりできる.この「ポインタが指す値を参照」の「参照」を意味している型が,この「参照型」である.
では,参照型であるものは具体的にどのようなものなのか.それは,クラスで定義されているものである.身近な例では,配列がそうである.Javaの配列は,単なるメモリの連続ではなく,連続した値を格納できるオブジェクトとして定義されている.ただ,C言語と同じように使えるように,簡略した定義が許されているので,クラスであると感じないかもしれない.
まだ,クラスもオブジェクトも学んでいない状態であるので,非常に心苦しいが,ここで覚えてほしいことは,Javaで定義したサブルーチン(関数)に値を渡す時に,基本データ型の場合には,値がコピーして渡されて,それ以外の時には,値に参照できるように渡されることである.
配列
同じ型のデータ領域を複数個,連続で確保したい時には,配列にて確保することができる.配列は,C言語と同じ方法で確保することもできるが,オブジェクト指向言語であることから,オブジェクトを生成する手順に従った方法で確保することもある.オブジェクト指向特有の方法の意味については,もう少し進んでから理解することにして,現時点では,「このような命令・方法で配列を確保できる」という程度でとどめておくことにする.
配列の便利な使い方
配列の要素数(確保されている個数)について,C言語では,言語仕様として管理していないので,自分で配列の個数を変数で覚えておくなどの工夫をしていたのではないだろうか.他方,Javaでは,オブジェクトとして確保されていることもあり,領域が明確に定義されている.個数は,オブジェクトの要素として,記憶されている.
int box[] = {10,20,30,40,50}; //box.length は配列の要素数「5」を意味する
class HelloWorld { public static void main(String args[]) { int box[] = {10,20,30,40,50}; } }
class HelloWorld { public static void main(String args[]) { int box[] = new int[5]; box[1] = 2; System.out.print(“長さは" + box.length); } }
演算子
演算子においても,C言語とほぼ同じである.ビット演算子で,より便利になっているが,これらの機能を利用するときに確認して使用してほしい.
制御文
繰り返し
forやwhileを使って繰り返しを定義できる.使い方や定義は,C言語と同じである. ただし,この例で用いている,繰り返しのための「i」については,for文内で,整数型iを定義して用いている.この変数iは,for文内でのみ使うことができる.このような方法を,C言語上でも定義して用いていた経験がある人もいるかもしれない.それは,C++での方法である.
for( int i = 0; i < 10; i++) { 繰り返す操作 }
while( i < 10) { 繰り返す操作 i++; }
do { 繰り返す操作; }while(i < 10)
条件分岐
条件分岐は,ある条件の確認がtrueかfalseかによって,実行する内容を切り替えることができる. ifでは,確認したい条件がtrueかfalseかによって,切り替える.C言語では0を偽として,それ以外を真として判断するように考えていただろう.その感覚であると戸惑うかもしれないが,何を真・偽とするかについては,true,falseの方がより明確になる.
switchでは,型がある程度整理された条件群であるときに,列挙して条件を分岐できるので,便利だろう.1つの条件に当てはまった時に,breakを宣言しないと,他の条件に当てはまるときに実行するステートメントも実行されるので,それが意図した動作かどうか,確認する必要がある.ただし,この動作も,C言語におけるswitch文の使い方と同様であるので,特別な動作ではないだろう.
if(i == 1) { //i=1の時に実行 } else if(i == 2) { //i==2の時に実行 } else { //上記の条件以外 //のときに実行 }
switch(label) { case 1: //labelが1の時に実行 break; case 2: //labelが2の時に実行 break; default: //指定条件以外に実行 break }
制御
制御文として,break,continueにて,ループを制御することができる. 以下の例にて,break,continueがあるときと,ない時の挙動を確認してほしい.//breakもcontinueもないとき. int sum = 0; for(int i=1; i<=10;i++) { sum += i; System.out.println( i+ "までの合計:" + sum); } //breakのとき, sum = 0; for(int i=1; i<=10;i++) { if(i%2 == 0) { //偶数になった時にループを抜ける break; } sum += i; System.out.println( i+ "までの合計:" + sum); } //breakの代わりにcontinueを置いたとき. sum = 0; for(int i=1; i<=10;i++) { if(i%2 == 0) { //偶数になった時に次のループを続ける continue; } sum += i; System.out.println( i+ "までの合計:" + sum); }
1までの合計:1 2までの合計:3 3までの合計:6 4までの合計:10 5までの合計:15 6までの合計:21 7までの合計:28 8までの合計:36 9までの合計:45 10までの合計:55 1までの合計:1 1までの合計:1 3までの合計:4 5までの合計:9 7までの合計:16 9までの合計:25
サブルーチン
サブルーチンは,一定の処理のまとまりを関数の形でまとめることができる.関数に値を渡して,実行結果を受け取ることができる.オブジェクト指向のクラスの考え方では,単なる処理のまとめるだけでなく,「メソッド」としてデータを操作する役割として位置づけられる.このことについては,オブジェクトを意識したときに説明するので,今は,C言語と同じように,関数が定義できるという点をおさえておこう.