Step 5: きまりごと(演算子・配列)

前回の続きだよ。まだまだ、退屈な話。
ところで、楽しい話ってあるの?(いつも通りこの色は美樹ちゃん)
むっ! (#-_-)
冗談よ...じょ・う・だ・ん...
さっさといくよ。

Section 3: 演算子

演算子にも種類がいくつかあるので、わかりやすいようにまた表にしておくね。前回の内容と同様 C言語を知っているから特に問題はないと思うけど...
そうね。復習ってところかしら

算術演算子
使い方
説明
+
X + Y
X と Y を足す
-
X - Y
X から Y を引く
*
X * Y
X と Y を掛ける
/
X / Y
X を Y で割る
%
X % Y
X を Y で割った余り
+
+Z
Z の値
-
-Z
Z の値の符号を反対にする
++
++operand
operand の値をインクリメントする。operandを評価する前にインクリメントする。
++
operand++
operand の値をインクリメントする。operandを評価してからインクリメントする。
--
--operand
operand の値をデクリメントする。operandを評価する前にデクリメントする。
--
operand--
operand の値をデクリメントする。operandを評価してからデクリメントする。

関係(比較)算子
使い方
真(true)となる条件
>
X > Y
X が Y より大きいとき
>=
X >= Y
X が Y より大きいか等しいとき
<
X < Y
X が Y より小さいとき
<=
X <= Y
X が Y より小さいか等しいとき
==
X == Y
X と Y が等しいとき
!=
X != Y
X と Y が等しくないとき

論理演算子
使い方
真(true)となる条件
&&
X && Y
X と Y が真(true) のとき
||
X || Y
X または Y が真(true) のとき
!
!Z
Z が偽(false) のとき

ビット演算子
使い方
説明
<<
X << Y
X を Y ビット左にシフトする
>>
X >> Y
X を Y ビット右にシフトする(左から符号桁)
>>>
X >>> Y
X を Y ビット右にシフトする(左から 0)
&
X & Y
X と Y のビットごとの論理積
|
X | Y
X と Y のビットごとの論理和
^
X ^ Y
X と Y のビットごとの排他的論理和
~
~Z
Z のビットごとの否定

代入演算子
使い方
説明
=
X = Y
Y の値を X に代入
+=
X += Y
X + Y の結果を X に代入
-=
X -= Y
X - Y の結果を X に代入
*=
X *= Y
X * Y の結果を X に代入
/=
X /= Y
X / Y の結果を X に代入
%=
X %= Y
X % Y の結果を X に代入
&=
X &= Y
X & Y の結果を X に代入
|=
X |= Y
X | Y の結果を X に代入
^=
X ^= Y
X ^ Y の結果を X に代入
<<=
X <<= Y
X << Y の結果を X に代入
>>=
X >>= Y
X >> Y の結果を X に代入
>>>=
X >>>= Y
X >>> Y の結果を X に代入

わかりやすくするために X, Y を使ったけど、 Xや Yの部分が式の場合もあるからね。
その辺はどの言語も同じでしょ?!
その通り!

そのほかの演算子を紹介するね。
3項演算子
?:
Z?X:Y
Z の値が真(true)なら X、偽(false)なら Y を返す
new演算子
new
new Class
クラスのインスタンスや配列を作る
instanceof演算子
instanceof
X instanceof ClassY
X が ClassY のインスタンスの場合真(true)を返す
キャスト演算子
(型)Z
Z を一時的に(型)で示す型に変換する

演算子には、今まで見たことがない物があるかもしれないけど、基本的には算数や数学に出てくる記号だから難しくはないよね。最後に、複数の演算子が使われている場合、どれから実行されるかわかっていないと思った結果が得られないので、優先順位を表にしておきます。

種類
演算子
後置演算子 [ ] ( ) . operand++ operand--
前置演算子 ++operand --operand +operand -operand ~ !
生成、キャスト new (データタイプ)
乗除演算子 * / %
加減演算子 + -
シフト演算子 << >> >>>
関係演算子 < > <= >= instanceof
等価演算子 == !=
ビット論理積 &
ビット排他的論理和 ^
ビット論理和 |
論理積 &&
論理和 ||
三項演算子 ?:
代入演算子 = += -= *= /= %= ^= &= |= <<= >>= >>>=

表の上の方が優先順位が高い。同じ行の場合、左から右へ順に評価されます。
優先順位で迷わないように括弧でちゃんと囲むのが重要よね!
その通り。わかりやすいコードを書くのは基本だね。

Section 4: 配列・文字列

Step 4 で説明した変数は、一つの名前と値を一つ持っている。これに対して配列は、一つの名前に複数の値を持っています。同じデータタイプの複数の値をひとまとまりにして名前を付け、一つの変数のように扱えるものが配列です。配列の個々の値は要素といいます。これも、C言語を知っているので簡単に説明するだけにしておくね。

データタイプ[] 配列名;

データタイプ 配列名[];

といった宣言の仕方がある。(修飾子がある場合があるけど省略)
また、C言語と違い配列の長さが簡単にわかる。配列名の後に .length を付けると、その配列の長さを知ることができる。
例を使った方がわかりやすいね。

float foo[]; // 名前 foo の配列を宣言(領域は確保されていない)
foo = new float[10]; // 10個の float データを入れる領域を確保
foo.length; // 値は 10 となる
   
float bar[][]; // 名前 bar に二次元の配列と同じ働きをもたせる(配列の配列)
bar = new float[3][4]; // どのように確保されるかは下図を参照
   
int baz[15]; // ERROR: このような表記はできません

array

Java 言語には C言語のような多次元配列はないけど、配列自身を要素にできるので配列と同じ働きを持たせることができる。上の図の意味は、bar は3個の要素を持つ配列で、個々の要素は4個の float 型の要素を持つ配列ということになる。

Java 言語は、宣言だけでは領域の確保はされない。領域の確保には new演算子を使う必要がある(C言語でよく使う malloc 関数のようなイメージかな)。確保した領域の範囲外の数値を指定すると、ArrayIndexOutOfBoundsException という例外が発生する。

要素を配列にする場合、最初にその大きさを決定する必要はなく、全て同じ大きさである必要もない。

bar = new float[3][];
bar[0] = new float[6];
bar[1] = new float[4];
bar[2] = new float[12];

配列の宣言の際に、値を代入することで要素の初期化を行うことができる。(浮動小数点リテラルはdouble型なので、float型に格納する場合は末尾に f か F をつける)

float baz[] = {36.2f, 9.3f, 17.8f};
float baz[] = new float[] {36.2f, 9.3f, 17.8f};

3個の float 型の要素を持つ配列が、それぞれの値で初期化されている。
先ほどの bar のように配列が要素のような配列を初期化するには、以下のように記述する。

float foo[][] = {{36.2f, 9.3f, 17.8f, 4.5f}, {36.2f, 9.3f, 17.8f, 4.5f}};
String bar[][] = {{"Java", "C++", "Pascal"}, {"UNIX", "MacOS", "Windows"}}; 

次に、int, char, double, etc. などといった数値データを表す型というのを頻繁に使うけど、文字や文字列をの扱いも同様に頻繁に使うよね。そこで Java では、二種類の String クラスというものを用意してある。

String クラスのインスタンスは、ダブルクォーテーションで囲まれた文字列を書くことで作られる。

String str1 = "Hello world";
String str2 = new String("Hello world");

StringBuffer クラスのインスタンスは、new演算子を使って生成する。そのときに、バッファのサイズや初期値を指定しする。StringBuffer オブジェクトの操作においては、指定したサイズを超えても必要な分だけ自動的に大きくなる。

StringBuffer strbuf1 = new StringBuffer(100);
StringBuffer strbuf2 = new StringBuffer("Hello world");
String クラスには、文字列を操作することのできるメソッドが数多く用意されている。ここでは、その一部を紹介するね。
String str = "Hello world";
int len = str.length();       // len の値は 11
char ch = str.charAt(0);      // ch の値は 'H'
StringBuffer strbuf = new StringBuffer("Hello world");
strbuf.append("wide");        // strbuf は "Hello worldwide"
文字列の連結に + 演算子を使うことができます。"Hello" + " world" は、"Hello world" となる。
文字列操作は頻繁に使うので便利ね〜。
そうでしょ。あとね、Java では正規表現なども行えるものもあるからとても便利だよ。

Section 5: ラップクラス

前回、データタイプについて説明したと思うけど、これに関する便利な型変換がいくつかあるので紹介するね。通常、数値を演算子を使って計算する場合、特に問題もなく数値を扱うことができる。しかし、文字列で表された数値を使って計算したい時には、文字列を数字に変換しなくては計算ができません。そこで Java では、文字列を数値にしたり、数値を文字列にしたりするクラスが用意されている。

Boolean Byte
Character Integer
Short Long
Float Double

これらは、基本データタイプのデータを値として持つクラスで、データを包んだクラスなのでラップクラスと呼ばれている。ラップクラスは、オブジェクトの持つ値を調べたり基本データタイプに変換するメソッドや、引き数のデータを調べたり別のデータタイプに変換するメソッドを持っている。

double d1 = obj.doubleValue();               // オブジェクトobj の値を double に変換する
double d2 = 12.34;
String str = Double.toString(d2);            // str の値は "12.34"
float f = Float.valueOf(str).floatValue();   // 文字列 str を float 型の数値に変換する

次回は、プログラムを書くのに必要な処理の流れを制御する文法について説明します。これも復習だと思ってね。

[Prev] [Next]