Javaの変数とは?宣言や初期化の方法も解説

「変数ってなに?」
「どうやって変数って使うの?」
「具体的なコーディング例を見たい」

変数とは、データを格納するための入れ物のようなもので、プログラム内でデータを一時的に保持したり、データを操作したりするために使用されます。

Javaの変数が理解できるようになれば、プログラムの構造やデータの扱い方がより具体的に理解できるようになります。

この記事ではJavaの変数に焦点を当て、サンプルコードをもとに基本から応用までを解説します。ぜひ最後までをご覧ください。

Javaの変数とは?

変数とは、データを格納するための入れ物のようなものです。

実際には物理的な入れ物ではなく、コンピュータのメモリ内にデータを保持するための領域ですが、空っぽな入れ物に値を入れたり、差し替えたりするイメージを持っておくとわかりやすいでしょう。

値を変数に代入することで、メモリ上にそのデータのための領域が確保され、データが格納されます。

プログラムでは処理の中で扱うデータが変化することがよくあり、ユーザーからの入力を受け取る場合や計算の結果を保持したりする場合に変数を使うことでデータを柔軟に扱えます。

Javaにおける変数の基礎

ここからは、次のトピック別でJavaにおける変数の基礎を解説します。

宣言方法

変数を使用するためには、まずその変数を宣言する必要があります。

変数の宣言とは、メモリ上にデータを格納するための領域を準備することです。変数には名前を付けることにより、後でその変数を参照したり、新しい値を代入したりすることができます。

Javaでは変数を使用する際には、その変数がどのような種類のデータを保持するかを指定する型の指定とデータにアクセスするための変数名の設定が必要です。

例えば、整数を格納する変数を宣言したい場合は以下のように記述します。

```java

int number;

```

`int`は整数型を表し、`number`は変数名です。このように変数の型と変数名を決めることで値をデータに格納するための準備ができます。

変数の初期化と代入方法

変数を宣言した後、初期値を設定することを「初期化」といいます。初期化を行うことで、変数に最初から特定の値を持たせることができます。

初期化の基本形式は以下の通りです。

```java

データ型 変数名 = 初期値;

```

以下のサンプルコードを見ていきましょう。

```java

int age = 20;

```

整数型の変数`age`を宣言し、初期値として20を設定しています。

変数への代入は、変数に新たな値を割り当てる操作です。代入演算子`=`を使用して行います。

変数がすでに宣言されている場合、新しい値を次のようにして代入可能です。

```java

変数名 = 新しい値;

```

例えば、先ほど宣言した変数`age`に新たな値25を代入するには、以下のように記述します。

```java

age = 25;

```

これにより、age変数の値は25に更新されます。

データ型と参照型

Javaの変数には、基本データ型(プリミティブ型)と参照型の2つが存在します。

基本データ型は、Javaが元々持っている基本的なデータ型で、メモリ上に直接値を格納する変数の型です。

基本データ型は以下の8つがあります。

データ型 byte short int long float double char boolean
名称 バイト型 短整数型 整数型 長整数型 単精度浮動小数点数型 倍精度浮動小数点数型 文字型 ブーリアン型
消費メモリ 1バイト 2バイト 4バイト 8バイト 4バイト 8バイト 2バイト 1バイト
範囲 -128 ~ 127 -32,768 ~ 32,767 -2,147,483,648 ~ 2,147,483,647 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ±3.40282347E+38 ~ ±1.40239846E-45 ±1.79769313486231570E+308 ~ ±4.94065645841246544E-324 ¥u0000 ~ ¥uFFF true (真) または false (偽)

例えば、`int`型の変数を宣言し、整数値を格納するサンプルコードを見ていきましょう。

```java

int number = 10;

```

この場合、変数`number`はメモリ上に直接値10を保持します。

一方、参照型はオブジェクトへの参照(アドレス)を格納する変数です。参照型には、クラス、インターフェース、配列などがあります。

基本データ型と異なり、参照型の変数はデータそのものではなく、データが格納されているメモリの場所(参照)を保持します。

例えば、`String`型の変数を宣言し、文字列を格納することが可能です。

```java

String greeting = "Hello, World!";

```

この場合、greeting変数は文字列”Hello, World!”が格納されているメモリの場所への参照を保持します。

基本データ型はメモリ効率が良いですが、参照型はオブジェクトの参照を格納するため、ややメモリ使用量が多くなります。

また基本データ型にはデフォルト値があります(例: `int`のデフォルト値は0)が、参照型のデフォルト値は`null`という違いがありますね。

基本データ型はシンプルなデータを扱う際に使われ、参照型はオブジェクトや配列など、より複雑なデータ構造を扱うときに使うと覚えておきましょう。

変数名の命名規則と注意点

変数名は、プログラム内でデータを識別するためのラベルとして機能しますが、いくつかの注意点があります。

まず変数を命名する前に以下3つのルールを確認しておきましょう。

  • アルファベットの大文字(A~Z)と小文字(a~z)、数字、アンダースコア(_)、ドル記号($)のみ使用可能
  • 数字で始めることはできない
  • Javaの予約語は使用できない

具体例を用いて解説していきますね。

変数名には英字、数字、アンダースコア(_)、ドル記号($)のみ使用可能なので、ハイフン(-)を使用した`user-name`は不適切です。正しくは、`user_name`とするのが良いでしょう。

数字で始めることはできないので、`2ndPlace`も不適切です。2文字目以降は使えるので`number2`とすれば変数として使えます。

最後に予約語の命名規則に関して解説しますね。予約語とは、言語の構文の一部として予め定義されている単語のことです。

例えば、`if`、`else`、`while`、`for`、`class`、`public`、`private`、`return`などがJavaの予約語です。これらは変数名として使用できないので注意しましょう。

変数の用途が一目で分かる名前を付けることが重要です。例えば、ユーザーの年齢を保持する変数には`age`、商品の価格を保持する変数には`price`といった具体的な名前を付けましょう。

またプロジェクト内で一貫性のある命名規則を使用することで、コードの可読性が向上します。例えば、キャメルケースの記述方式(例:`userName`)やスネークケース(例:`user_name`)など、一貫したスタイルを選択しましょう。

なお、Javaの演算子についてより詳しく知りたい人は次の記事を参考にしてください。

Java演算子の基礎!種類や使い方をわかりやすく解説

Javaにおける変数の宣言・初期化の方法

ここからは、次のトピック別でJavaにおける変数の宣言・初期化の方法を解説します。

宣言から初期化までの流れ

ここでは、先に学んだ変数の宣言から初期化までを一連の流れとして見ていきJavaの変数に関して復習していきましょう。

変数の宣言とは、変数を使用するためにその型と名前を指定することでしたね。例えば、整数型の変数を宣言するには以下のように記述します。

```java

int number;

```

`int`は整数型を表し、`number`は変数名です。初期化は宣言と同時に行うことも、宣言後に別のステップで行うこともできます。

```java

int number = 10;

```

整数型の変数`number`が宣言され、同時に初期値10が割り当てられていますよ。

変数が初期化された後、新しい値を代入することができ、代入には代入演算子`=`を使用します。

```java

number = 20;

```

変数`number`の値は20に更新されます。これら全てを合わせると以下のようなサンプルコードになります。

```java

class Main {
    public static void main(String[] args) {
        // 変数の宣言
        int num;

        // 変数の初期化
        num = 10;

        // 出力
        System.out.println(num); // 10

        // 変数への代入
        num = 20;

        // 出力
        System.out.println(num); // 20
    }
}

```

サンプルコードでは、整数型の変数`num`を宣言し、初期化してから新しい値を代入していますね。

変数の宣言から初期化、そして代入までの流れを理解することで、プログラム内でデータを管理できるようになります。

同時宣言と初期化

同時宣言と初期化とは、変数を宣言すると同時にその変数に初期値を割り当てることを指します。同時宣言でコードを記述するのが一般的なので、使い方を覚えていきましょう。

基本的な書式は以下の通りです。

```java

データ型 変数名 = 初期値;

```

データ型 変数名で宣言後に、`データ型 変数名 = 初期値;`にしなくても上記で宣言と初期化が完結します。

例えば、文字列型の変数nameを宣言し、同時に初期値として”Java”を割り当てる場合、以下のように記述します。

```java

String name = "Java";

```

また同じデータ型の複数の変数を同時に宣言し、初期化することもできます。

例えば、整数型の変数x、y、zを同時に宣言し、それぞれに初期値を割り当てる場合を見ていきましょう。

```java

int x = 1, y = 2, z = 3;

```

このようにカンマで区切ることで同時に宣言、初期化ができます。

整数型の変数`num`と文字列型の変数`name`を同時に宣言し、初期化し、それぞれの変数の値を出力させると以下のようになります。

```java

class Main {
    public static void main(String[] args) {
        // 変数の同時宣言と初期化
        int num = 10;
        String name = "Java";

        // 出力
        System.out.println("num: " + num);
        System.out.println("name: " + name);
    }
}

```

同時宣言と初期化を使用することで、コードを簡潔にし、変数の管理を効率的に行うことができるので、変数の初期値が明確な場合に便利です。

Java変数におけるデータ型の前提知識

Javaでは、変数を宣言する際、データ型を指定しなければいけません。型には以下の2種類があります。

  • 基本データ型(プリミティブ型)
  • 参照型/li>

本章では、ソースコードを交えて具体的に解説していきますね。

基本データ型(プリミティブ型)

基本データ型は、Javaが元々持っている基本的なデータ型で、メモリ上に直接値を格納する変数の型でしたね。

基本データ型は以下の8つです。

データ型 byte short int long float double char boolean
名称 バイト型 短整数型 整数型 長整数型 単精度浮動小数点数型 倍精度浮動小数点数型 文字型 ブーリアン型
消費メモリ 1バイト 2バイト 4バイト 8バイト 4バイト 8バイト 2バイト 1バイト
範囲 -128 ~ 127 -32,768 ~ 32,767 -2,147,483,648 ~ 2,147,483,647 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ±3.40282347E+38 ~ ±1.40239846E-45 ±1.79769313486231570E+308 ~ ±4.94065645841246544E-324 ¥u0000 ~ ¥uFFF true (真) または false (偽)

このうち、整数を扱う型は以下の4つです。

  • byte型
  • short型
  • int型
  • long型

表の扱える範囲をみて使い分けると良いでしょう。扱える範囲が広いほど消費メモリが多くなるので、用途に合わせて型を使い分けるのが重要です。

byte型は小さな整数値を扱う場合に使用され、メモリの節約が必要な場合に便利です。

```java

byte myByte = 100;
System.out.println(myByte);

```

一方で、long型は非常に大きな数値を扱う必要がある場合に便利です。

```java

long myLong = 15000000000L;
System.out.println(myLong);

```

小数点を扱う場合の型は以下の2つです。

  • float型
  • double型

float型は、小数点を含む数値で、精度がそれほど重要でない場合に適しています。

```java

long myLong = 15000000000L;
System.out.println(myLong);

```

double型は、小数点を含む数値で、高い精度が求められる場合に適しています。

```java

long myLong = 15000000000L;
System.out.println(myLong);

```

文字や記号など一文字のUnicode文字を扱う場合にはchar型を使います。

```java

char myChar = 'A';
System.out.println(myChar);

char myUnicodeChar = '\u0041'; // Unicodeで 'A'
System.out.println(myUnicodeChar);

```

boolean型は、真偽値(trueまたはfalse)を扱うための型で、条件分岐やループ制御などでよく使われます。

```java

boolean isJavaFun = true;
boolean isFishTasty = false;
if (isJavaFun) {
    System.out.println("Java is fun!");
} else {
    System.out.println("Java is not fun.");
}

```

基本データ型を適切に使用することで、Javaプログラム内でさまざまな種類のデータを効率的に扱うことができます。

なお、下の記事ではJavaのStringをintに変換する方法を詳しく解説しているので、よければ参考にしてください。

JavaのStringをintに変換するには?方法から使い方まで紹介

ラッパークラスの活用

ラッパークラスとは、基本データ型(プリミティブ型)のデータをオブジェクトとして扱うためのクラスです。

基本データ型はオブジェクトではないため、オブジェクトとしての操作やメソッドの呼び出しができません。

Javaでは、すべての基本データ型に対応するラッパークラスが用意されています。以下のプリミティブ型とラッパークラスの対応表を見ていきましょう。

プリミティブ型 boolean byte char short int long float bdouble
ラッパークラス Boolean Byte Character Short Integer Long Float Double

ラッパークラスを使用するソースコードを見ていきましょう。

コレクションフレームワークはオブジェクトのみを格納できるため、プリミティブ型の値をコレクションに格納するにはラッパークラスを使用します。

```java

ArrayList list = new ArrayList<>();
list.add(10);  // int型の値が自動的にIntegerオブジェクトに変換されて格納される

```

またプリミティブ型は`null`値を持つことができませんが、ラッパークラスのオブジェクトは`null`値を持つことができます。

```java

Integer nullableNum = null;

```

Java 5以降では、プリミティブ型の値と対応するラッパークラスのオブジェクト間で自動的な変換であるオートボクシングとアンボクシングが行われます。

オートボクシングは、プリミティブ型の値を対応するラッパークラスのオブジェクトに自動的に変換するものです。

```java

// オートボクシングの例
Integer myInteger = 10;  // int型の値が自動的にIntegerオブジェクトに変換される

```

プリミティブ型の値をラッパークラスのオブジェクトが必要な場所に直接使用できるようになります。

アンボクシングは、ラッパークラスのオブジェクトを対応するプリミティブ型の値に自動的に変換するものです。

```java

// アンボクシングの例
Integer myInteger = new Integer(10);
int myInt = myInteger;  // Integerオブジェクトが自動的にint型の値に変換される
```

ラッパークラスのオブジェクトをプリミティブ型の値が必要な場所に直接使用できるようになります。

オートボクシングとアンボクシングは、パフォーマンス上のコストがかかる場合があるため、頻繁な変換が発生する場面では注意が必要です。

なお、Javaのnullについてより詳しく知りたい人は次の記事を参考にしてください。

Javaでnull判定する方法!Optionalクラスの基礎も解説

特定のデータ型を使用する際の注意点

Javaで特定のデータ型を使用する際には、いくつかの注意点があります。まず変数の値がそのデータ型の範囲を超えると、オーバーフローが発生し、予期せぬ値になります。

オーバーフローとは、計算結果がそのデータ型で表現できる範囲を超えてしまうことを指します。

```java

int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue);  // 2147483647
maxValue++;
System.out.println(maxValue);  // -2147483648 (オーバーフロー)

```

`Integer.MAX_VALUE`は、`int`型で表現できる最大の整数値です。`maxValue++;`で1加算されるのでオーバーフローが発生しています。

`int`型の範囲を超えてしまうため、最小値である-2147483648にラップアラウンド(巻き戻り)していますよ。

floatやdouble型は小数点を含む数値を表現するためのデータ型ですが、これらの型は数値を2進数で表現するため、10進数での完全な精度を持つことができない場合があります。

```java

double a = 0.1;
double b = 0.2;
System.out.println(a + b);  // 出力: 0.30000000000000004

```

この例では、0.1と0.2をdouble型で表現していますが、これらの値は2進数で完全に表現できないため、微小な誤差が生じます。

その結果、a + bの計算結果は厳密には0.3ではなく、0.30000000000000004となってしまっていますね。

金額などの正確な値が必要な場合には、BigDecimalクラスを使用するようにしましょう。

BigDecimalクラスは、任意の精度の小数点数を扱うことができ、数値の精度を保ったまま計算を行うことができます。

```java

import java.math.BigDecimal;

BigDecimal x = new BigDecimal("0.1");
BigDecimal y = new BigDecimal("0.2");
BigDecimal sum = x.add(y);
System.out.println(sum);  // 出力: 0.3

```

BigDecimalを使用することで、正確な0.3という結果を得ることができます。

ラッパークラスのオブジェクトはnullを持つことができますが、アンボクシング時に`null`が含まれていると`NullPointerException`が発生します。

```java

Integer myInteger = null;
// int myInt = myInteger;  // NullPointerExceptionが発生する

```

また、頻繁なオートボクシングとアンボクシングはパフォーマンスに影響を与える可能性があるので注意しましょう。

Javaにおける変数の応用的な使い方

最後に、次のトピック別でJavaにおける変数の応用的な使い方を解説します。

変数のスコープ・種類

ローカル変数は、メソッド内で宣言される変数です。ローカル変数は、そのメソッド内でのみ有効であり、メソッドの外からはアクセスできません。

```java

public void myMethod() {
    int localVar = 10;  // ローカル変数
    System.out.println(localVar);
}

```

`myMethod `メソッド内に `localVar` というローカル変数が定義されています。

`localVar `は `myMethod `メソッド内でのみ使用でき、メソッドの外側からはアクセスできません。

`myMethod `メソッドが終了すると、`localVar` のスコープも終了し、その変数はメモリから削除されます。

一方、インスタンス変数は、クラス内でメソッドの外側に宣言される変数です。

インスタンス変数は、そのクラスのオブジェクトが存在する限り有効であり、オブジェクト内のメソッドからアクセスできます。


```java

public class MyClass {
    int instanceVar;  // インスタンス変数

    public void myMethod() {
        instanceVar = 20;
        System.out.println(instanceVar);
    }
}

```

上記では、`instanceVar`という名前のインスタンス変数を定義しています。

インスタンス変数は、クラスのオブジェクト(インスタンス)ごとに個別の値を持つことができるので`MyClass`の異なるオブジェクトは、`instanceVar`に異なる値を持つことができますよ。

変数の上書き・管理

変数の上書きとは、変数に新しい値を代入して以前の値を置き換えることです。変数に新しい値を代入すると、以前の値は失われます。

```java

int number = 5;
number = 10;  // numberの値が5から10に上書きされる
System.out.println(number);  // 出力: 10

```

この例では、`number` の値は最初の 5 から新しい値 10 に上書きされますよ。

参照型変数の場合、オブジェクトへの参照を新しいものに変更することで上書きが行われます。

```java

String greeting = "Hello";
greeting = "Goodbye";  // greetingの参照先が"Hello"から"Goodbye"に上書きされる
System.out.println(greeting);  // 出力: Goodbye

```

上記では最初に `greeting` に “Hello” という文字列オブジェクトへの参照を代入し、同じ変数 `greeting` に新しい文字列オブジェクト “Goodbye” への参照を代入しています。

参照型変数に新しいオブジェクトへの参照を代入すると、以前のオブジェクトへの参照は失われ、新しいオブジェクトへの参照で上書きされ、`greeting `の参照先が最初の “Hello” から新しい “Goodbye” に上書きされます。

最後に変数の管理に関してです。同じスコープ内で同じ名前の変数を宣言すると、最初の変数は隠されてしまいます。

```java

int number = 30;
{
    int number = 40;  // 内側のスコープで同じ名前の変数を宣言
    System.out.println(number);  // 出力: 40 (内側の変数が優先される)
}
System.out.println(number);  // 出力: 30 (外側の変数が有効)

```

`number`という名前の変数を宣言し、30という値を代入しています。

内側のスコープで、同じ名前`number`の変数を再度宣言し、40という値を代入していますが、この変数は内側のスコープでのみ有効です。

内側のスコープで`number`の値を出力すると、参照されるのは内側のスコープで宣言された`number`変数の40になります。

外側のスコープで`number`の値を出力すると、外側のスコープで宣言された`number`変数が有効になり、値は30になります。

サンプルコードを通じた実践方法

ここでは、基本的なサンプルコードをいくつか紹介します。Javaのプログラミング方法を実践的に学びましょう。

以下のサンプルコードを見ていきましょう。

```java

public class Main {
    public static void main(String[] args) {
        int score = 75;  // スコアの宣言
        if (score >= 80) {
            System.out.println("優秀です!");
        } else {
            System.out.println("もう少し頑張りましょう。");
        }
    }
}

```

int型の変数`score`を宣言し、75という値を代入しています。

if文を使用して、`score`の値が80以上の場合、”優秀です!”と出力しされ、そうでない場合(scoreが80未満の場合)、”もう少し頑張りましょう。”と出力しますよ。

`score`の値が75なので、条件式`score >= 80はfalse`と評価され、`else`ブロック内のコードが実行され、コンソールに”もう少し頑張りましょう。”と出力されます。

以下のサンプルコードを見ていきましょう。

```java

public class Main {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};  // 配列の宣言
        for (int number : numbers) {
            System.out.println("配列の要素: " + number);
        }
    }
}

```

int型の配列`numbers`を宣言し、初期値として{1, 2, 3, 4, 5}を代入しています。

拡張forループを使用して配列`numbers`の各要素に対してループ処理を行っていますよ。実行すると、配列`numbers`の各要素が順に出力されます。出力結果は以下のようになります。

```java

//出力結果
配列の要素: 1
配列の要素: 2
配列の要素: 3
配列の要素: 4
配列の要素: 5

```

Javaプログラミングのスキルを活かして収入を増やすなら

なかには、副業での収入獲得やフリーランスへの独立を目的にJavaプログラミングのスキル習得に励んでいる人もいますよね。

ただ、身につけたスキルをどう収入UPに繋げればいいのか、イメージが湧かない人もいるはず。

そんな方は、ぜひフリーランスのミカタをご活用ください。

出典:フリーランスのミカタ

フリーランスのミカタは、平均単価80万円以上の案件を取り揃える、ITエンジニアに特化したフリーランスエージェントです。具体的には、次のような週3回からフルリモートで請け負える案件を豊富に掲載しています。

また希望年収や稼働時間だけでなく、扱うプログラミング言語などを細かく指定して案件を探せるため、自分にあう仕事を見つけやすいサイト仕様になっています。

ただし、上記のような案件は条件として2〜3年の実務経験が求められるケースが多いです。そのため、応募する際はどれくらいの経験が必要なのかを前もってチェックしておきましょう。

フリーランスのミカタを活用すれば、中・長期的な安定収入が得られる案件が見つかりますよ。

どんな案件が掲載されているか気になる人は、下のボタンから自分にあう案件を探してみてください。

まとめ

これまで、変数を宣言する方法や変数に値を代入する方法について説明しました。

変数はデータを格納するための基本的な構成要素であり、変数を使って処理を記述しておけば、後は代入する値を変更するだけで異なる結果を出力することができて便利です。

まだまだ知識が浅く、Javaの他の処理に関しても基礎知識をつけたい!注意点や実践的な使い方を知りたい!という方もいるでしょう。

本記事ではプログラミングに関する多くの疑問を解決できるので、参考にしてみてくださいね。

なお、下の記事ではJavaのコンパイルについて詳しく解説しているので、よければ参考にしてください。

Javaのコンパイルとは?実行方法からjavacコマンドの基礎知識も紹介