31.5 変数の定義と参照

数式が複雑になってくると,その式が何を計算しているかが分かりにくくなります.このような場合,値に名前を付けることで計算の意図をはっきりさせることができます.

例えば,「40 人の学生が 1 時間のうち 50 分働き 10 分休むというペースで 1 日 10 時間働くことを 30 日間続けた場合ののべ秒数」を計算を考えてみましょう.

System.out.println(60 * 50 * 10 * 40 * 30);
36000000

これで確かに答えとなる値は求まりますが,この式を後で見直したときに何の計算を意図しているか分からなくなってしまうことでしょう.

また,この式をもとに後から,

  • 人数を 3 人増やして
  • 休憩時間が 5 分間短くなった

場合を計算しようと思った場合,どの部分に “3” や “5” を足せばよいかを間違えずに行うのは至難の技です.

そこで一般的なプログラム言語では,変数を使うことで計算した値に名前をつけることができます.

変数の定義

Java では,

種類 変数名;

と書くことで,変数を作成でき,

変数名 = 式;

と書くことで,その変数に式を計算した値を代入することができます.さらにこの2つの処理をまとめて,

種類 変数名 = 式;

と書くこともできます.基本的にはこの形式で書くとよいでしょう.

ここで変数を作るには値の種類を書く必要があります.整数だったら “int”,小数だったら “double” です.そして,代入する時には式の値の種類は必ず変数の種類と一致する必要があります.といっても必要があれば整数は小数に変換されるので,小数になる可能性があるのに “int” を指定している場合以外はエラーになりません.

例えば,1 分間の秒数 “60” に “seconds_per_minute” という名前を付けるときは次のように書きます.

int seconds_per_minute = 60;

これで Java に “seconds_per_minute” という名前の変数とその値は整数“60”であることを覚えさせることができます.

変数の名前として “seconds_per_minute” のような英単語の並びを下線記号でつなげたものが使えることに注意して下さい.数学では “a” や “x” のようなアルファベット 1 文字を変数として使うことがほとんどでした.プログラムでは沢山の変数を使うので,人間にとって意味が分かりやすいように,もっと長い名前の変数名が使えるようになっています.

実際,Javaでは1文字目がアルファベットまたは下線記号 “_” であれば,その後にアルファベット,数字,そして下線記号 “_” が並んだものを変数の名前として使うことができます.ですので,例えば

  • x
  • x1
  • Seconds
  • Seconds_per_minute
  • MyFavoriteSongsIn80s

のような名前は全て変数名として使うことができます.ただし,int, double, class, public, if, forのような名前は,特別な意味を持っていますので変数名として使うことができません.

変数の参照

変数を定義すると,以降の計算式にその名前の変数があると,そこには変数の値があるとして計算が行われます.

次の例では,変数 “seconds_per_minute” を定義した上で計算をします.

// Program.java: 変数 class Program { public static void main(String[] args) { int seconds_per_minute = 60; System.out.println(seconds_per_minute); System.out.println(seconds_per_minute * 10); } }
60 600

ちゃんと変数の値が使われていることがわかると思います.

なお,定義されていない変数を書いた場合はエラーになります.

// Program.java: 変数 class Program { public static void main(String[] args) { int seconds_per_minute = 60; System.out.println(second_per_minute); } }
javac Program.javareturn2
Program.java:5: シンボルを見つけられません. シンボル: 変数 second_per_minute 場所 : Program の クラス System.out.println(second_per_minute); ^ エラー 1 個

このような時は,ちゃんと変数が定義されているか,またスペルミスがないか確認してください(上の例では “second” の後の “s” がない).

変数の利用例

それでは変数を使って,「40 人の学生が 1 時間のうち 50 分働き 10 分休むというペースで 1 日 10 時間働くことを 30 日間続けた場合ののべ秒数」の計算式を書き直してみましょう.

// Program.java: 変数 class Program { public static void main(String[] args) { int seconds_per_minute = 60; // 1 分間の秒数 int minutes_per_hour = 50; // 1 時間あたりの働いた分数 int hours_per_day = 10; // 1 日あたりの働いた時間数 int days = 30; // 働いた日数 int students = 40; // 学生数 System.out.println(seconds_per_minute * minutes_per_hour * hours_per_day * days * students); } }
36000000

変数を使ったことでソースコードは長くなりましたが,計算の意図は前よりもはっきりしましたね.

では,1 時間あたりの休憩を 5 分短くして(つまり 1 時間あたり 5 分余計に働き),3 人学生を追加した場合ののべ秒数を計算してみましょう.今度はどこに 3 や 5 を足すかがすぐに分かりますね.

// Program.java : 変数 class Program { public static void main(String[] args) { int seconds_per_minute = 60; // 1 分間の秒数 int minutes_per_hour = 50 + 5; // 1 時間あたりの働いた分数 int hours_per_day = 10; // 1 日あたりの働いた時間数 int days = 30; // 働いた日数 int students = 40 + 3; // 学生数 System.out.println(seconds_per_minute * minutes_per_hour * hours_per_day * days * students); } }
42570000

練習として,次のような場合の計算式を変数を使って書いてみてください.

  • 学生の他にフリーターが 4 名働くことになりました.
  • フリーターの条件は学生と同じですが,日数は 10 日間です.
  • 学生とフリーターが働いた,のべ秒数を求めて下さい.

どのような変数を用意すると意図がはっきりした式を書くことができるでしょうか?