1.課題
Report#3:Javaの文法解説I{〜11/15(Mon)}
講義資料を参考に、その範囲のJavaの基礎的な文法について教科書と
対応させながら解説し、考察せよ。
2.プログラム

 /*
   Program     : ETO.java
   Student_ID  : 045754A
   Author      : Hayato MIYAGI
   Date        : 041108(Mon)
   Comments    : 制御文を用います
*/

class ETO
{
    public static void main(String args[])
    {
        System.out.println("1982");
        switch (1982%12)
            {
            case 0 :
                System.out.println("MONKEY");
                break;
            case 1:
                System.out.println("BIRD");
                break;
            case 2:
                System.out.println("DOG");
                break;
            case 3:
                System.out.println("WILD BOAR");
                break;
            case 4:
                System.out.println("RAT");
                break;
            case 5:
                System.out.println("COW");
                break;
            case 6:
                System.out.println("TIGER");
                break;
            case 7:
                System.out.println("RABIT");
                break;
            case 8:
                System.out.println("DRAGON");
                break;
            case 9:
                System.out.println("SNAKE");
                break;
            case 10:
                System.out.println("HORSE");
                break;
            case 11:
                System.out.println("SHEEP");
                break;
            default:
                System.out.println("Nothing");
                break;
            }
    }

}
3.実行結果

[nw0454:~/prog2/repo3/sample3] j04054% java ETO
1982
DOG

4.考察

 Javaの基本的なルールについては谷口先生の講義資料に基づいて解説
していきたいと思います。
/*
 Program   : Test01.java
 Student_ID  : 045754A
 Author    : Hayato MIYAGI
 Date     : 041108(Mon)
 Comments  : javaの基本ルール
*/

public /*これもコメントです*/ class Test01 { // Test01.java
public static void main(String args[]) { // mainの記述
System.out.println("Comment");
cmnt(); // cmntスレッドの呼び出し
System.out.println("¥n¥nEnglish");
smp1();
System.out.println("¥n¥nMoth");
smp2();
System.out.println("¥n¥nloop");
smp3();
System.out.println("¥n¥nif,,,");
smp4();
}

public static void cmnt() { // mainの記述
System.out.println("My first Java."); // 文字列出力する
}

public static void smp1() {
System.out.print("AAAAA");
System.out.print("BBBBB¥nCCCCC¥n");
System.out.println("DDDDD");
System.out.println("EEEEE¥nFFFFF¥n¥nGGGGG");
}

public static void smp2() {
int a, b, sum;

a = 100;
b = 200;
sum = a + b;
System.out.print("a="); // 文字列だけ出力
System.out.println(a); // 数値だけ出力
System.out.println("b=" + b); // 文字列と数値を出力
System.out.println("a+b=" + sum); // 結果を出力
System.out.println("a+b=" + (a+b)); // 直接計算させる
}

public static void smp3() {
int i, sum;

for (i=1; i<=5; i++)
System.out.println("i=" + i);

sum = 0;
for (i=1; i<=5; i++) {
sum = sum + i;
System.out.println("sum=" + sum);
}
}

public static void smp4() {
int i;

for (i=1; i<=5; i++) {
System.out.print("i=" + i);
if (i <= 3)
System.out.println(" (i <= 3)");
else
System.out.println(" (i > 3)");
}
}

}

--------------------------------------------------------------Result

[nw0454:~/prog2/repo3/sample1] j04054% java Test01
Comment
My first Java.

English
AAAAABBBBB
CCCCC
DDDDD
EEEEE
FFFFF

GGGGG

Moth
a=100
b=200
a+b=300
a+b=300

loop
i=1
i=2
i=3
i=4
i=5
sum=1
sum=3
sum=6
sum=10
sum=15

if,,,
i=1 (i <= 3)
i=2 (i <= 3)
i=3 (i <= 3)
i=4 (i > 3)
i=5 (i > 3)

 javaの基本ルールとして初めにコメントについて解説していきたいと思
います。
そもそもコメントとは、自分自身または他のプログラマのためにソースコ
ード内に書き込むメモのことです。コンパイラは全てのコメントを無視し
ます。コメントは、プログラマのためだけに存在し、後からソースコード
の機能や使用方法を思いだすことができるように、その意味と目的を説明
しておくために使用します。
 コメントには三つのパターンがあります。まず一つ目にソースの一行目
すぐに「/*」で始まり、「*/」で終わるコメントがあります。
これは複数行コメントと呼ばれます。以下にこの形式のコメントの使用例
を示します。

/*これもコメントですう。*/

この形式のコメントは、次に示すように、複数行にわたって書くこともで
きます。

 /*
  我々は
  もう
  バレバレだろうが
 */

 二つ目に単一行コメントと呼ばれる形式です。「//」で始まり、その行
以降の文字が行末尾までコメントとして解釈されます。次の例は、一行目
のクラス宣言直後にコメントを挿入しています。

public /*これもコメントです*/ class Test01 { // Test01.java

三つ目の形式はドキュメンテーションコメントです。このコメント「/**」という3文字で始まり、「*/」という2文字で終わります。次にこの形式の
使用例を示します。

/**
 これはJavaの
 ドキュメンテーション
 コメント。
*/

ドキュメンテーションコメントの利点は、ツールを使ってソースファイル
からコメントを抜き出し、そのプログラムのマニュアルを自動的に作成で
きることです。

 Javaでは、キーワードやクラス、メソッド、変数名の中を除いて、任意
の場所にコメントを記述することができます。コメントを使ってある行のコードを一時的に削除することもできます。その方法はただ単にその行を
コメント記号で囲みます。
 注意として、コメントのなかにコメントを入れ子状にして使用すること
はできないので無効となります。以下のようなコメントの使用は不可能です。

pri/*無効*/nt("this is work");

上のようにコメントを書いてもステートメントは無効です。
 つまり、メソッド名や変数名の内部にコメントを挿入することはできま
せん。

 コメント文とは別にプログラムの構造を分かりやすくするために空行や
空白を自由に使うことができることも基本ルールの一つです。

 Javaでは大文字と小文字の区別が明確になされるので、クラス名とファ
イル名が一文字違ってしまうとエラーが出てコンパイルが通りません。

 Javaではどこでも関数を定義することができます。これはC言語との大き
な違いの一つです。そもそも、C言語とのもっとも大きな違いとはコンパ
イル時に表に現れてきます。なぜかというと、C言語ではコンパイル時に
実行可能コードを作成しますが、Java言語はバイトコードを含んだオブジ
ェクトファイルを作成します。

それがないと、実行できません。バイトコードとは特定のCPUに依存しない命令のことです。
バイトコードはJavaVirtual Machine(JVM)によって解釈
されるように設計されています。つまり、
JVMを備えたマシーンなら新しいコンピュータでもJavaプログラムを実行できます。

 スレッドについてですが、スレッドとはプロセス内の実行の流れです。
スレッドは固有のアドレス空間を持つのではなく、所属するプロセスのメ
モリ、その他のリソースを使います。したがって、スレッドで必要とされ
るリソースは、プロセスで必要とされるものよりも格段に少なくなります。
プロセスでは複数のスレッドを使用できるのでJVMでは、スレッドを管理し、
その実行スケジュールを決定します。スレッドの実行コンテキストの
切り替えにかかる時間は、プロセスの切り替えの場合に比べて格段に短く
なります。つまり、処理速度が上がるということです。
以上のようにスレッドにはいくつかメリットがあります。

例えば、

public /*これもコメントです*/ class Test01 { // Test01.java
public static void main(String args[]) { // mainの記述
System.out.println("Comment");
cmnt(); // cmntスレッドの呼び出し
System.out.println("¥n¥nEnglish");
smp1();
System.out.println("¥n¥nMoth");
smp2();
System.out.println("¥n¥nloop");
smp3();
System.out.println("¥n¥nif,,,");
smp4();
}

public static void cmnt() { // mainの記述
System.out.println("My first Java."); // 文字列出力する
}

public static void smp1() {
System.out.print("AAAAA");
System.out.print("BBBBB¥nCCCCC¥n");
System.out.println("DDDDD");
System.out.println("EEEEE¥nFFFFF¥n¥nGGGGG");
}
.
.
.
.

 のようにプロセスの中にスレッドを複数持つことが可能でしかもその複数のスレッド
を実行する順番もスケジューリングできます。この機能はC言語と似たものだと思いま
した。
 スレッドの状態には新規作成、使用可能、実行中、待機中、破棄の5段階存在します。
さらにスレッドには実行する優先順位が存在します。つまり、優先順位の高い実行可能
スレッドがあれば、そのスレッドから実行するのです。よって、実行順位の並びで実行
されるのでどのスレッドにも実行可能な状態ならば、実行されるチャンスはあります。

 次に上記プログラムの各ステートメントの解説をしていきたいと思います。

public class Test01 {
クラス宣言を行っています
public static void main(String args[]) {
    Javaでは絶対不可欠なステートメントです
System.out.println("Comment");
    文字列を表示させるステートメントです。
cmnt();
  これはスレッドなので後からmain()によってよびだされます。 
System.out.println("¥n¥nEnglish");
    以下同様によだされます。
smp1();
System.out.println("¥n¥nMoth");
smp2();
System.out.println("¥n¥nloop");
smp3();
System.out.println("¥n¥nif,,,");
smp4();
}

public static void cmnt() { // mainの記述
System.out.println("My first Java."); // 文字列出力する
}
  main()に呼び出されるまで待機です。呼び出されたときには画面に
My first Javaと出力されます。文字列の表現を実現しているのはString型
でStringはクラスで表現されている
。  

public static void smp1() {
System.out.print("AAAAA");
System.out.print("BBBBB¥nCCCCC¥n");
System.out.println("DDDDD");
System.out.println("EEEEE¥nFFFFF¥n¥nGGGGG");
}
このステートメントが呼び出されると、System.out.print()の中に
書かれた文字列が画面に出力されます。このとき¥nというのは改行
せよという命令なので¥nまで文字列が出力されると改行されて次の
文字列が出力されます。この命令の仕方もC言語と同じですね。

public static void smp2() {
int a, b, sum;

a = 100;
b = 200;
sum = a + b;
System.out.print("a="); // 文字列だけ出力
System.out.println(a); // 数値だけ出力
System.out.println("b=" + b); // 文字列と数値を出力
System.out.println("a+b=" + sum); // 結果を出力
System.out.println("a+b=" + (a+b)); // 直接計算させる
}

  演算子(+)を用いた変数の計算を行っています。JavaでもCでも変数は宣
言して使います。変数は初期化することが可能です。しかし、表現のしかたが
Cと少し違うので注意が必要です。

public static void smp3() {
int i, sum;

for (i=1; i<=5; i++)
System.out.println("i=" + i);

sum = 0;
for (i=1; i<=5; i++) {
sum = sum + i;
System.out.println("sum=" + sum);
}
}
  ここでは、int型整数iとsumを宣言し、for文を用いて足し算を行い、
  合計数sumを出力しています。for文の使いかたもC言語とほぼ同じ
  です。

public static void smp4() {
  int i;

for (i=1; i<=5; i++) {
    System.out.print("i=" + i);
    if (i <= 3)
    System.out.println(" (i <= 3)");
    else
    System.out.println(" (i > 3)");
  }
}

}
  ここでもfor文を用いてint型整数iの値を1ずつ増やしています。
  そして、さらにブロック{}内でif文を用いて変数iの値を判別し
  て3以下または3以上かどうかを判別しています。こういった繰
  り返し文や、if文の使い方もC言語と似てます。

次は以下のようなプログラムについて解説していきたいと思います
/*
Program : Test02.java
Comments : javaの基本ルール2
*/

public class Test02 { // Test02.java
 public static void main(String args[]) {
   char ch;
   boolean bdt;
   int idt;
   long ldt;
   float fdt;
   double ddt;
   String ss;
   final int CNST1 = 1234; // final定数

   ch = 'A'; // 半角文字
   System.out.println("文字=" + ch + " code=" + (int)ch);
   ch = '明'; /* 全角文字 */
   System.out.println("文字=" + ch + " code=" + (int)ch);

   bdt = true;
   System.out.println("bdt = " + bdt);

   idt = 1234567890;
   System.out.println("idt = " + idt);

   ldt = 1234567890123456789L; // Lはlong値を示す
   System.out.println("ldt = " + ldt);

   fdt = 123.456F; // Fはfloat値を示す
   System.out.println("fdt = " + fdt);

   ddt = 123.456789012345;
   System.out.println("ddt = " + ddt);

   idt = 022; // 8進数の22
   System.out.println("8進22 = " + idt);

   idt = 0x22; // 16進数の22
   System.out.println("16進22 = " + idt);

   ddt = 5.67e4; // 指数表現の56700
   System.out.println("指数 = " + ddt);

   ch = '¥n'; // エスケープ文字
   System.out.println("改行文字コード = " + (int)ch);

   ss = "AAAA¥tBBBB"; // 文字列定数(エスケープ文字を含む)
   System.out.println("ss = " + ss);

   System.out.println("CNST1 = " + CNST1);
 }
}

 Java言語における基本的な型の種類には以下のようなものがあります。

説明
char

16ビットUnicodeキャラクタデータ

boolean 真偽値
byte 8ビット符号付き整数
short 16ビット符号付き整数
int 32ビット符号付き整数
long 64ビット符号付き整数
float 32ビット符号付き浮動小数点数
double 64ビット符号付き浮動小数点数


 Java言語では、他の言語と違い、変数の型が違うもの同士の演算もその
 ままの型同士で演算することができます。
例えば、

class TypePromotion {
 public static void main(String args[]){
  int i;
  float f;
  i = 10;
  f = 23.25f;
  System.out.println(i * f);
 }
}

上記のようなプログラムについて考察していきますと、まずはint型変数i
とfloat型変数fが宣言されています。そして、これらを乗算しています。
結果は
[nw0454:~/prog2/repo3] j04054% java TypePromotion
232.5
となります。これらの作業は当たり前のように感じられるかもしれません
が、他の言語だとこうも上手く処理してくれる言語はあまりありません。

ここで基本的な算術演算子の紹介をします。演算子には以下のようなものがあります。

演算子 説明
+ 加算
- 減算
* 乗算
/ 除算
% 剰余
+= 加算代入
-= 減算代入
*= 乗算代入
/= 除算代入
%= 剰余代入
++ インクリメント
-- デクリメント

他にもJavaでは8進数表記や16進数表記も可能です。

Javaでは変数の型変換を行うことができるので変数の型を変更して変数のサイズを
小さくしたりすることができます。このことを縮小変換と言います。

次に以下のようなプログラムについて考察していきたいと思います。

/*
 Program   : Test06.java
 Comments  : javaの基本ルール3
*/
public class Test06 { // Test06.java
  public static void main(String args[]) {
  System.out.println("算術演算子");
  comp1();
  System.out.println("¥n¥n関係演算子");
  comp2();
  System.out.println("¥n¥n論理演算子");
  comp3();
  System.out.println("¥n¥nインクリメント/デクリメント演算子");
  comp4();
}

public static void comp1() {
 int a, b, c;
 double f, g, h;

 a = 100; System.out.println("a = " + a);
 b = 30; System.out.println("b = " + b);
 c = a + b; System.out.println("a+b = " + c); // 加算
 c = a - b; System.out.println("a-b = " + c); // 減算
 c = a * b; System.out.println("a*b = " + c); // 乗算
 c = a / b; System.out.println("a/b = " + c); // 整数除算
 c = a % b; System.out.println("a%b = " + c); // 整数剰余

 f = 90.0; System.out.println("f = " + f);
 g = 40.0; System.out.println("g = " + g);
 h = f / g; System.out.println("f/g = " + f/g); // 浮動小数点数除算
}

public static void comp2() {
 int a;
 for (a=1; a<=5; a++) {
 System.out.println("--------" + a);
 if (a < 2) System.out.println("2未満");
 if (a >= 4) System.out.println("4以上");
 if (a == 3) System.out.println("3である");
 if (a != 3) System.out.println("3ではない");
 }
}

public static void comp3() {
 for (a=1; a<=5; a++) {
 System.out.println("--------" + a); 
 if (a>=2 && a<=4)
 System.out.println("2以上かつ4以下");
 if (a<2 || a>4)
 System.out.println("2未満または4より大");
 if (!(a==1 || a==3))
  System.out.println("1または3、ではない");
  }
}

public static void comp4() {
    int dt[] = {100, 200, 300}; // 配列を確保
    int n;

   // ++演算子を使わないときの記述
    n = 0;
    System.out.println(dt[n]); // dt[0]を表示
    n = n +1;
    System.out.println(dt[n]); // dt[1]を表示
    n = n +1;
    System.out.println(dt[n]); // dt[2]を表示

   // ++演算子を使ったときの記述
    n = 0;
    System.out.println(dt[n++]); // dt[0]を表示
    System.out.println(dt[n++]); // dt[1]を表示
    System.out.println(dt[n++]); // dt[2]を表示

   // --演算子を使う
    n = 5;
    while (--n >= 0) { // n回繰り返す
    System.out.println("n=" + n);
   }

 }
}

Javaでは算術演算子の他に関係演算子と論理演算子がある
基本ルールとして、
関係演算子には、< <= > >= == != がある
論理演算子には、!(否定)、&&(かつ)、||(または) がある
その他にも以下のような基本ルールが存在する。
++ には先加算/後加算、-- には先減算/後減算という処理順がある
文字列連結演算子 を使うと、文字列や数値の連結ができる
この他Javaの演算子には、ビット処理、シフト処理、条件演算、オブジェクト生成 などがある

次はJavaで配列を用いた表現があるのでその例を示します。

public static void comp4() {
  int dt[] = {100, 200, 300}; // 配列を確保
  int n;

  // ++演算子を使わないときの記述
  n = 0;
  System.out.println(dt[n]); // dt[0]を表示
  n = n +1;
  System.out.println(dt[n]); // dt[1]を表示
  n = n +1;
  System.out.println(dt[n]); // dt[2]を表示

  // ++演算子を使ったときの記述
  n = 0; 
  System.out.println(dt[n++]); // dt[0]を表示
  System.out.println(dt[n++]); // dt[1]を表示
  System.out.println(dt[n++]); // dt[2]を表示

  // --演算子を使う
  n = 5;
  while (--n >= 0) { // n回繰り返す
  System.out.println("n=" + n);
 }
}

以上のようにJavaでは配列の表現も用意されていることがわかりました。


最後に2.プログラムで示したプログラムについて考察していきたいと思います。
自分の生まれた年をswitch文によって判別し、自分が十二支でいうどの干支に
属しているか、判別してくれるプログラムです。
自分の生まれた年から逆算して十二支を判別させるようにしました。
以下にそのプログラムを示します。

class ETO
{
    public static void main(String args[])
    {
        System.out.println("1982");
        switch (1982%12)
            {
            case 0 :
                System.out.println("MONKEY");
                break;
            case 1:
                System.out.println("BIRD");
                break;
            case 2:
                System.out.println("DOG");
                break;
            case 3:
                System.out.println("WILD BOAR");
                break;
            case 4:
                System.out.println("RAT");
                break;
            case 5:
                System.out.println("COW");
                break;
            case 6:
                System.out.println("TIGER");
                break;
            case 7:
                System.out.println("RABIT");
                break;
            case 8:
                System.out.println("DRAGON");
                break;
            case 9:
                System.out.println("SNAKE");
                break;
            case 10:
                System.out.println("HORSE");
                break;
            case 11:
                System.out.println("SHEEP");
                break;
            default:
                System.out.println("Nothing");
                break;
            }
    }
}

-------------------------------------------------------------------------Result

1982
DOG

というふうに干支を判別してくれます。つまり、自分の生まれた年が12で
割り切れるかまたはその余りによってswitch文で振り分けているんですね。
以上で考察を終わります。

5.感想と反省
 Javaの基本的なルールを解説せよというだけの課題なのにいろいろ調べて行く
うちに基本ってホント大事なんだと再確認させられました。
Javaは性能的にもしっかりしてるので当然システムもきちんと定義されていて
そこからJavaの幅広い知識があるということでJavaの基本ルールやポイントを
調べるだけでものすごく時間がかかりました。これからJavaの基本をきちんと
理解して応用の問題にも取り組んでいけるようにがんばっていきたいです。

6.参考文献
独習Java第2版               ジョセフ.オニール 著
                       トップスタジオ  訳  
                       武藤 健志   監修 
 
戻るべし!