Chapter 05

Javaの変数・データ型

おでん
おでん
2021.08.03に更新

変数宣言

Javaにおける変数宣言は以下のように記述します。

データ型 変数名;

値の代入は以下のように記述します。

変数名 = 値;

変数宣言と値の代入を同時に行うこともできます。

データ型 変数名 = 値;
int x = 10;

データ型

データ型は大きく以下のように分けられます。

  • 整数型
  • 小数型
  • 文字列型
  • ブール型

整数型

整数型は以下のように分かれます。

  • byte:-128~127
  • short:-3万~3万
  • int:-20億~20億
  • long:intを超える整数

longに関しては、末尾に「L」をつける必要があります。

小数型

小数型は以下のように分かれます。

  • float:メモリサイズ32bit
  • double:メモリサイズ64bit(より細かい)

floatに関しては、末尾に「F」をつける必要があります。

文字列型

文字列型は以下のように分かれます。

  • char:1文字(シングルクォーテーション)
  • String:2文字以上(ダブルクォーテーション)

ブール型

ブール型は以下の1つです。

  • boolean:trueもしくはfalse

初期値はfalseです。

基本型と参照型

上記で挙げてきたデータ型は、以下の2種類に分かれます。

  1. 基本型
  2. 参照型

ここは少し難しいところですが、違いをはっきりと理解しておく必要があります。
なぜなら、変数に代入されている値を見誤ってしまう可能性があるためです。
基本型と参照型の違いは以下の通りです。

データ型 変数に格納するもの 対象データ型
基本型 値そのもの boolean,byte,char,short,int,float,long,double
参照型 オブジェクトまたは配列の参照値 String,配列

ただ、この部分に関しては次チャプターの比較演算子「==」「!=」のところで解説します。

リテラル

リテラルとは、値の表し方です。
例えば、「10」を見た時、私たちは10進数の「10」と判断します。
しかし、2進数の「1」「0」の可能性もあります。
このように判断しきれないことがないように、リテラルで明示します。

整数リテラル

整数 Prefix(先頭)
10進数 なし 10
8進数 0 012
16進数 0x 0xA
2進数 0b 0b1010

上記例の表し方は異なりますが、全て「10」という値を表しています。

浮動小数点リテラル

浮動小数点 表し方
float型 末尾にf(またはF) 10.5f
double型 末尾にd(またはD) 10.5d
指数 e(10のn乗) 2e4 → 2.0x10の4乗 → 20000.0

文字リテラル

文字 表し方
char型(1文字) 「''」で囲む 'A'
char型(unicode) '¥u + unicodeアドレス' '¥u0041'

文字列リテラル

文字列 表し方
String型 「""」で囲む "abc"

論理値リテラル

論理値 表し方
boolean型 trueまたはfalse boolean bool = true;

nullリテラル

null 表し方
null型 (値なし) int var = null;

エスケープシーケンスとは

エスケープシーケンスとは、文字列で表せない文字を、特殊な記述で表すことです。
例えば、「¥」という文字を表示したいとします。しかし、「¥」は特殊文字として認識され、変換されてしまいます。すると、「¥」という文字を表示することができません。
このような時に、エスケープシーケンスを使用します。
主なエスケープシーケンスは以下です。
(macOSの場合は、先頭の「¥」は「\」を使用)

エスケープシーケンス 表示
¥¥ 「¥」を表示
¥n 改行する
¥t タブ
¥' 「'」を表示
¥" 「"」を表示

スコープとは

スコープとは、 変数の有効範囲のことです。その範囲は、変数宣言されたブロック内({}で囲まれた範囲)です。
スコープには以下2種類あります。

  1. メンバ変数のスコープ:クラスに属する変数→スコープはクラス全体
  2. ローカル変数のスコープ:メソッドやコンストラクタに属する変数→スコープはそのメソッドやコンストラクタ内(つまり、{}内)

以下、例です。

class A { 
    int a = 10;   //クラスに属するメンバ変数(a)

    public static void main(String args[]){ 
        int b = 100;   //メソッドに属するローカル変数(x)
        A num = new A();
        num.show();
    }

    void show(){ 
        int c = 1000;  //メソッドに属するローカル変数(y)
        System.out.println("変数aは" + a + "です。");
        System.out.println("変数bは" + b + "です。");
        System.out.println("変数cは" + c + "です。");
    }
}

これで実行すると、コンパイルエラーとなります。なぜでしょうか。
結果から言うと、スコープ外のものを参照しようとしている記述があるためです。
今回は下部の記述で、3つの「System.out.println」表示をしようとしています。1つずつみてみましょう。

変数aは、クラスに属する「int a = 10;」と宣言しているため、メンバ変数です。よって、クラス全体がスコープとなります。クラスは「class A」であり、その{}は上記記述の全てを囲っています。もちろん、呼び出しの「show()」も囲っているため、スコープ内です。よって、「変数aは10です。」と表示されます。

変数bは、mainメソッドに属する「int c = 1000;」と宣言しているため、ローカル変数です。よって、mainメソッド内がスコープとなります。mainメソッドのスコープの{}は真ん中3行を囲っています。よって、呼び出しの「show()」の範囲外となります。つまり、下部の変数bは参照できない状態であり、これによってコンパイルエラーが起きてしまいます。

変数cは、showメソッドに属する「int c = 1000;」と宣言しているため、ローカル変数です。よって、showメソッド内がスコープとなります。showメソッドのスコープの{}は下部4行を囲っています。呼び出しの「show()」の範囲内です。よって、「変数cは1000です。」と表示されます。