ITエンジニアのプレイングマネージャー化応援サイト

2.変数とデータ型

この記事では、当社 の新人エンジニア研修の参考にJava8を解説します。

前回はJava言語の特徴を解説しました。

今回は、変数とデータ型について解説します。

変数はデータに名前を付けたものだと思ってください。

変数を使うことでプログラミングではいろいろなことができるようになります。

 

コンピュータは大まかにいえば計算機です。

計算機の役割は、データを処理することです。

その際、データを一時的に保管する場所が必要なのです。

その場所に名前を付けたものを変数(へんすう)といいます。

実際には、メインメモリ上にデータの保管場所が用意されるのですが、

その場所を指定するのにメモリのアドレスを使用するとしたら大変です。

なぜなら、人間にとってアドレス表記はわかりやすいとは言えません。

そこで、分かりやすい変数名を付けて扱うのです。

変数というのは変わる数と書きます。

その名の通り、中身は変わっていく可能性があります。

それに対して変わらない数を定数(ていすう)といいます。

ここでは、変数、定数の順で学びます。

 

1.変数とは

次のプログラムを実行してみましょう。

7行目にあるように文字型はシングルクォーテーション ’ で囲います。

後で見る文字列がダブルクオーテーション ” で囲うのと区別してください。

何かで囲わないと変数名と区別がつかないから囲うのですね。

<実行結果>

10
8.0
false
C

「変数」はよく。

実際には、コンピュータのメモリ上に値が記憶されるのですが、その記憶領域に名前を付けたもの。

それが変数でした。

変数を作成することを「変数の宣言」といいます。

例えば、以下のようにデータ型を明示して宣言します。

int data1;

変数に値を入れることを「値の代入」といいます。

data1 = 10;

なお、変数の宣言と値の代入は以下のように1文に書くこともできます。

int data1 = 10;

変数に入っている値を見ることを「値の参照」といいます。

System.out.println(data1);

今回ご紹介したのはローカル変数といいます。

ローカル変数は、使用できる範囲(スコープといいます)が一番狭い変数です。

このあと、インスタンス変数、クラス変数という別種の変数が出てきますから混同しないようにしましょう。

 

なお、

int data1;

System.out.println(data1);

のようなプログラムを書くと

(中略)Uncompilable source code – 変数data1は初期化されていない可能性があります

と出力されます。

ローカル変数は初期化してから使います。

初期化とは、そろばんで言えば「ご破算」のようなもので、変数の値をクリアしてから使うために必要な処理です。

 

ちなみに、直接記述される定数値のことを「リテラル」といいますので、あわせて覚えてください。

Literary:文字通り という英語表現を聞いたことのある方もいらっしゃるのではないでしょうか?

上記プログラムの10、8.0、false、Cはいずれもリテラルです。

Javaには整数、浮動少数点数、真偽、文字の4つのリテラルがあります。

 

2.変数の宣言

変数の宣言では、変数に入れる値のタイプ(型)をはじめに指定する必要があります。

これが静的型付け言語のJavaの特徴です。

<構文>

型名 変数名;

Javaでは変数やメソッド、クラスなどの名前のことを識別子と呼びます。

識別子は数字から始めてはいけないことは覚えておきましょう。

また、使える記号はアンダースコアとドル記号のみです。

さらに、以下の予約語とリテラルは特別な意味のために予約されており、識別子には使えません。

これはつまり、intという名前の変数を作りたくてもできないということです。

もしも、

int int = 0;

のような書き方ができるとすると、以後、プログラム中に出てくる「int」という文字列がint型の宣言なのか、intという変数名なのか、分からなくなってしまうのですね。

 

Java8の予約語一覧今は覚えなくてよいですが、研修終了時には9割がた目にしたことがある状態になっているはずです。

abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if 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

Java8のリテラル一覧
※リテラルとはあらかじめ定められた文字列のこと

true false null

 

3.Javaで使用できる型

Javaで使用できる型をまとめました。

データ型
boolean true or false
byte 8ビット整数 -128~127
char 16ビットUnicode文字 ¥u0000~¥uFFFF
short 16ビット整数 -32,768~32,767
int 32ビット整数 -2,147,483,648~2,147,483,647
long 64ビット整数 -9,223,372,036,854,775,808~9,223,372,036,854,775,807
float 32ビット単精度浮動小数点数 -1.4E-45〜約340澗
double 64ビット倍精度浮動小数点数 -4.9E-324〜約1.7澗

覚え方としては以下の通りです。

booleanはブール代数から来ています。当社の研修の場合、真理値表は別メニューできているはずです。

byteは8ビットなので名前通りです。

charは文字を意味するcharacterから。文字コードを表現しますからマイナスの範囲はありません。世界中の文字を一つの文字コード体系で表現(Unicode)しようとしているため、16ビットです。

intは整数を意味するintegerから来ています。

数値リテラルはデフォルトでint型の値として解釈されるので整数を表すときには最もよく使われます。

このintを基準にビット数を半分にしたのがshort、倍にしたのがlongです。

2進数で考えると名前の意味がよくわかりますね。

floatは浮動小数点数を意味するfloating point numberから。

そして、floatの2倍のビット数があるからdoubleです。

一般的に実数(の近似)を表現するときにはdoubleを使います。

 

データ型はとても大切な考え方です。

なぜなら、その変数に入る値の範囲がデータ型で決まるからです。

例えば、byte型の変数に128は入れられないのです。

また、人間にとっては整数の1も実数の1.0も同じですが、すべてを2進数で表現するコンピュータでは以下のような違いがあります。

10進数表現 2進数表現(32ビット)
整数の1 0000 0000 0000 0000 0000 0000 0000 0001
実数の1.0f ※ 0011 1111 1000 0000 0000 0000 0000 0000

※floatとdoubleでも2進数表現は違います。したがってfloatの場合には数値の後ろにfをつける必要があります。

このように全くの別物です。

このことは、後で型変換(キャスト)という考えを学ぶときに必要になりますからここで理解しておきましょう。

ゆくゆくは全ての型を覚えたいですが、まずは、真偽値のboolean、整数値のint、浮動小数点数のdoubleの3つは最低限、覚えましょう

 

4.なぜ、変数を使うのか?

変数はなぜ必要なのでしょうか?

その答えを一言で言えば、変数を使うとデータに意味を与えることができ、変数の中身を使いまわすことができるのです。

以下のサンプルプログラムを見てください。

<結果>

あなたは今22才です
あなたは10年後32才です
あなたは20年後42才です
あなたは30年後52才です
あなたは40年後62才です
あなたは50年後72才です

ageが年齢であるというのはその名前から明らかです。

これが22という数値ですと、何なのか分かりませんね。

このように名前のついていないリテラルをマジックナンバー(magic number:魔法の数値)と言ったりします。

また、変数ageが使いまわされていますね。

もし、一つ年齢を重ねたとしたらどうでしょうか?

4行目だけを変更すればいいですね。

このように、変数を使うとデータに意味を与えることができ、変数の中身を使いまわすことができるのです。

 

5.定数を使うとき

変わりうるデータに付けた名前、それが変数でした。

一方、定数はその名の通り変わらない(変わりにくい)データに付けた名前です。

したがって次のようなことはできません。

 

例えば、次のサンプルプログラムを見てください。

<結果>

成人年齢は20才です
今年の成人は10年後30才です
今年の成人は20年後40才です
今年の成人は30年後50才です
今年の成人は40年後60才です
今年の成人は50年後70才です

まず、定数にはfinal:最後のという修飾子を付けます。

そしてすべて大文字にして単語と単語の間はアンダーバーでつなぐのがJavaプログラマの慣習です。

 

6.char型は整数であるということ

次のサンプルプログラムを見てください。

<結果>

a

char型のA(ラージA)に対して32を足すとa(スモールa)になりました。

char型が整数(文字コード)だからできることです。

大文字と小文字を相互に変換したり、英数記号でランダムなパスワードを生成したり、平文(ひらぶん)を暗号化して読めなくしてまた戻したりといった処理をコンピュータですることがありますが、

それができるのもchar型が整数だからなのですね。

 

7.クラスはパッケージに入れて管理する

今まで作成してきたJavaファイルがどこにあるかを確認します。

そうすると<デフォルトパッケージ>(別名:無名パッケージ)というところにあります。

これはあまり良い保管場所とは言えません。

Javaファイルもファイルですから、一般的なコンピュータファイルと同様、何らかの分類基準でフォルダで管理するのが良いのです。

そのフォルダのことをJavaではパッケージといいます。

しかもパッケージで管理することで、別のクラスから見られないクラスやフィールド、メソッドを作ることができるのです。

前回オブジェクト指向では、モノの世界と同じようにプログラムの部品を組み合わせるというお話をしました。

部品Aと部品がつながるとまずい、ということもあるわけです。

車でも発火プラグとガソリンタンクが直接つながると大爆発ですね。

 

さらにパッケージ管理することで分かりやすいクラス体系になります。

ということでここからはクラスをパッケージに入れることにしたいと思います。

こんな風に。

1行目の「package chap2; 」がこのクラスの所属するパッケージを示しています。

パッケージの名前は同じものがあってはいけません。

全く同じ名前のパッケージがあると区別ができないからです。

そのため、例えば会社で作成するクラスの場合ドメイン名を逆向きにした名前を使うのが一般的です。

例えば、当社の場合ですと

package jp.co.saycon.chap2;

のようになります。

しかし、みなさんは、研修中ですからそこまでの配慮は結構です。

パッケージ名は講師の指示に従ってください。

 

パッケージを分けたため、過去に使用したExample1というクラス名が使用できています。

これ以降は、章ごとのパッケージにクラスファイルを作成するようにします。

 

8.別パッケージのクラスを呼び出して使用する

では、別のパッケージにあるクラスを使用してみましょう。

今の日時を表示してみます。

<結果の例>

2021-01-07T16:45:55.276

現在のOSの日時が表示されました。

javaパッケージの中のtimeパッケージの中のLocalDateTimeクラスのnowメソッドを実行しています。

LocalDateTimeクラスは文字通り、あなたのOSのシステムが使っているローカルな日時のクラスです。

このようなクラスの指定方式を完全修飾クラス名(fully qualified class name:FQCN)といいます。

しかし、毎回、完全修飾クラス名を使うのは冗長に感じますね。

そこでこんな書き方ができます。

3行目にimportと書いて完全修飾クラス名が書いてありますね。

これで、クラス内ではクラス名だけを書けば良くなります。

よくある勘違いとして、importの語感から「ここでクラスを読み込んで使えるようにしている」というものがあります。

そうではなく、完全修飾クラス名を使わなくて済むためのimportです。

Javaのクラスは最初から全て使えるようになっています。

 

今後は、基本的にimport文を書いていくことにします。

また、IDEを使っているとクラスを簡単にインポートすることができますので、やり方を講師から聞いてください。

なお、

import java.time.*;

とアスタリスクを使うことでtimeパッケージのすべてのクラスをインポートすることができます。

ただし、インポートされるのはクラスだけでパッケージはインポートされません。

つまり、

import java.time.*;

と書いても、

java.time.chrono.JapaneseDate(和暦表示のためのクラス)などはインポートされませんので、ご注意ください。

 

import java.time.*;

import java.time.chrono.*;

と書くことで両方のパッケージをインポートすることができます。

※「import java.lang.*;」という記述は省略できます。いままでSystemクラスをインポートせずにprintlnメソッドを使えたのもSystemクラスがjava.langパッケージに含まれるからです。java.langパッケージに含まれる主なクラスとしては他に文字列のString、便利な計算道具があるMathなどがあります。

 

今回はJavaの変数とデータ型について見てきました。

次回は、演算子を学んでプログラムで様々な計算をさせてみましょう。

 

JavaSE8の解説に戻る

新入社員研修ポータル

IT企業の人財育成に関することなら全てお任せ下さい TEL 0120-559-463 受付時間 10:00 - 17:00 (土・日・祝日除く)

ZOOMを使った遠隔研修メニュー(PDFが開きます)

ZOOMを使った遠隔研修

新人エンジニアのためのJavaタイピングゲーム

新人プログラマのためのプログラミング動画

YouTubeチャンネル

お問い合わせはこちらから

    お名前 (必須)

    メールアドレス (必須)

    題名(件名)

    メッセージ本文

    確認画面は表示されません。上記内容にて送信しますので、よろしければチェックを入れてください。

    新入社員研修ポータル

    PAGETOP
    Copyright © Say Consulting Group, Inc. All Rights Reserved.