Javaプログラミング入門 2章 [値の基本]

Java

こんにちは。ECF Techブログ
担当 Michiharu.Tです。

Javaプログラミング入門記事の第2章をお送りいたします。
第2章のテーマは「値の基本」です。

本連載の初回および章立ての一覧については下記のリンクから確認できます。

Javaプログラミング入門 0章
0章 Javaプログラミングを始めよう こんにちは。ECF Techブログ 担当 Michiharu.Tです。 この記事はプログラミング言語のJavaを、実際に動かしながら学びたい人のための学習教材となっています。手を多く動かすこと、感覚を...

解説動画

2023/12/01 解説動画を掲載しました。

2-1 リテラルと型

プログラム中に直接記述できる値をリテラルと言います。また、書き方によって値の種類が決まります。この種類をデータ型またはと言います。

いくつかの値の書き方を使用したプログラム例を下に示します。

プログラム例

public class Main{
    public static void main(String[] args){
        System.out.println("Hello");//文字列
        System.out.println(123);//整数
        System.out.println(12.3);//小数点数
    }
}

解説
1章で登場した"で囲んだ書き方だと値の種類は文字列と認識されます。123は整数、12.3は小数点数と認識されます。

2-1-1 型名

型にはそれぞれ正式な名称があります。これを型名と言います。代表的な書き方とその時に判定される型名を下表に示します。

書き方例 型名 型の説明
123 int 整数を表します。
12.3 double 浮動小数点数を表します。
'A' char 1文字を表します
"Hello" String 複数文字(文字列)を表します。
浮動小数点数はコンピュータにおける小数の表現方法の1つです。誤差がでる可能性がある。などの注意点はありますが、一旦は一般的な小数と考えておいて問題ありません。

2-2 変数

変数は値を入れておくためのコンピュータ内の入れ物です。変数を使うことで複雑な処理を実現することができます。

2-2-1 変数の使い方

変数を使うための3つのステップを示します。

それぞれの書き方について、1つずつ確認します。

(1)変数の宣言

変数の宣言(変数宣言)とは、変数を準備することです。文法は次のようになります。

型名 変数名;

変数名は変数につけられる名前です。どのような値が入っているかが分かりやすい名前を付けるようにしましょう。

整数を入れる変数を準備したいときは

int val;

のように記述します。変数名はvalとしました。

変数名は一定のルールにしたがって、自由につけることができます。変数名のルールについては、2-5でご説明致します。

(2)値の代入

変数を作ったら値を入れます。変数に値を入れることを代入と言います。値を代入する文法は次のとおりです。

変数名 = 値;

変数val5を入れておきたいときは下のように記述します。

val = 5;

(3)変数の利用

値が代入できたら、変数を使うことができます。変数名をプログラム中に書けばリテラルのように利用することができます。

3つの手順を含んだプログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        //変数の宣言
        int val;
        //値の代入
        val = 5;
        //変数の利用
        System.out.println(val);
    }
}

実行結果

5

解説
3つの命令文が記述されています。各文上のコメントがそれぞれ処理内容を示しています。コメントにあるとおり、

  • int val;で変数を宣言
  • val = 5で変数に値を代入
  • System.out.println(val)で変数

という順番で処理を行っています。

2-2-2 変数の性質

変数の性質についていくつか説明します。

(1)変数宣言と同時に代入

次のように記述すると、変数の宣言と値の代入を1つの文で記述できます。

型名 変数名 = 値;

プログラム例を示します。この文は変数valを宣言すると同時に5を代入します。

int val = 5;

(2)再代入と上書き

変数は何度でも値を代入できます。値を再度代入すると、もとの値が上書きされます。プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int val = 5;
        val = 8;
        System.out.println(val);
    }
}

実行結果

8

解説
この例では最初に変数宣言と同時に5が代入されます。ですが、次の行で8を再代入しているため、System.out.println(val);では8が表示されます。

(3)変数の複数宣言

変数は複数宣言できます。プログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int a = 5;
        int b = 8;
        System.out.println(a);
        System.out.println(b);
    }
}

実行結果

5
8

解説
2つの変数abを宣言し、それぞれ58を代入しています。

1つのブロック内に同じ名前の変数を複数宣言することはできません。次のような記述はエラーとなります。

int a;
int a;

(4)変数と型

変数宣言の時に記述した型と値の型は一致させる必要があります。たとえば次のような記述はエラーとなります。

int val = 3.5;

エラーメッセージは次のとおりです。

Main.java:3: エラー: 不適合な型: 精度が失われる可能性があるdoubleからintへの変換
                int val = 3.5;
                          ^
エラー1個

変数の型がint型であるのに対し、値はdouble型と判断されます。そのため、型が合わずエラーとなります。

もう1つエラーになる例を示します。

char c = "こんにちは";    //char型の変数にString型の値を代入

コメントに記載のとおり、変数の型と異なる値を代入しています。

2-3 基本データ型

Javaの型には基本データ型と参照型の2種類があります。ここでは基本データ型についてご紹介します。

基本データ型は次の8種類です。

型名 概要 リテラルの書き方例 サイズ
long 大きな整数値 123456789012L 8バイト
int 整数値 12345678 4バイト
short 小さな整数値 - 2バイト
byte ごく小さな整数値 - 1バイト
double 浮動小数点数 12.3 8バイト
float 低精度の浮動小数点数 12.3f 4バイト
char 1文字 'あ' 2バイト
boolean 真偽値 true -
  • long型のリテラルは値の末尾にLまたはlをつけます。
  • float型のリテラルは値の末尾にfまたはFをつけます。
  • boolean型のリテラルはtruefalseの2つのみです。
  • サイズは値1つの情報量です。この値が大きいほど表現できる値の幅が大きくなります。

まずは利用頻度の高いint,double,booleanを覚えておくと良いでしょう。

String型
文字列を表すString型は基本データ型には含まれません。String型は参照型に分類されます。参照型については後の章でご紹介予定です。

さまざまなリテラルを使ったプログラム例を示します。

プログラム例

public class Main{
    public static void main(String[] args){
        int i = 10;
        float f = 3.14f;
        char c = 'あ';
        boolean b = false;
        System.out.println(i);
        System.out.println(f);
        System.out.println(c);
        System.out.println(b);
    }
}

実行結果

10
3.14
あ
false

解説
4種類の変数とその型に合った値の代入を行っています。それぞれの変数をSystem.out.printlnで表示しています。

2-3-1 数値型の最大値・最小値

整数型のlongintshortbyteおよび、浮動小数点数型のdoublefloatについて、最大値・最小値を表示するプログラムをご紹介します。

プログラム例

public class Main{
    public static void main(String[] args){
        //整数型の最大値
        System.out.println(Long.MAX_VALUE);//long
        System.out.println(Integer.MAX_VALUE);//int
        System.out.println(Short.MAX_VALUE);//short
        System.out.println(Byte.MAX_VALUE);//byte
        //浮動小数点数型の最大値
        System.out.println(Double.MAX_VALUE);//double
        System.out.println(Float.MAX_VALUE);//float
    }
}

実行結果

9223372036854775807
2147483647
32767
127
1.7976931348623157E308
3.4028235E38

解説
プログラム中のコメントにあるとおり、long、int、short、byte、double、floatの順に各最大値を表示しています。doubleとfloat型は指数を使った表記となっています。たとえば3.4028235E38は、3.4028235×1038であることを表します。

続いて最小値です。

プログラム例

public class Main{
    public static void main(String[] args){
        //整数型の最小値
        System.out.println(Long.MIN_VALUE); //long
        System.out.println(Integer.MIN_VALUE);  //int
        System.out.println(Short.MIN_VALUE);//short
        System.out.println(Byte.MIN_VALUE);//byte
        //浮動小数点数型の最小値
        System.out.println(Double.MIN_VALUE);//double
        System.out.println(Float.MIN_VALUE);//float
    }
}

実行結果

-9223372036854775808
-2147483648
-32768
-128
4.9E-324
1.4E-45

解説
最大値のプログラムでMAXだった部分がMINに変わっています。

float型とdouble型の最大・最小はそれぞれ、絶対値の最大・最小と考えると良いでしょう。float型を例に表現範囲を図に示します。

オレンジ色は表現可能な範囲、灰色の部分は0に近い精細な値のため表現できない範囲です。

2-3-2 リテラル値のエラーパターン

次にリテラル値の書き方でエラーを引き起こすケースについてご紹介します。

System.out.println(123456789012);   //(1)
float f = 1.23; //(2)
  • (1)は123456789012がint型と判断されます。ですが、int型の表現範囲を超えた値となっているためエラーとなります。数値部分を123456789012Lなどと表記する必要があります。
  • (2)は1.23がdouble型と判断されます。代入しようとしている変数はfloat型なので、型が合わずエラーとなります。1.23fなどと表記する必要があります。

2-4 代入のルール

変数に値を代入する際のルールについて確認します。変数に代入が可能なのは、原則として同じ型の値のみ。ですが一部例外的なルールもあります。この例外的なルールをプログラム例と共にご紹介します。

2-4-1 大は小を兼ねる

サイズの大きな変数には、サイズの小さな値を代入できます。下は正しく動作するプログラム例です。

double d = 123; //double型の変数にint型の値を代入
short s = 30000;//short型の変数にint型の値を代入

1行目の123はint型のリテラルです。double型はint型よりもサイズの大きな型なので、double型の変数にint型の値が代入できます。

一方で2行目の30000はint型のリテラルです。short型はint型よりもサイズの小さな型なので、この代入には違和感があります。

この代入が可能な理由はshort型の表現範囲にあります。short型の表現可能な値は -32768〜32767 までです。30000はこの範囲に収まっているため、代入が許可されています。

それぞれの型の細かい表現範囲を覚える必要は特にありません。必要に応じてインターネットで調べたり、エラーと向き合う過程で学んでいけば問題ありません。

2-4-2 変数は型で判断される

変数の値を利用する場合、値のサイズは型で判断されます。たとえば次のような例を見てみましょう。

long a = 123;
int b = a;

始めにlong型の変数aに123を代入しています。次にint型の変数bに変数aの値を代入しようとしています。aの値は123なのでint型の変数bに十分収まりますが、変数aはlong型であるため、変数bのint型より大きい型と見なされ、コンパイルエラーとなります。

2-5 識別子

識別子はクラス名や変数名などの、プログラマ自身が名前づけできるものの総称です。識別子の名前づけには次のようなルールがあります。

  • 大文字と小文字は区別される
  • 先頭に数値は使用できない。
  • 予約語は使用できない。
  • true,false,nullは使用できない。

正しい変数宣言の例を示します。

int hello;
int _2;
int $;
int あ;
日本語(ひらがな・カタカナ・漢字など)も変数名として使えますが、推奨されません。半角の英大文字・小文字・記号(-,_など)で構成するようにしましょう。

もう1つ、正しく動作する例を示します。

int value = 5;
int Value = 10;
System.out.println(value);
System.out.println(Value);

実行結果

5
10

1つめの変数名はvalue、2つめの変数名は先頭1文字だけ大文字でValueとなっています。この2つの変数は別物として区別されるため正しく動作しますが、紛らわしいため、変数宣言の方法としては推奨されません。

次にエラーとなる変数宣言の例を示します。エラー理由はコメント部分に記載しています。

int 2nd;    //先頭が数値になっている
int if;     //予約語を使っている

2-5-1 予約語

予約語Javaの構文の一部として用いられる単語のことです。これらを識別子として使うことはできません。

abstract assert boolean break byte case
catch char class const continue default
do double else enum extends final
finally float for if goto implements
import instanceof int interface long native
new package private protected public return
short static strictfp super switch synchronized
this throw throws transient try void
volatile while _
タイトルとURLをコピーしました