教育サーバーのページ
オンラインテキスト目次
ソフトウエア入門演習

目次

解答例

Javaの変数

参考:教科書 p46 2.3.3 変数

Javaに限らず、大多数のプログラミング言語には変数というものが用意されている。 変数は何らかのデータを入れておく箱のようなものと考えれば良い。 実際には、ある変数はメモリ上の決まった領域を確保し、そこにデータが格納される。

※ 参照型の変数の場合は、この説明では不十分であるが、参照を学ぶまでは以上の理解で差し支えない。

Javaのプログラム中で変数を使う場合、その変数を「宣言」する必要がある。 宣言するとは、変数の名前(変数名)と変数の型を書いて「今からこういう変数を使いますよ」と Javaコンパイラに教えてあげることである。

なお、RubyやPerlなど変数の宣言が基本的に必要ない言語もある。コンパイラを使う言語に宣言が必要なものが多く、 インタプリタを使う言語に宣言が必要のないものが多い。

たとえば、int型(整数型)の abcという名前の変数を使うと いう場合は、以下のように宣言する。

        int abc;
※ この1行だけで動作するわけではない。Javaのプログラムとして動作させるには、以下のように書く必要がある。 ただし、これだけでは、入力も出力もしないので何もしないプログラムである。
public class IntTest {
    public static void main(String[] args) {
        int abc;
    }
}
int abc; 以外の行は、当面どのプログラムでも同じである、いわば「決り文句」であるので、 このように敢えて書かないことがある。これは教科書も同様である。ただし、クラス名(この場合IntTest)はファイル名と一致しなければならないことに注意せよ。

変数名は自分で好きな名前がつけられるが、どんな名前でもつけられるわけではない。 Javaでつけられる名前は、

  1. 英字 か _ か $ で始まる
  2. 途中の文字は、英字 か 数字 か _ か $ が使える
  3. 予約語(Javaが最初から使っている単語。教科書ではキーワードと書いてある)は使えない
    Javaの予約語はこちらを参照のこと
というきまりがある。また、
  1. $は使うべきでない。また _ で始めるべきでない
  2. 大文字と小文字は区別される。つまり、以下の変数はすべて別の変数とみなされる
    japan Japan JAPAN jAPAN jaPAn
以下の例を見て理解して欲しい。

また、変数には使う目的があるはずである。変数名には使う目的に合った名前を付けるべきである。 他人が見て意味がまったく分からない変数名は使うべきでない。 また、原則として短すぎる変数名は、目的が分かりにくいので使うべきではない。 ただし、慣例として1文字の変数名が使われることが多い。 たとえば、a,b,c,d,e…(一般的な変数) i,j,k(繰り返しで用いる) m,n(配列の大きさなど) x,y,z(座標系で用いる) などがある。

参考:教科書 p34 2.2.7 識別子

以上、変数名の説明をしたが、Javaではそれ以外にも、クラス、メソッド、ラベル、パッケージといったものに 名前を付ける。変数名も含めてこれらの名前のことを識別子(identifier)という。これら識別子の名前の付け方は 変数と同様である。詳しくは教科書を参考のこと。

課題

  1. 正しい識別子と正しくない識別子の例をそれぞれ5つ挙げよ。

変数への代入と参照

参考:教科書 p46 2.3.3 変数(1)

以上で説明した変数には、「代入」と「参照」という操作が行える。 代入とは変数に値(データ)を入れることである。 また、参照とは変数の値を得ることである。 いわば、代入は変数への入力、参照は変数からの出力とも言える。

変数に値を代入する場合は、たとえば以下のようにする。

        int c;    // 整数型の変数cを宣言する
        c = 100;  // 変数cに100を代入する
※ // から後ろ(右側)の部分はプログラムを説明している「コメント」である。コメントの内容はプログラム動作には影響しない

代入には、= を使う。= の左辺(左側)に変数名を、右辺には値を書く。 右辺に書いた値が左辺の変数に代入されるのである。 数学の = とはまったく意味が違うので注意せよ。

また、参照するには単にその変数名を書けば良い。 例えば、変数bに入っている値を画面に表示するには、以下のようにする。

        int b;                    // 整数型の変数bを宣言する
        b = 50;                   // 変数bに50を代入する
        System.out.print("b = "); // "b = "と表示する
        System.out.println(b);    // 変数bの値を参照して表示する
※ 3行目がprintlnでなく、printになっていることに注意せよ。 printlnは表示の最後に改行するが、printは改行しない。 このため、このプログラムでは、 b = 50 と1行で表示される。試しに、3行目をprintlnにしてみよ。

ちなみに、以上のプログラムの3行目と4行目を、以下のように1つにまとめることができる。

        int b;                          // 整数型の変数bを宣言する
        b = 50;                         // 変数bに50を代入する
        System.out.println("b = " + b); // "b = " と変数bの値を参照して表示する

変数の値を他の変数に代入することもできる。以下の例は変数bの値(50)を参照して変数cに代入している。

        int b, c;         // 整数型の変数bとcを宣言する
        b = 50;           // 変数bに50を代入する
        c = b;            // 変数bの値を(参照して)変数cに代入する
        System.out.println("c = " + c);    // "c = "と変数cの値を表示する

変数の値を参照して、その値を使って同じ変数に代入することもある。

        int a;
        a = 40;
        a = a + 50;
        System.out.print("a = " + a);    // "a = "と変数aの値を表示する

a = a + 40 という書き方を奇妙に感じるかもしれないが、このような書き方は良く使われる。 数学の = とは違う意味であることに慣れて欲しい。 この文は、変数aの値を参照(この場合40)して、それに50を足した値、つまり90をaに代入する。 言いかえれば、変数aの値を50増やす処理である。

参考:教科書 p48 2.3.4 変数(2)

なお変数の宣言と一緒に代入を行うことができる。これを変数の初期化という。例えば、直前のプログラムは以下のように書ける。

        int a = 40;                  // 変数aを宣言して40を代入する
        a = a + 50;
        System.out.print("a = " + a);    // "a = "と変数aの値を表示する

Javaのデータ型

参考:教科書 p36 2.2.8 型

以上で上げた変数はすべてint型(整数型)であった。Javaではint型以外にも以下のデータ型が用意されている。

型の名前意味
int整数型 32ビット符号つき(-2147483648〜2147483647)
long整数型 64ビット符号つき(-9223372036854775808〜9223372036854775807)
short整数型 16ビット符号つき(-32768〜32767)
byte整数型 8ビット符号つき(-128〜127)
char文字型 16ビット符号なし(Unicode)
float浮動小数点数型 32ビット浮動小数点数(IEEE754-1985)
double浮動小数点数型 64ビット浮動小数点数(IEEE754-1985)
boolean論理型 true または false

※ この他に参照型とnull型もある

Javaでは変数は特定の型を持ち、その変数にはその型の値しか入れることができない。 例えば、int型の変数にはint型の値しか入れることができない。他の型の値を代入しようとすると、 自動的にint型に変換される。これを暗黙の型変換という。 ただし、暗黙の型変換は、小さい型の値から大きい型への変換のみである。 大きい型の値から小さい型への変換は自動的にはされない。 ちなみに型の大小関係は以下のようになっている。
double > float > long > int > short > byte
つまり、小さい型の値から大きい型の変数に代入することはできるが、 大きい型の値を小さい型の変数に代入できない。 ただし、shortとbyteはかならずint型の値に変換されるため、short, byte, intの間では問題は生じない。

参考:教科書 p53 キャスト

どうしても、大きい型の値を小さい型の変数に代入したい場合には、キャストを使う。 例えば以下のようにする。

        int i;
        long l;
        l = 100L;   // long型の変数lに100を代入する。
        i = (int)l; // long型の変数lの値をint型に変換(キャスト)してから変数iに代入する
        System.out.println("i = " + i);    // "i = "と変数iの値を表示する

Javaの定数

参考:教科書 p38 2.2.9 リテラル

ある決まった値、つまり定数の書き方を説明する。定数を表現するものをリテラルという。 書き方はデータ型によって異なる。

整数の定数

通常は 123, 1024 という風に書く。この場合10進数とみなされる。 0で始めると8進数とみなされる(例: 0774 0644)。また、0xで始めると16進数とみなされる(例: 0xff 0x8a00)。

long型の定数にしたい場合は、数値の後にLもしくはl(小文字のL)を使う(例:10L 999L)。 小文字のLは数字の1と間違いやすいので使わないほうが良い。

文字の定数

1文字だけを表す。'(シングルクォート)で囲む(例: 'a' 'b' '0' 'Z')。 特殊な意味を表すエスケープシーケンスは以下のとおり。例えば、'\n'のように使う。

文字意味
\n改行
\tタブ
\bバックスペース
\r復帰
\f改ページ
\\\
\'シングルクォート
\"ダブルクォート
\dddASCII文字コード(8進数で0〜377の範囲)
\uxxxxUnicode(16進数で0000〜ffffの範囲)

文字列の定数

複数の文字の集まりを示す。1文字や0文字ということもある。
"(ダブルクォート)で囲む(例: "The world")
0文字(空文字列)は "" と書く。
エスケースシーケンスを中に書くことができる(例: " 1st line \n 2nd line")。

浮動小数点数の定数

小数点を持つ。10進数で表される(例: 10.23 10.0 10. 0.25 .25)。
指数表現が使える(例: 3.14e4 (=3.14×10の4乗=31400) 3.21e-3 (=3.21×10の-3乗=0.00321)
数値の後ろにFまたはfをつけるとfloat型、Dまたはdをつけるとdouble型の定数であることを表す。

その他の定数

論理型の定数としてtrue (真)、 false (偽) がある。また、どこも参照していないことを示すnullがある。

演習

演習1
┏━━━━━━━━━ TestIntVar.java ━━━━━━
/*
TestIntVar.java
    さまざまな整数型とその初期化、代入
usage:
> java TestIntVar
*/

public class TestIntVar {
    public static void main(String[] args) {
        byte b;       // byte型変数の宣言
        short s = 23; // short型変数の宣言と同時に変数の初期化
        int i;
        long n = 15L; // long型変数の宣言と初期化 値の後に L がある

        b = 100;     // 100 を代入
        i = -53;     // -53 を代入
        System.out.print("byte b = " + b);
        System.out.print(" short s = " +  s + "\n");
        i = 4;       // 4 を再代入
        System.out.print("int i = " + i);
        System.out.println(" long n = " + n);
        i = b;       // byte型変数値を代入
        b = -15;     // 15 を再代入
        System.out.println("int i = " + i);
        System.out.println("byte b = " + b);
    }
}
┗━━━━━━━━━━━━━━━━━━━━━━━━
  1. 上のプログラムを書いてコンパイルし、

    % java TestIntVar
    

    と実行せよ。
  2. 実行結果とプログラム内容をつき合わせ、変数の使い方と値の代入について理解せよ。

参考:教科書 p.52〜53
演習2
┏━━━━━━━━━ TestIntVar1.java ━━━━━━
/*
TestIntVar1.java
    さまざまな整数型とその初期化、代入についてのエラー
usage:
> java TestIntVar1
*/

public class TestIntVar1 {
    public static void main(String[] args) {
        byte b;
        short s = 23;
        int i;
        long n = 15L;

        b = 129;
        i = -53;
        System.out.print("byte b = " + b);
        System.out.print(" short s = " +  s + "\n");
        i = 4;
        System.out.print("int i = " + i);
        System.out.println(" long n = " + n);
        b = i;
        n = i = b;
        System.out.println("int i = " + i);
        System.out.println("long n = " + n);
        System.out.println("b + s" + b + s);
        i = b + s;
        System.out.println("i = " + i);
        i = i + 1;
        System.out.println("i = " + i);
    }
}
┗━━━━━━━━━━━━━━━━━━━━━━━━
  1. 上のプログラムを書いてコンパイルせよ。

課題

  1. このプログラムはコンパイルに失敗する。 その理由を対応するプログラム部分を示してすべて挙げよ。
  2. プログラムの骨格を変更しないで、適切な値や代入を行って、

    % java TestIntVar1
    

    で実行できるプログラムを完成し、その実行結果を述べよ。
  3. byte, short, int, long 型の整数の利用範囲を、その根拠となる計算式を添えて述べよ。

演習3

┏━━━━━━━━━ TestChar.java ━━━━━━
/*
TestChar.java
    文字列とその初期化、代入
usage:
> java TestChar
*/

public class TestChar {
    public static void main(String[] args) {
        char c1;
        char c2 = 0x61;
        char c3 = '\u0061';
        String st;
        c1 = 'a';
        Character ch = new Character(c1);
        int i;

        System.out.println("c1 = " + c1);
        System.out.println("c2 = " + c3);
        System.out.println("c3 = " + c3);
        System.out.println("c1c2c3 = " + c1 + c2 + c3);
        System.out.println(Character.toUpperCase(c1));
        System.out.println("(int)c1 = " + (int)c1);
        System.out.println("(int)c2 = " + (int)c2);
        System.out.println("(int)c3 = " + (int)c3);
    }
}
┗━━━━━━━━━━━━━━━━━━━━━━━━
参考:教科書 p53 キャスト
  1. 上のプログラムを書いてコンパイルして実行せよ。

課題

  1. プログラム中で (int)c1 などとあるのは何か説明せよ。
演習4
┏━━━━━━━━━ Swap2Variable.java ━━━━━━
/*
Swap2Variable.java
    2変数の値を交換する
usage:
> java Swap2Variable
*/

public class Swap2Variable {
    public static void main(String[] args) {
        int a = 50;
        int b = 30;
        int c;

        System.out.println("a = " + a);
        System.out.println("b = " + b);

        System.out.println("Swap a and b");
        c = a;
        a = b;
        b = c;

        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
┗━━━━━━━━━━━━━━━━━━━━━━━━
  1. 上のプログラムを書いてコンパイルして実行せよ。

課題

  1. 教科書 p.51ページの演習問題 2.2.1 を行え

ソフトウエア入門演習
教育サーバーのページ
mizutani@rsch.tuis.ac.jp