
Java入門|変数の値を変更する
変数は一度入れたら終わりではない。値を変えながら使うと、プログラムはもっと自由になる
これまでの学習では、変数を宣言し、値を代入し、その値を画面に表示する流れを見てきました。ここまで理解できると、変数が値を記憶するための箱のようなものだというイメージがかなりつかめてきます。けれども、変数の本当のおもしろさは、ただ値を入れて終わりではないところにあります。
Javaのプログラムでは、上から下へ文が順番に実行されていきます。この流れを利用すると、いったん変数に入れた値を、あとから別の値で置きかえることができます。つまり、変数は途中で中身を変えながら使っていけるのです。これが、変数が変数と呼ばれる理由にもつながっています。
また、変数に代入できるのは、3 や 5 のような決まった数値だけではありません。ある変数に入っている値を、別の変数へ渡すこともできます。この考え方がわかると、変数どうしをつなげながら処理を組み立てる感覚が少しずつ見えてきます。
ここでは、変数の値を変更するしくみ、ほかの変数の値を代入する方法、そして代入するときに注意したい型や宣言位置の基本まで、順番にわかりやすく見ていきましょう。
変数の値はあとから変更できる
変数は、いったん値を入れたらそのまま固定されるわけではありません。あとから新しい値を代入すれば、その値に変わります。
これは、Javaのコードが文を1つずつ順番に実行していくことと深く関係しています。先に 3 を代入しておけば、その時点では変数の中身は 3 です。そのあとで 5 を代入すれば、今度は変数の中身が 5 になります。つまり、あとから書かれた代入が新しい状態をつくるのです。
ここで大切なのは、変数は1回しか値を入れられないものではないということです。必要に応じて何度でも新しい値を入れなおせます。この性質があるからこそ、プログラムの途中で状態を変えたり、計算結果を更新したりできるようになります。
値を変更するとは「上書きする」こと
変数にもう一度値を代入すると、新しい値が入るだけでなく、それまで入っていた値は新しい値で置きかえられます。これを、値を上書きすると考えるとわかりやすいです。
たとえば、最初に num に 3 を代入したとします。この時点では num の値は 3 です。そこへ次に 5 を代入すると、num の中身は 5 になります。前に入っていた 3 がどこかに残ったままになるのではなく、5 で更新されるイメージです。
このため、同じ変数を出力しても、出力するタイミングによって表示される値が変わることがあります。これはプログラムの処理が順番に進み、その途中で変数の中身が変わっているからです。
サンプルプログラムで値の変更を見る
ファイル名:Sample2.java
class Sample2
{
public static void main(String[] args)
{
int score;
score = 70;
System.out.println("最初の点数は " + score + " 点です。"); // ① 最初の値を表示します
score = 90; // ② 新しい値を代入します
System.out.println("点数を変更しました。");
System.out.println("新しい点数は " + score + " 点です。"); // ③ 新しい値を表示します
}
}実行結果
最初の点数は 70 点です。
点数を変更しました。
新しい点数は 90 点です。このプログラムでは、最初に変数 score に 70 を代入しています。そのあとで、その値を表示しています。次に score に 90 を代入しなおしているので、最後に表示される値は 90 になります。
同じ変数 score を使っているのに、前半と後半で表示される値が違うのは、途中で新しい値を代入しているからです。ここが、変数の値を変更するしくみのいちばん大切なポイントです。
同じ変数でも出力結果が変わる理由
このテーマで特に意識しておきたいのは、同じ変数名を書いていても、いつ出力するかによって結果が変わることがある、という点です。
たとえば、先ほどのプログラムでは、最初の System.out.println でも、最後の System.out.println でも、どちらも score という同じ変数を使っています。それなのに、最初は 70、あとでは 90 が表示されます。
これは、変数名そのものが変わったのではなく、変数の中身が途中で変わったからです。プログラムは、変数名ではなく、その時点で変数に入っている値を見て処理を行います。
そのため、同じ変数でも、途中で代入しなおせば、あとで取り出される値も変わります。
図でイメージする変数の値の変更

この図では、変数にすでに入っていた値が、新しい値によって置きかえられる様子を表しています。ここで見ておきたいのは、変数の箱そのものは同じでも、中に入っている値は変えられるということです。
このイメージをつかんでおくと、変数は一時的に値を覚えておき、その後の処理で何度も内容を更新できるものだと理解しやすくなります。
変数に代入できるのは数値だけではない
代入というと、3 や 5 のような決まった数値を入れるイメージが強いかもしれません。けれども、代入の右側に書けるのは数値だけではありません。変数の値を、ほかの変数に代入することもできます。
これはとても大切な考え方です。ある変数が持っている値を、別の変数へ渡すことができるようになると、値を受け渡ししながら処理を進められるようになります。プログラムらしい流れが見えてくるのは、まさにこのあたりからです。
ほかの変数の値を代入するしくみ
変数を右辺に書くと、その変数名そのものが入るわけではありません。入るのは、その変数の中に入っている値です。
たとえば、num2 = num1; と書いたとします。このとき、num2 に代入されるのは文字としての num1 ではありません。num1 が現在持っている値です。
つまり、右辺の変数は、その時点での中身の値として扱われます。
このしくみを理解すると、変数は値を保存する場所であり、その場所から値を取り出して別の場所へ渡すこともできる、と考えられるようになります。
サンプルプログラムで変数どうしの代入を見る
ファイル名:Sample3.java
class Sample3
{
public static void main(String[] args)
{
int price1, price2;
price1 = 1200;
System.out.println("商品Aの価格は " + price1 + " 円です。");
price2 = price1;
System.out.println("商品Aの価格を商品Bにも代入しました。");
System.out.println("商品Bの価格は " + price2 + " 円です。");
}
}実行結果
商品Aの価格は 1200 円です。
商品Aの価格を商品Bにも代入しました。
商品Bの価格は 1200 円です。このプログラムでは、まず price1 に 1200 を代入しています。次に、price2 = price1; と書いています。すると、price2 には price1 の値である 1200 が代入されます。
ここで大事なのは、右辺に書かれているのが数値ではなく変数であっても、代入のしくみは同じだということです。Javaは、price1 という変数の中に入っている値を取り出して、それを price2 に入れています。
図でイメージする変数どうしの代入

この図では、num1 に入っている値が num2 に渡される様子を表しています。ここで押さえておきたいのは、代入されるのは変数名ではなく、変数の中身だということです。
変数の値を別の変数に代入できるようになると、値の受け渡しや一時保存の考え方がぐっとわかりやすくなります。これから先の計算や処理の流れを学ぶときにも、この考え方はとても大切です。
代入するときは型に注意する
変数に値を代入するときは、何でも自由に入れられるわけではありません。変数には型があるので、その型に合った値を代入する必要があります。
たとえば、int型は整数を入れるための型です。そのため、小数点のある値をそのまま代入することはできません。
ここは、変数の使い方でとても大切な注意点です。
変数の値を変更するときも、ほかの変数の値を代入するときも、いつでも型のルールに従う必要があります。変数の便利さばかりに目が向くと見落としやすいところですが、Javaでは型がしっかり決まっているからこそ、安全でわかりやすいコードが書けます。
int型の変数に小数はそのまま入れられない
たとえば、int型の変数に 3.14 のような小数を代入しようとすると、そのままではコンパイルできません。
なぜなら、int型は整数用の型だからです。
整数型の変数は、小数点以下を持つ値をそのまま記憶するようには作られていません。
そのため、変数に代入する値は、その変数の型に合っているかどうかを必ず意識する必要があります。
この基本を理解しておくと、エラーが出たときにも原因を考えやすくなります。変数にうまく値を入れられないときは、まず型と値の組み合わせが合っているかを確認することが大切です。
図でイメージする代入時の注意

この図では、小数値である 3.14 を int型の変数へ入れようとしても、そのままでは受け入れられないことを表しています。
変数には型ごとの役割があるため、入れられる値にも決まりがあります。
このイメージを持っておくと、代入のときには左側の変数だけでなく、右側の値の種類にも目を向けることが大切だとわかります。
変数の宣言は mainメソッドの中で考える
学習の初期段階では、変数の宣言は mainメソッドのブロックの中に書くものとして考えておくとわかりやすいです。
public static void main(String[] args)
{
...
}この波かっこで囲まれた部分の中で変数を宣言して使っていく形にしておくと、まずは基本の流れをつかみやすくなります。
今の段階では、変数をどこで使うのか、どこで宣言するのかをあまり広く考えすぎず、mainメソッドの中で順番に処理を書く形に慣れるのが大切です。
同じブロック内では同じ名前の変数は使えない
変数の宣言では、名前の重複にも注意が必要です。
同じブロックの中で、同じ名前の変数をいくつも宣言することはできません。
これは、同じ場所に同じ名前の箱を複数置くと、どれを使えばよいのかわからなくなるからです。Javaはそうしたあいまいさを防ぐために、同じブロック内で同名の変数を複数宣言できないようにしています。
変数名を決めるときには、わかりやすさだけでなく、ほかの変数と重ならないことも大切です。
「変数」という名前の意味が見えてくる
ここまで学ぶと、なぜ変数が変数と呼ばれているのかが見えてきます。
変数は、最初に値を入れたら終わりではなく、あとから別の値に変えられます。必要に応じて新しい値で更新しながら使えるからこそ、変わる数、つまり変数なのです。
この考え方は、これから先のJava学習でも何度も登場します。計算結果を入れなおしたり、入力された値で更新したり、条件によって違う値を持たせたりするときにも、変数の値を変えられるという性質が大きな役割を果たします。
最初は小さな例でも、ここで学んでいることはとても大切です。変数の値を変更できること、変数どうしで値を受け渡しできること、型に合った値を入れる必要があること。これらをしっかり押さえておくと、Javaのコードがぐっと理解しやすくなっていきます。
