第2日目:演算と変数

Javaでの演算と変数の基本を学びます。算術演算、変数の宣言、データ型、型変換を確認します。

日付 0 1 2 3 4 5 6 7

第2日目:演算と変数

Javaでの演算処理

演算

第一日目では、System.out.print()およびprintln()を用いて、様々なものを表示してみました。ここで更に、Javaを用いた計算について学んでいくことにしましょう。

プログラミングの世界では、こういった計算のことを、演算と呼びます。これは、以下、簡単な演算のプログラムをみてみることにしましょう。

Sample201.java
package day2;

public class Sample201 {
    public static void main(String[] args) {
        System.out.print(5 + " + " + 2 + " = ");
        System.out.println(5+2);    // 足し算
        System.out.print(5 + " - " + 2 + " = ");
        System.out.println(5-2);    // 引き算
        System.out.print(5 + " * " + 2 + " = ");
        System.out.println(5*2);    // 掛算
        System.out.print(5 + " / " + 2 + " = ");
        System.out.print(5/2);      // 割り算
        System.out.print(" 余り ");
        System.out.println(5%2);    // 剰余
    }
}
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2 余り 1

実行結果からもわかるとおり、このプログラムを実行すると、様々な計算結果が出てきます。

文字列と数値の接続

6行目で、数値と文字列の間が、「+」演算子でつながれていますが、これは表示するものを接続するという意味です。このときの「+」演算子は、数値の加算の意味ではなく、表示するものを接続するという意味です。

文字列同士の接続
System.out.println("ABC" + "DEF"); → 「ABCDEF」と表示
文字列と数字の結合
System.out.println("答え:"+3); → 「答え:3」と表示

演算子

このように、Javaで様々な演算を行う記号のことを演算子(えんざんし)と呼びます。足し算の+や、引き算の-はわかるものの、その他の記号は何でしょう?Javaで使用する演算子は以下の表2-1のようなものがあります。

表2-1:Javaの計算で用いられる主な演算子
演算子読み方意味使用例
+プラス足し算を行う演算子5 + 5
-マイナス引き算を行う演算子7 - 3
*アスタリスク掛け算を行う演算子7 * 3
/スラッシュ割り算を行う演算子7 / 3
%パーセント剰余(じょうよ)演算子。割り算の余り7 % 3

ご覧の通り、*が掛算、/が割り算を表す記号であることがわかります。また、%の記号は、Javaのプログラミングでは使用頻度が高いので、覚えておきましょう。

変数

Javaと変数

Javaを用いれば、様々な演算ができることはすでにわかりました。しかし、これでは、決められた値の計算しかできません。実際は、色々な数値を用いて計算することが想定されるため、これでは不便です。このように、値が定まった数のことを、定数と言いますが、それに対し、Javaには、値を常に変えることができる数が存在するのです。これを、変数と言います。

サンプルプログラム

まずは、以下のサンプルを実行してみてください。

Sample202.java
package day2;

public class Sample202 {
    public static void main(String[] args) {
        int a;           // 変数の宣言
        int b = 3;       //  初期化と代入を同時に行う。
        int add,sub;     //  複数の変数を同時に宣言
        double avg;      //  int以外の変数を宣言

        a = 6;           // 代入(最初に値を入れるので、“初期化”と言う。
        add = a + b;     // a,bの和を求める。
        sub = a - b;     // a,bの差を求める。
        avg = (a + b) / 2.0; // a,bの平均値を求める。

        System.out.println(a + " + " + b + " = " + add);
        System.out.println(a + " - " + b + " = " + sub);
        System.out.println(a + "と" + b + "の平均値:" + avg);
    }
}
6 + 3 = 9
6 - 3 = 3
6と3の平均値:4.5

プログラムの中にabaddsubavgといった文字列が出ていますが、これが変数です。int aとある部分を、変数の宣言と言います。そのあと、a=6のようにすると、値が入ります。これを代入と言います。(図2-1)特に、変数を宣言したときに、最初に行う代入のことを、初期化と言います。

変数の宣言と代入のイメージ

図2-1:変数の宣言と代入のイメージ

代入

数値が代入された変数は、その数値として扱う事が出来ます。例えば、a=6とすれば、aは別の値が代入されるまで、"6"として扱う事が出来ます。変数は原則的に何度も値を変えることが可能です。つまり、変数は値を変えることが出来るのです。

変数の初期化と代入
int a; ← 変数の宣言(aという変数を使えるようにする)
a = 6; ← 代入。(変数に値を入れる)

演算の優先順位

プログラム中に、()(括弧)がありますが、これは、計算の優先順位を変更するものです。通常、

括弧が無い場合の計算
1 + 2 * 3 → 結果は7

とすると、最初に掛け算の演算である「2*3」が実行され、その結果の6に1が加算されます。したがって、結果は7になります。しかし、

括弧を用いた計算
(1 + 2) * 3 → 結果は9

とすると、()内の計算を先に行い、その結果である、3と次の3が掛けられることになります。このように、Javaにも、数学と同じような演算子の優先順位があります。Javaには様々な演算があるため、ここでは全てを説明するのは省略しますが、加減乗除といった基本的な数値計算に関しては、数学と同じルールに従うと思ってほぼ間違いありません。

Javaでの()が無い演算と、ある演算

図2-2:()を使用した場合と、使用しない場合の演算の処理

データ型

では、初期化の際に変数の先頭についている、intや、doubleといった文字列は何でしょうか?このような文字列のことを、データ型と言い、その変数がどのような値を扱うのかを示しています。例えば、intは、整数型のデータ型を表し、"int a"とすると、"aは整数の値が入る変数である。"ことを意味します。なお、データ型には以下のようなものがあります。(表2-3)

表2-3:Javaで用いられるデータ型
データ型説明
booleantrue or false
char16ビットUnicode文字(U+0000~U+FFFF、\u0000~\uFFFF 表記)
byte8ビット整数 -128~127
short16ビット整数 -32768~32767
int32ビット整数 -2147483648~2147483647
long64ビット整数 -9223372036854775808~9223372036854775807
float32ビット単精度浮動小数点数
double64ビット倍精度浮動小数点数

初期化

再び変数の話に戻りましょう。変数は、宣言時に値を代入(初期化)することが出来ます。記述方法は以下のとおりです。

変数の宣言と初期化を同時に行う
int a = 6; ← 変数の宣言と同時に値を代入(初期化)

また、以下のように、,(コンマ)で区切ることにより同時に複数の変数を宣言したり、初期化することも可能です。

複数の変数を同時に宣言
int a,b; ← 変数a,bを宣言
int a=1,b=2; ← 変数a,bを初期化
int a,b=1; ← 変数a,bを宣言、bのみを初期化

変数の命名規則

Javaの変数の命名規則

変数の名前は、基本的にプログラマーが自由につけることが許されています。通常、アルファベット一文字か、その組み合わせといったものが使われる場合がほとんどです。しかし、何でも良いというわけではなく、以下のようなルールがあります。

  • 使用できる文字は半角の英文字(A~Z、a~z)、数字(0~9)、アンダーバー(_)、$。(例:abc、i、_hello、num1、$aなど)
  • 変数名の最初の文字を数字にすることは出来ない。必ず英文字およびアンダーバーからはじめること。(例:a123 → ○ 123a → ×)
  • 英文字の大文字と小文字は別の文字として扱われる。(例:ABCとabcは違う変数とみなされる。)
  • 規定されているJavaの予約語・定数を使ってはいけない。

予約語と定数

なお、予約語とは言語の仕様で使い方が決められている単語のことで、Javaの予約語は以下のとおりです。(表2-4)

表2-4:Java言語の予約語

abstractassertbooleanbreakbyte casecatchcharclassconst continuedefaultdodoubleelse enumextendsfinalfinallyfloat forgotoifimplementsimport instanceofintinterfacelongnative newpackageprivateprotectedpublic returnshortstaticstrictfpsuper switchsynchronizedthisthrowthrows transienttryvoidvolatilewhile

注: Javaでは gotoconst が予約語として登録されていますが、現在の言語仕様では使用されず将来の拡張のために予約されています。また、truefalsenull はリテラルであり識別子として使用できません。

代入演算子

代入と演算

すでに述べたとおり、変数に値を入れることを代入と言いました。代入とは例えば以下のように記述します。

代入処理
a = 1; ← 変数aに1を代入
a = b; ← 変数aに変数bの値を代入
d = 4.0; ← 変数dに4.0を代入

ここで気をつけたいのが、代入で使用する=(イコール)記号の意味です。数学で、=記号は、左辺と右辺の値が等しい、という場合に用いられる記号です。しかし、Javaで代入に用いる=は、少し意味が違います。

代入におけるイコールは、右辺の値を左辺の変数に代入するという意味になるのです。そのため、例えば

自身を用いた計算結果を代入する
a = a + 1; ← ① aに、a+1の値を代入する。
b = b * 5; ← ② bに、b*5の値を代入する。

といった記述方法も可能になります。例えば、①ですが、仮に最初の段階でaに4が入っていたとすると、そこに1を足した5がaに代入されます。についても同様で、bに2が入っていたら、2に5をかけた値、つまり10がbに入ります。

Sample203.java
package day2;

public class Sample203 {
    public static void main(String[] args) {
        // 使用する変数の定義
        int a1=2,b1=2,c1=2,d1=2;    // 変数の宣言(1)
        int a2=2,b2=2,c2=2,d2=2;    // 変数の宣言(2)
        // 普通の演算による計算と代入
        a1 = a1 + 1;
        b1 = b1 - 1;
        c1 = c1 * 2;
        d1 = d1 / 2;
        // 代入演算による計算
        a2 += 1;
        b2 -= 1;
        c2 *= 2;
        d2 /= 2;
        System.out.println("a1=" + a1 + " b1=" + b1 + " c1=" + c1 + " d1=" + d1);
        System.out.println("a2=" + a2 + " b2=" + b2 + " c2=" + c2 + " d2=" + d2);
    }
}
a1=3 b1=1 c1=4 d1=1
a2=3 b2=1 c2=4 d2=1

代入演算子

実行結果を見れば判る通り、a1とa2~d1とd2の組み合わせはそれぞれ、記述の仕方が違うだけで、結果が同じであることが判ります。このように、代入演算を用いれば、短い記述で同様の結果を得ることが出来ることがわかります。

Javaにおける主な代入演算は、以下のとおりです。

表2-6:Javaの主な代入演算子
演算子使用例意味
+=a+=1;a=a+1;
-=a-=1;a=a-1;
*=a*=2;a=a*2;
/=a/=2;a=a/2;
%=a%=2;a=a%2;

キャストとデータの型変換

サンプルプログラム

次に、型の異なる変数に値を代入するケースを見てみましょう。例えば、整数型の変数の値を実数型の変数に代入するような処理です。以下のサンプルを見てみましょう。

Sample204.java
package day2;

public class Sample204 {
    public static void main(String[] args) {
        int a;
        double b,c,d;
        a = (int)1.23;  // キャストで代入
        b = 1.23;
        c = 10;         // キャストなしで代入
        d = (double)c;  // キャストありで代入
        System.out.println("a=" + a + " b=" + b + " c=" + c + " d=" + d);
    }
}
a=1 b=1.23 c=10.0 d=10.0

キャスト

このプログラムでは、8行目でdouble型からint型の変換と、11行目でint型からdouble型への変換を行っています。実行結果から見てわかるとおり、前者の場合、小数点以下の数値が切り捨てられ、後者の場合は、整数に変換されていることがわかります。

8行目と、11行目では、変換する値への型変換がおこなわれています。頭に(int)や(double)などと、変換したい値の型を先頭につけることを、キャストと言います。

a = (int)1.23;
d = (double)c;

aはint型の変換なので、double型の変数を代入する際、先頭に(int)とつけ、変換を行っています。このとき、キャストを省略するとエラーになります。また、この処理の結果、小数点以下の内容は省略されます。

また、整数型から実数型への変換の場合、キャストは省略してもエラーになりません。

文字列の変数

サンプルプログラム

数値などのほかに、Javaでは文字列を変数として扱うことができます。文字列の変数を宣言するには、Stringを使います。厳密に言うと、これはintdoubleなどといったデータ型ではありませんが、データ型と同じように扱うことができます。まずは、以下のサンプルを実行してみてください。

Sample205.java
package day2;

public class Sample205 {
    public static void main(String[] args) {
        String s1,s2,s3;
        s1 = "ABC";     // s1に文字列「ABC」を代入
        s2 = "DEF";     // s2に文字列「DEF」を代入
        s3 = s1 + s2;    // s3に、s1とs2を結合したものを代入
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s1 + s2);
        System.out.println(s3);
    }
}
ABC
DEF
ABCDEF
ABCDEF

実行結果を見てもわかるとおり、変数s1s2s3にそれぞれ値が代入されています。s1、s2には、文字列「ABC」、「DEF」がそれぞれ代入されています。s3には、それぞれを+演算子で結合したものが入っています。

この+演算子により、文字列の変数同士を結合することが可能です。したがって、s3には、二つを結合した「ABCDEF」が代入されています。

定数

サンプルプログラム

変数は、自由に値を変えることが可能です。しかし、何らかの理由で、値を変えたくない場合があります。その時便利なのが、final(ファイナル)変数です。以下のプログラムを実行してみてください。

Sample206.java
package day2;

public class Sample206 {
    public static void main(String[] args) {
        final int NUMBER = 100;
        final String STRING = "Hoge";
        System.out.println(NUMBER);
        System.out.println(STRING);
        // finalがついた変数は値を変えられない
        //NUMBER = 100;
        //STRING = "fuga";
    }
}
100
Hoge

final変数

プログラムの6行目および7行目で、それぞれint型、String型の変数を定義し、初期値を設定しています。8、9行目でその結果を表示していますが、ここまでは、今まで学習してきた変数と変わりません。

しかし、11行目および12行目のコメントをとってみてください。エラーが発生します。つまり、finalがついた変数は、一度定義したら、二度と値を変更することが出来ないのです。そのため、finalは、円周率のような、値を変えられたら困るような値に使用するのが一般的です。

また、絶対というきまりはありませんが、一般に、finalを用いて定数を定義する場合、変数名は大文字にするという習慣があります。これは文法上の決まりではありませんが、一般の変数と定数を区別するには大変便利です。

練習問題 2 へ →