Java Basic While文 〜 Step1_3_2〜

while文は、単純なループを行うときに便利です。for文と違ってシンプルな記述が可能です。

とりあえずは、こんな感じで実装してみました。
余計な音が入っています。

処理内容としては、以下のようなものです。

1.標準入力を受け付ける
2.入力値を表示する。
3.「bye」と入力されたら処理を終了する。
4.それ以外は無限にループする

while文の書き方

1: while文の書き方

while(ループする条件) {
// 処理
}

2: 「ループする条件」について

例1: 3回ループする

int i = 0;
while( i < 3) {
// 処理
}

上記の「i < 3」の部分が条件になり、日本語に訳すと
「iが3より小さい間」という意味になり
「while(i < 3)」は「iが3より小さい間ループする」
という意味になる。
「条件」部分(i < 3)に関して、真偽値(True, Flase)のページで解説しています。

例2: 無限ループする

int i=0;
while(true) {
// 処理
}

例2の場合は条件の部分が「true」になっています。
条件の部分はtrueの間ループするので
→「i < 3」=> trueの場合が例1
例2の場合はずっとtrueなので「無限ループ」になります。
無限ループの場合、「break」文がないとPCが固まって
しまうので注意が必要です。

例3 do while文(4回ループ)

int i = 0;
do {
// 処理
} while(i < 4);

条件が下の部分に来ています。

サンプルコードはこちら

関連ページ

Java Basic for文 〜Step1_3_1〜

イントロダクション

ひと通り、変数の扱いなど理解したら今度は、ループや条件分岐などを理解します。

こんな感じです。余計な音が入っています。

ここら辺の文法を理解したらロジックを組むのが楽しくなると思います。

具体的には、「条件分岐」と「ループ」を使って、例えば「じゃんけんゲーム」を作ってみるとか、何かしらのアイディアを実装するとか。。。

フローチャートを書いてみるのも良いと思います。

<フローチャートの例>

兎にも角にも、「何を?」「どのように?」「どういう順番で?」実行するのか?を考えるところがロジックを組むために考えるところだと思います。
筆者は、今(2023-03-03現在)テキストRPGを作成するアプリを作ろうとしています。
詳細は、リンク先に記載しています。Githubです。アイディアの共有ができれば幸いです。

for文

いきなりですが、for文についてやります。※バグが入っております。それはどこでしょうか?

public static void main(String[] args) {
   // String型の配列を初期化
   String[] moji = {"abc", "def", "ghi"};
   // コンソール出力する変数
   String result = "";
   /* 【書き方】
    * for( 初期値; ループ条件; ループするときの処理) {
    *     // 何かしらの処理
  * }
    */
   for( int i = 0; i < 4; i++) {
      result += moji[i];
   }
   System.out.println("配列を繋げると: " + result);
}

初めにString型の配列を初期化しています。
ループして表示するために変数を用意しました。
そして、コンソール出力用の変数「result」
for文を開始いたします。

for文の文法

上記のソース部分にも記載しましたが、一応
1行大枠のみを記載すると以下のようになります。
for( .... ) { / 処理 /}

「for(」に続き
「int i = 0」の部分では使用する変数を初期化しています。
「i < 4」はループ条件、「i」が4より小さいときループします。
「i++」はfor文の中上の「/ 処理 /」の部分を一周したら行う処理です。

<書き方>

for (初期化; ループ条件; 後処理) {
   // 何かしらの処理
}

<サンプル>

for (int i = 0; i < 10; i++) }
   // 何かしらの処理
}
  1. 変数「i」を0で初期化、これでカウンターをセットする。
  2. 「i」が10より下(i < 10)の間ループする。
  3. 何かしらの処理が1回終わったら後処理(i++)を行う。

ちなみに、for文で無限ループするとこんな感じになります。

// 何も書いていないのは「処理なし」ということ
for (;true;) {
   // 何かしらの処理
}

サンプルコードと内訳


for( int i = 0 /* ① */; i < 4 /* ② */; i++ /* ④ */) {
    // ③
    System.out.println("Hello World=" + i);
}

① int 型の変数「i」を0で初期化して
②「i」が4より小さい間
③「Hello World」に「i」の値を付け足した文字を
コンソールに出力します。
1回目のループは、「i」が1なので「Hello World1」が表示され
2回目のループは、「i」が1なので「Hello World2」が表示される



となります。
④そして、コンソール出力をした後に「i++」の処理が走ります。
「i++」→「i」をインクリメントする=「i」に1を追加する
→ i = i + 1;
それから、次のループ処理を行う。。。

ざっと、コードを書いてみました。こんな流れになります。
サンプルコードはここからダウンロードしてください。

練習

やり方を眺めたら、次は実行してみるのがポイントです。プログラミングスキルとして要求されるものは「技術」と「理論」です。
技術はあれこれと考えるより手を動かす」のが大事です。プログラミングスキルという意味では、これが半分、
もう半分は理論です。「理論は、あれこれと考える」ことです。※おおざっぱな話ですが。。。

練習問題

問題を解くときに、パッケージ作成などしてやるとクラス配置が整理できます。

問題1

1から10までを合計した値をコンソール(標準出力)に表示してください。

問題2

問題1で作成したコードをベースにして、底辺が3、高さが1から10まで変化するときすべての三角形の面積を表示してください。
※以下のように表示してください。「??」には計算結果が入ります。
(3 x 1) / 2 = ??
(3 x 2) / 2 = ??
(3 x 3) / 2 = ??


問題3

問題2のコードをベースにして、三角形の数が10, 9, 8, 7 ...となるとき、すべての三角形の面積の合計を表示して下さい。
※以下のように表示してください。「??」には計算結果が入ります。
(3 x 1) / 2 = ?? 三角形は10個で面積は???
(3 x 2) / 2 = ?? 三角形は9個で面積は???
(3 x 3) / 2 = ?? 三角形は8個で面積は???


でわでわ。。。

 

関連ページ

Java Basic booleanの意味と条件分岐 〜Step1_2_2〜

イントロダクション

はじめに復習をします。

前回使用した変数にint型, dluble型がありますが、これらはプリミティブ型変数と呼びます。
これに対して、String型のようにクラスとしてJavaで定義されているものは参照型と呼びます。

具体的に、参照型はメソッドが呼べるがプリミティブ型がはメソッドが呼べないというところです。

そして、もう1つ参照型変数はインスタンスを参照します。このインスタンスがキーポイントになりますが、今はString型の変数を初期化したら、その変数にはString型のインスタンスが入っているんだなと理解してください。

この「インスタンス」のことを「オブジェクト」と呼んでいることが多いですが「プログラミング業界で『オブジェクト』と言えばほとんどすべてのもの」が『オブジェクト』になるので注意が必要です。

具体的には下のようなコードになります。

int num = 0;
//int num1 = null; -> ビルドエラー
String moji = "abc";
String moji2 = null;

moji.length(); // 文字列の長さを取得する
// num1.length(); // エラーになる
  1. プリミティブ型の変数にはnullを代入できません。プリミティブ型は何もない=「参照なし」の状態にはできないのです。
  2. 参照型にはnullが代入できます。参照型は何もない=「参照なし」の状態があり得ます。

String型のような参照型の変数は、常にクラスを参照しようとします。なのでどこも参照したくない場合はnullを代入します。俗にいうと「メモリを解放する」という処理になります。

そして、プリミティブ型の変数、intdoubleを使用してきましたが。これらの変数はメモリ領域を直接確保します。
なので、確保した領域に「何もない」=nullを代入することができません、つまり、はじめから変数を宣言(初期化)=メモリ領域の確保、は必要ないからです。

具体的には、下のようなプログラムを見ていただくとわかると思います。

int num; // int型の変数を宣言=4バイト文のメモリ領域の確保
int num1 = 1; // 上と同様に4バイト文のメモリ領域を確保

String moji = null; // 変数を宣言しているが、メモリ領域は確保していない
String moji2 = "a"; // 変数を宣言して値を設定しているので1バイト分のメモリ領域を確保

上記のようになります。

サンプルコード

プログラム引数を整数型の変数にセットして四則計算を行い表示するプログラムです。
※ テストしていないので、こんな感じというのを見てほしいです。

public class Sample {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("プログラム引数は2つセットしてください。");
            System.exit(-1);
        }
        // プログラム引数は1桁の数字
        if (args[0].matchies("0-9") && args[1].matchies("0-9")) {
            int left = Integer.parseInt(args[0]); // プログラム引数の1つ目
            int right = Integer.parseInt(args[1]); // プログラム引数の2つ目
            // 四則計算の処理
            System.out.println("left + right = " + (left + right));
            System.out.println("left - right = " + (left - right));
            System.out.println("left * right = " + (left * right));
            System.out.println("left / right = " + (left / right));
        } else {
            System.out.println("プログラム引数は1桁の数字をセットしてください。");
        }
    }
}

プログラム引数を使用してプログラムを実行しています。具体的な処理内容は以下の通りです。

  1. 引数が2つでない場合はメッセージを表示してプログラムを強制終了(異常終了)
  2. プログラム引数が2つとも一桁の数字であれば、四則計算を行い表示
  3. それ以外はメッセージを表示

<コマンドで実行する場合>
下のようにコマンドをたたく

java Sample 1 2

boolean型

プリミティブ型の変数booleanの扱い方について記載します。

真偽値で、条件分岐を行うのに便利

// sample
int a = 1;
int b = 2;
boolean isSame = a == b;
System.out.pintln(isSame);

上のコードは、int型の変数、「a」「b」を初期化してそれぞれの値が等しいかどうか検証しています。

boolean isSame = a == b;

この行が判定している処理になります。

そして、この判定結果がboolean型の変数isSameに代入されています。

早い話が

aとbが等しい時は「true」、そうでない場合は「false」が変数isSameに代入されます。

これを確かめるのには、上のコードを実行してみればわかります。

試しに、「a」「b」の値を変更して実行して見てください。
どのような結果になるか予想してから実行して見てください、

ちょっとしたクイズゲームみたいでしょう?

ちょっとしたクイズゲーム

上のコードを書き換えて、下のように修正しました。これを写経して動かして見てください。
ちなみに、「サンプル実装パターンX」とあるコメント行から下の部分が変更する部分です。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String num1 = scan.next();
    String num2 = scan.next();
    // サンプル実装パターン1
    int a = Integer.parseInt(num1);
    int b = Integer.parseInt(num2);

    boolean isSame = a == b;
    System.out.println(isSame);
}

別パターン

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String num1 = scan.next();
    String num2 = scan.next();
    // サンプル実装パターン2
    int a = Integer.parseInt(num1);
    int b = Integer.parseInt(num2);
    boolean isSame = a == b;
    if (isSame) {
       System.out.println(a + “ and “ + b + “ is same”);
    } else {
       System.out.println(a + “ and “ + b + “ is not same”);
    }
}

ちなみに、筆者が作成したものを動画にしてみました。

プログラム引数について

Javaプログラムを起動するときに渡す値のこと、コマンドで渡す、IDEでプログラムを実行するときに渡す。

public static void main(String[] args) {
   System.out.println(“プログラム引数は” + args[0] + “です”);
}

上のコードはプログラム引数を渡さないと落ちます!

Eclipseで実行するときは以下のような画面で
「引数」「Arguments」のタブより
「プログラム引数」と「VM引数」とあるので
プログラム引数の部分に入力する

VM引数

システムプロパティなどに使う、Java Vertual Machine(JVM)に渡す引数
「-D引数」という形で渡す※全てではない

<プログラム引数を渡す。>※ Eclipse余計な音が入っています。

<プログラム引数を渡す。>※IntelliJ IDEA

IF文の書き方

【条件分岐の書き方】

if ( 条件式 ) {
   処理
} else if( 条件その2) {
    処理2
} else {
    上記の条件以外のケースの処理
} 

<IFの実装サンプル>

上の「条件式」の部分には論理式が入ります。論理式はboolean型の値を返却する式のことです。
具体的には下のようになります。

boolean(真偽値)

<Booleanの実装サンプル>

// 下の変数には全てtrueが入ります
boolean isSame = 1 == 1;
boolean notSame = 1 != 2;

boolean isSameString = "1".equals("1");
boolean notSameString = !"1".equals("1");

boolean yes = true;
boolean no = false;

// 論理演算
boolean result = yes & no; // falseになる AND演算
result = yes | no;         // trueになる OR演算
result = yes ^ no;         // trueになる XOR演算
result = ~yes;             // falseになる NOT演算
日本語 演算(演算子) 真偽値1 真偽値2 結果
論理積 AND(&) TRUE TRUE TRUE
論理積 AND(&) TRUE FALSE FALSE
論理積 AND(&) FALSE FALSE FALSE
論理和 OR(|) TRUE TRUE TRUE
論理和 OR(|) TRUE FALSE TRUE
論理和 OR(|) FALSE TRUE TRUE
論理和 OR(|) FALSE FALSE FALSE
排他的論理和 XOR(^) TRUE TRUE FALSE
排他的論理和 XOR(^) TRUE FALSE TRUE
排他的論理和 XOR(^) FALSE TRUE TRUE
排他的論理和 XOR(^) FALSE FALSE FALSE
否定(ビット反転) NOT(~) TRUE - FALSE
否定(ビット反転) NOT(~) FALSE - TRUE
        boolean and = true & false;
        boolean or = true | false;
        boolean xor = true ^ false;
        // NOT演算
        boolean not = !false;

【標準入力】 ※低レベルな(古い)書き方です。

public static void main(String[] args) {
   byte[] input = new byte[5]; // 5文字までの入力分
   System.in.read(input);
   System.out.println(input); // コンソール出力
}

【標準入力】 ※最近の書き方です。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String input = scan.next();
}

<標準入力を使うサンプル>

【プログラム引数の使い方】
※サンプルは上の方にあります。

public static void main(String[] args) {
   // プログラム引数はスペースで区切ると複数個入力できる
   System.out.println("プログラム引数: " + args[0]);
}

【標準出力・入力のメソッドについて】
「System.out.println("文字列");」とコードを記載すると思いますが
Systemクラスのoutフィールドに定義されている「printlnメソッド」を
いつも使用しています。

JavaDocAPIを見るとそのように書いてあります。
Javaに関してはこのJavaDocを読んで理解できるようになれば
Javaの基本はマスターしたと言って過言はありません。

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

switch文

今度はswitch文についてです。
BlueJでSwitch文>

IF文と同じように条件分岐を行いますが、コードの書き方が違います。

switch (値) {
case 値がXXの時:
    // 何かしらの処理
    break;
case "文字":
    // 何かしらの処理
    break;
case "文字2":
    // 何かしらの処理
    break;
default:
    // 想定外の値の時の処理
}

実際に使用する時は「値がXXの時」の部分を指定した値の時の処理を書きます。
言葉で示すよりもコードで示す方が良いと思いますので、以下に示します。

String moji = "aa";
switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
        break;
    case "abc":
        System.out.println("2. 何かしらの処理");
        break;
    default:
        System.out.println("3. 何かしらの処理");
}

上記の場合、String型の変数「moji」に「aa」という値が入っていますので。「1. 何かしらの処理」が標準出力に表示されます。(出力されます)

そして、case文の中にある「break」がない時は、全て表示されます。具体的には以下の通りです。

String moji = "aa";
    switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
    case "abc":
        System.out.println("2. 何かしらの処理");
    default:
        System.out.println("3. 何かしらの処理");
}

この場合は、下のように出力されます。

  1. 何かしらの処理
  2. 何かしらの処理
  3. 何かしらの処理

そして、次の場合はどうでしょうか?

String moji = "aa";
switch (moji) {
    case "aa":
        System.out.println("1. 何かしらの処理");
    case "abc":
        System.out.println("2. 何かしらの処理");
        break;
    default:
        System.out.println("3. 何かしらの処理");
}
  1. 何かしらの処理
  2. 何かしらの処理

と表示されます。これはcase "aa"のcase文に「break」がなく次の"abc"の部分に「break」があるからです。

つまり「break」は「{}」の中から外に出ますよという意味です。

if文の時でも同様ですが、意味がないので使用しません。

次にやるループ処理では大いに意味があるので使います。

変数「i」が3の時ループを抜ける処理
for (int i = 0; i < 10; i++) {
    if (i == 3) {
        break;
    }
}

<<<前回 次回>>>

関連ページ

Java Basic CharとString 〜文字の操作〜

イントロダクション

データ型とは、数値、文字、クラスなどの変数の型を意味しています。このデータ型について、1番使うであろう文字(Char)と文字列(String)について記載します

Stringとchar

Javaで文字を扱うときに使用するデータ型として「char」「String」があります。

  • Stringは文字列のことで、「"(ダブルクォーテーション)」で囲うことで文字列を表します。
  • charは文字を表し、「'(シングルクォーテーション)」で囲うことで文字を表します。
String str = "文字列";
char ch = 'a';

ちなみに、「=」の右側、値の部分のことを「リテラル」と呼びます。別な言い方をすると「"XXX"」は文字列のリテラル「'X'」は文字のリテラルという言い方ができます。

リテラルの解説

While文でint型の配列をループする処理の説明をしていますが、リテラルの説明もしています。

下のコードは、各データ型の定義サンプルです。
データ型(変数の型)は大きく分けてプリミティブ型参照型があります。

/** 
 * プリミティブ型データ一覧クラス(説明用)
 * @author takunoji
 */
public class PrimitiveSample {
   /** INTは整数で ±2147483647まで使用可能 */
   private int population;

   /** Doubleは小数点を使用する */
   private double footSize;

   /** Shortの年齢は ±32767まで使用可能 */
   private short age;

   /** BooleanはTRUEかFALSE */
   private boolean flg;

   /** Charは一文字 */
   private char ch;

   /** 1Byteは8Bit(2進数8桁)-> 01010101 = 85 */
   private byte byt = 0x7F; // 16進表現:10進数の127

   /** LongはINTよりも大きい整数 */
   private long lng;

   /** FloatはDoubleよりも大きい小数点 */
   private float flt;

   /** 
    * コンストラクタ:この処理を通るとインスタンスができる
    */
   public PrimitiveSample() {
     population = 100;
     footSize = 24.6;
     age = 100; // intはより大きな数値を使える
     flg = false;
     ch= 'A';
     byt = 0x7F;
     lng = 123456;
     flt = 12345.6;
   }
}

プリミティブ型

charはプリミティブ型と言うカテゴリに入ります。intと同じく「==」で比較できます。

参照型(クラス型)

Stringは参照型(これもカテゴリ)で比較メソッドを使用します。参照型の場合はクラスなのでメソッドが使用できます。プリミティブ型の場合はメソッドが使用できません。そして、参照型は「==」での比較は想定通りに動きません。細かい理由は後々に… ※最近は「==」でもある程度ちゃんと比較できるようです

使い方

初期化するときは下のようにやります。
char a = 'a'; // シングルクォーテーション
String a = "a"; // ダブルクォーテーション

比較するときは、charは「==」を使用します。
Stringはメソッドを使用します。
String a = "a";
a.equals("a"); // trueが出力されます。

兎にも角にも、コードをみてみいないと
なんとも言えないのでこちらから
ダウンロードしてください。

サンプルコード

public static void main(String[] rags) {
   int i = 1;
   char c = ‘a’; // 一文字のみ
   String str = “文字列”;
   System.out.println(i == 1); // true
   System.out.println(c == ‘b’); // false
   System.out.println(“abc”.equals(str)); // true

   // 文字列操作
   // 「abc」の「b」のみ表示
   System.out.println(str.charAt(2));
   // 文字列の置換(123をZZZに置換)
   System.out.println("test123bbb".replace("123", "ZZZ"));
}

<問題>
プログラム引数に「abc」「def」を渡してその引数を以下のようにコンソールに出力してください

①引数1: abc
②引数2: def

・上記の表示を行なった後にchar型の値「G」と「E」を
①と②の最後の部分に追加して表示してください。
※String型の変数の後にchar型を連結できればOKです。
Eclipseの画面では下のような画面でプログラム引数を追加します。

StringBuilderを使う

StringBuilderクラスを使用すると、文字列の操作が簡単にできます。
例えば、文字列の変数「str」が下のようにあったとします。

String str = "1234567";

個の文字列の「4」以降を取得したい時は「StringBuilder#subString(3)」とコードを書けば取得できます。

String str = "1234567";
StrinbBuilder build = new StringBuilder(str);
String result = build.substring(3);

System.out.println(result); // 「4567」が表示される

関連ページ

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("******");
    }
}

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

前回 <<< >>> 次回

関連ページ