Java データ型 変数の扱い方〜Step1-2-1〜

イントロダクション

前回は、演算子ということで「四則演算」を行いました。

次のステップとして、以下のようなことを行います。

前回は演算子にはどんなものがあるか?どんなふうに使うのか?といったことに触れましたので、今回は、それらをまとめて実践的な視点で
メソッドを作成することも考えた形で学習したいと思います。

  1. 変数の扱い
  2. byte型変数
  3. 基本になるデータ型
  4. 変数の宣言方法
  5. リテラルに関して
  6. メソッドを切る(作る)

変数の扱い

Javaなどのプログラムではデータの形として、次のものがあります。

  • 数値(int, double, short, long, float ...)
  • 文字(char, String(クラス))
  • クラス(java.lang., java.util.) ※javaのパッケージで記載しました。

上に列挙したデータの形は「かっこ()」内に記載した型名のように、「XXX型」というような名前がついています。
これらを分けて考える必要があります。そのため「データ型」という概念を使って区別します。

具体的には、int型であればそれは「整数の値ですよ。」doubleであれば、浮動小数点数、文字れあればchar、文字列であればString。。。
これらは、使いながら覚えていけばよいと思います。頭で暗記しても使えなければ意味がないので、使いながら理解していくのが最も効率的だと思います。なので、使いながら学習していきましょう。

下のコードは、各データ型の初期化を行っているものです。これらのデータを初期化したうえで、何かしらの処理を行うのが多いです。

// int型
int seisu = 10;
// double型
double shosu = 1.3;
// char型
char ch = 'a';
// String型
String moji = "文字列";

System.out.println("int型: " + seisu);
System.out.println("double型: " + shosu);
System.out.println("char型: " + ch);
System.out.println("String型: " + moji);

上から順にコードの説明を以下に示します。

  1. int型の変数「seisu」を10で初期化
  2. double型の変数「shosu」を1.3で初期化
  3. char型の変数「ch」を'a'で初期化 -> 「char」は1文字のみを示すデータ型です。
  4. String型の変数「moji」を10で初期化
  5. 文字列「int型:」に変数「seisu」の値を連結して表示
  6. 文字列「double型:」に変数「shosu」の値を連結して表示
  7. 文字列「char型:」に変数「ch」の値を連結して表示
  8. 文字列「String型:」に変数「moji」の値を連結して表示

データ型の表示サンプルコードはこちら
※下に基本的な変数の種類を記載しています。

<変数の扱いのサンプル>

byte型変数

パソコンは、データ~画像の表示まですべてを2進数で行っております。この2進数を示すデータ型が「byte」です。
この2進数は、10進数、8進数、16進数と変換することが(わりかし)容易です。そして、文字を表示するのにアスキーコードユニコードなど扱うのに便利です。

byte型変数:ビット(bit)とは→1010(つまり二進数)

  • 1バイト(1byte) = 8bit(8桁の2進数) => 10101010
    javaでは、byte b = 0b10101010のように書くことができる。しかしコンソールに表示すると「int型」として表示される。。。
  • 4bitは2進数の「1010」のように4つの「0か1」が並んだもの
    例: 2進数(4bit)の「1010」は10進数(普通の数字)では「10」になる

「0」→0, 「1」→1「10」→2, 「11」→3, 「100」→4,「101」→5,「110」→6, 「111」→7, 「1000」→8,「1001」→9, 「1010」→10

具体的には、パソコンの内部的なところでは、全てが二進数で扱われます。なので、プログラムでは
人間にわかるように、二進数ではなく、今書いている「文字列」や「数値」などのように「データ型」を設けて
「"1"」と「1」を区別します。

2進数「111001」は整数型では 57を示し、 char型では '9' を示す

このように、2進数は同じ値でも、データ型によって表示される値(文字を含む)が変わります

それは、パソコンが2進数で全てを表現しているからです。

基本になるデータ型

[プリミティブ型]と呼ばれるデータ型の種類

データ型          読み      用途
byte            バイト        8ビットの整数(-127から127) を示すが実際はファイル入出力時にこのデータ型で扱うことが多い
int               イント        整数として使用する(四則計算など)、整数の計算で使用する事が多い
long              ロング      intよりも大きい数値を使用する時に使用する、日付計算などで使用する事が多い。
double          ダブル        小数点をつける数値として使用する
float            フロート    あまり使わない
char           キャラ          一文字を示す、またintでも扱うことができる 'a'(シングルクォーテーション使用)
boolean        ブーリアン 真(true)か偽(false)を示す、intではtrue=1, false=0

これらに対して、クラス型(参照型)というのがあります。代表的なモノはString型です。もちろん自作したクラスも参照型になります。

変数を使ったサンプルコード

以下に、サンプルコードを示します。
コメント部分にコードの意味を書いています。

サンプルコード1

変数の宣言と、初期化の違いを記載しています。同様に、四則計算も行っています。

public static void main(String[] args) {
    // 変数「i」の宣言
    int i;
    // 変数の初期化
    int j = 0;

    // 足し算
    int answer = 1 + 1;
    // 引き算
    int answer1 = 1 + 1;
    // かけ算
    int answer2 = 1 * 1;
    // わり算
    int answer3 = 1 / 1;

    System.out.println("足し算の結果:" + answer);
    System.out.println("引き算の結果:" + answer1);
    System.out.println("かけ算の結果:" + answer2);
    System.out.println("わり算の結果:" + answer3);

    i = 20;
    j = 11;
    System.out.println("問題の答え:" + (i + j));
}

変数の宣言方法

変数のデータ型(下のサンプルは整数型(int型))

// 変数「i」の宣言
int i;
// 変数の初期化
int j = 0;

変数のデータ型(下のサンプルは文字型(char型))

// 変数「i」の宣言
char c;
// 変数の初期化
char ch = 'A';
char ch = 65;

char型は1文字をセットする変数型です。数値で扱うこともできます。
ASCIIコード表に対応しています。

スコープ(変数の生存範囲)

変数の宣言する位置によって変数のスコープが決まってきます。例えば、下のようなケースがあります。

  • フィールド変数はクラス全体がスコープの範囲になります。
  • メソッドの中で宣言するローカル変数はメソッドの中。。。
  • if文の中で宣言するローカル変数はif文の中あ。。。

ここでの注意は、変数名は同じスコープ(「{」から「}」の間)の中になければ重複しても問題ありません。ということです。

次のサンプルコードではint型変数の「c」に注目してみてください。

<エラーにならないパターン>
具体的には、下のコードはエラーになりません。ifの中で初期化している「int c」のスコープはelseの中に届かないためエラーにならない。

public static void main(String[] args) {
    if ('a' == 'a') {
        int c = 0;
        System.out.println("'a' == 'a': TRUE");
    } else {
        int c = 0;
        System.out.println("'a' == 'a': FALSE");
    }
}

<エラーになるパターン>
if文の外にて初期化しているので、ifとelseのスコープを含む範囲にあるためエラーになります。

public static void main(String[] args) {
    int c = 0;
    if ('a' == 'a') {
        int c = 0;
        System.out.println("'a' == 'a': TRUE");
    } else {
        int c = 0;
        System.out.println("'a' == 'a': FALSE");
    }
}

変数のデータ型(下のサンプルは文字型(byte型))

// 変数「i」の宣言
byte i;
// 変数の初期化
byte j = 0;

※文字列型は、クラス=参照型になります。

まずは「int」「double」「String」のデータ型を覚えましょう。

リテラルに関して

変数の型に関しては、理解できたと思いますが、変数を宣言したときの右側部分

リテラルは文字列、整数型などの変数に値を設定する前。
つまりは、「=」の右側のことです。
「String a = "文字リテラル";」とか「int i = 10」などのような初期化をした時に出てくる右側部分です。つまりは、 「"文字リテラル"」と「10」がそれにあたります。

String moji = "文字リテラル";
int seisu = 10;

上のコードの場合は、文字リテラルが「"文字リテラル"」で整数リテラルが「10」になります。

細かい説明などはこちらの動画にしてありますので、よかったらどうぞ。

[参照型]→ クラスのこと

データ型          読み      用途
String         ストリング   文字列 "abcdefg"(ダブルクォーテーション使用)
Array      配列     変数に「[]」が付いている以下に例を示す

<配列の使用例>
// int型の配列宣言

int hairetu[] = {1,2,3,4,5};

配列から値を取り出した場合は、配列にはなりません。具体的には下のように、int型の配列から値を取り出すと、int型になります。

int hairetu[] = {1,2,3,4,5};
int i = hairetu[0];

// 配列の中身をコンソールに表示
System.out.println("配列の一番初めの値" + hairetu[0]);
//これも初めのうちは「丸暗記」でOKです。(処理内容を理解しなくても良い)

/*
* 配列の中身を足し算します
*/
int answer = hairetu[0] + hairetu[1]; // 1 + 2
System.out.println("配列の初めの2つを足し算=" + answer);
// 同様に5番目と3番目の引き算(5 - 3)
int answer1 = hairetu[4] - hairetu[2];
System.out.println("5 - 3" + answer1);

// サンプル
long time = System.currenttimemillis();</pre>

<問題>

<問題1>
上記の配列「hairetu」の中身を全て合計するプログラムを作成して
答えが正しいか起動結果を確認してください。
「ヒント」
・配列の1番目は「hairetu[0]」のように指定します。
・クラスの中にメインメソッドを作成して実行してみてください。

とりあえずは、こんな感じです。

<問題2>
プログラム引数に2つの数字を渡して、それらを足し算して式と結果を表示するプログラムを作成してください。

コマンド実行したときの例

java Mondai 1 2

実行結果

1 + 2 = 3

問題の作り方

問題の解凍方法のサンプルです。パッケージとクラスの作成方法を動画にしました。

メソッドを切る

余力があればこちらもどうぞ、と言うレベルです。

※ 余計な音が入っています。

今まで作成したプログラムは「なんとなく残しておきたいな。。。」と感じた方、早速残しましょう。

作成したプログラムは、「メソッド」と言う形で別な場所に移すことができます。当然呼び出さなければ、意味がありませんが、メインメソッドを動かしても影響のないようにする」と言うことであれば、メソッドに定義して残すのも1つです。

具体的に、メソッドに作成した処理を移動して、そのメソッドを動かさなければコードが残っているだけになります。
悪く言うと、残骸になります。

具体的に。。。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
        int X = 43;
        System.out.println("X % 2 = " + X % 2);
        // クラスのインスタンス化
        HelloWorld main = new HelloWorld();
        // メンバメソッドを呼び出す。
        main.test1();
        // スタティックメソッドを呼び出す。
        HelloWorld.test2();
    }

    /** メンバメソッド */
    public void test1() {
        System.out.println("test1");
        System.out.println("2 / 2 = " + 2 / 2);
    }
    /** スタティックメソッド */
    public static void test2() {
        System.out.println("test2");
    }

    /** スタティックメソッド */
    public static void newClass() {
        // クラスのインスタンス化
        HelloWorld main = new HelloWorld();
        // メソッドを呼び出す。
        main.test1();
        // スタティックメソッドを呼び出す。
        HelloWorld.test2();
    }
    /** スタティックメソッド:四角を表示する */
    public static void printRect() {
        System.out.println("****** ");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("******");
    }
}
  1. staticがついているメソッドはメインメソッドから直接呼び出すことができます。
  2. メンバメソッド」は呼び出すことができません。呼び出すにはクラスをnewしてやる必要があります。

メンバメソッドもstaticメソッドもクラス内で呼び出すのであれば、クラス名を省略することができますが、staticメソッド内においては、メンバメソッドはクラスをnewする必要があります。

<メンバメソッドを呼び出す例>

HelloWorld main = new HelloWorld();
main.test1();
HelloWorld.test2();

<staticメソッドを呼び出す例>

public class HelloWorld {
    public static void main(String[] args) {
        // staticメソッド呼び出しクラス名を省略(クラス内にあるメソッドなので省略可能)
        printRect();
        // メンバメソッド呼び出し、クラスはnewする必要がある
        HelloWorld main = new HelloWorld();
        main.test1();
        // staticメソッド呼び出し
        HelloWorld.test2();
    }
    /** メンバメソッド */
    public void test1() {
        System.out.println("test1");
        System.out.println("2 / 2 = " + 2 / 2);
    }
    /** staticメソッド */
    public static void test2() {
        System.out.println("test2");
    }

    /** staticメソッド */
    public static void printRect() {
        System.out.println("****** ");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("*    *");
        System.out.println("******");
    }
}

※余計な音が入っておます。

前回 <<< >>> 次回

関連ページ

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す