COBOL経験者のためのjavaソース解説 その1
COBOL経験者のためのjavaソース解説 その1
内容:
COBOL経験者がjavaソースのコードから記述内容を理解するため
に必要な基本的なテーマについて、COBOLと比較しながら説明
していきます。
クラスやメソッド、変数(フィールド)が見極められれば、
とりあえず、あなたもJAVAが読めますと言えるのではないでしょうか?
**********************************************************************
基本データ型一覧
**********************************************************************
名称 内容
boolean 1ビット trueまたはfalse
char 2バイト 文字データ
byte 1バイト 整数(-128〜127)
short 2バイト 整数(-32768〜32767)
int 4バイト 整数(-2,147,483,648〜2,147,483,647)
long 8バイト 整数(-9,223,372,036,854,775,808〜
9,223,372,036,854,775,807)
float 4バイト 単精度浮動小数点数
double 8バイト 倍精度浮動小数点数
COBOLで記述
COPY句(COPY文)
01 LETTER
----------------------------------
03 NAME PIC X(10).
03 AGE PIC 9(8).
03 ADDRESS PIC X(20).
----------------------------------
javaの記述
JAVAだとcopy句をクラスにして記述することができる
class Letter {
String name;
int age;
String address;
}
**********************************************************************
値のデータ型
**********************************************************************
型宣言と同時に値を設定することができます。 COBOLならVALUE句を使うところです。
値の数値 データ型 例
整数値 int int a = 10;
小数値 double double a = 3.14;
文字 char char a = (char)65534;
文字列 String String a = "あいうえお";
真偽値 boolean boolean a = true;
**********************************************************************
算術演算子
**********************************************************************
加減乗除など、演算を行う為の計算式には以下のようなものがあります。
記号 意味 記述例 COBOLの記述
+ 和。足す a += b : COMPUTE a = a + b を表す
- 差。引く a -= b : COMPUTE a = a - b を表す
* 積。掛ける a *= b : COMPUTE a = a * b を表す
/ 除。割る a /= b : COMPUTE a = a / b を表す
% 剰余。割った余り a %= b : DIVIDE a BY b GIVING
C REMAINDER a を表す
?++ インクリメント ++a (前置型): COMPUTE a = a + 1 を表す
a++ (後置型): COMPUTE a = a + 1 を表す
?-- デクリメント --b (前置型): COMPUTE b = b - 1 を表す
b-- (後置型): COMPUTE b = b - 1 を表す
**********************************************************************
制御文
**********************************************************************
条件文
javaの記述
if文の構造
if (条件) {
文
} else {
文
}
COBOLで記述
IF 条件
THEN 文
ELSE 文
END-IF
制御変数ループ
for文の構造
for (初期化; 条件; 値の更新) {
命令文
}
(1) 初期化の実施
(2) 条件の判定→条件が否定されたらfor文から抜ける
(3) 命令文の実行
(4) 値の更新の実施
以降(2)〜(4)の繰り返し。
例)
for (i = 1; i <= 5; i++) {
命令文
}
COBOLで記述
例)
PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
命令文
END-PERFORM
do-while文の構造
do{
文
} while (!条件);
(1) 文の実行
(2) 条件の判定→条件が否定されたらwhile文から抜ける
以降(1)〜(2)の繰り返し。
COBOLで記述
例)
PERFORM UNTIL 条件式
命令文
END-PERFORM
switch文の構造
switch (評価式) {
case 定数:
文
break;
case 定数:
文
break;
…
default:
文
}
COBOLで記述
例)
EVALUATE 式
WHEN 値 文
WHEN 値 文
OTHER 文
END-EVALUATE
break文
break文はfor、while、doなどのループから脱出するときに使用します。
ループが多重になっている時は一つ外のループに抜けます。 while文にラベルをつけ、
break文でそのラベル名を指定すると多重ループの中にいても、
ラベルをつけたwhile文の外に出られます。
continue文
continue文はやはりループの中で用いられます。
continue文があるとループの終端までスキップします。
for文なら更新の実行から、while文なら条件の判定から続行します。
次の回以降のループ処理は普通に実行されます。
※ COBOLではCONTINUEは「何もしない」
return文
return文はメソッドから抜け出るときに使います。
**********************************************************************
クラス
**********************************************************************
クラスは変数とメソッドとから構成されています。
変数はフィールドと呼ばれることもあります。
変数とメソッドをまとめてメンバーと言います。
以下のクラス<
それを処理するメソッド群からなっています
( 変数 + メソッド )はメンバに含まれる
メソッドとは
・データ収集・データ加工・外部への働きかけの処理のこと
メソッドは必ず何らかのクラスに属さなければなりません。
1)パラメータ(引数)を与える
↓
2)メソッド(・データ収集・データ加工・外部への働きかけ)
↓
3)結果を出力
例)Getter Setterのクラス
javaの記述
class Letter {
String name = ""; // 変数:氏名
int age = 0; // 変数:年齢
String address = ""; // 変数:住所
void setName(String n) {
// メソッド:変数nameに氏名をセット
name = n;
}
String getName() {
// メソッド:変数nameから氏名を取得
return name; //値をメソッドの呼び出し元に返します
}
void setAge(int a) {
// メソッド:変数ageに年齢をセット
age = a;
}
int getAge() {
// メソッド:変数ageから年齢を取得
return age; // 値をメソッドの呼び出し元に返します
}
void setaddress(String n) {
// メソッド:変数nameに住所をセット
name = n;
}
String getaddress() {
// メソッド:変数nameから住所を取得
return name; // 値をメソッドの呼び出し元に返します
}
【Getter Setterの生成】(これもメソッド)
プロパティという概念を導入し、そのプロパティを読み書きするためのメソッドを用意する。
Getter Setterを用意するとjspからオブジェクトに簡単にアクセスできるようになります。
おきまりなので、こんなもんかなて感じで覚えよう
プロパティ読み取り用のメソッド名: get +プロパティ名
(プロパティのデータ型がbooleanの時のみ、is +プロパティ名)
プロパティ書き込み用のメソッド名: set +プロパティ名
【アクセス修飾子】
(1) publicどこからでもアクセスが可能
(2) protected同一パッケージ内のすべてのクラス、
および別パッケージのサブクラスからのアクセスが可能
(3) 修飾子なし同一パッケージ内のすべてのクラスからのアクセスが可能
(4) private同一クラスからのみアクセスが可能
**********************************************************************
COBOLの場合、初めて呼ばれた時にメモリ領域を展開します。
**********************************************************************
COBOLで記述
JAVAのクラスは、COBOLではプログラムに当たります。
では、JAVAのメソッドはどうかというとクラスに含まれる処理の単位となる。
COBOLで記述するとすると、プルグラム内の入り口としてENTRYとして記述するか
別プログラムで記述するのが妥当と思われます。
メソッド呼び元 CALL 'NAME' USING N
メソッド呼び元 CALL 'AGE' USING A
メソッド呼び元 CALL 'ADDRESS' USING AD
呼び先 〜
WORKING-STORAGE SECTION.
01 NAME PIC X(8).
01 AGE PIC 9(2).
01 ADDRESS PIC X(20).
LINKAGE SECTION.
01 N PIC X(8).
01 A PIC 9(2).
01 AD PIC X(20).
PROCEDURE DIVISION
〜
ENTRY NAME.
MOVE N TO NAME.
GOBACK.
ENTRY AGE.
MOVE A TO AGE.
GOBACK.
ENTRY ADDRESS.
MOVE AD TO ADDRESS.
GOBACK.
STOP RUN.
**********************************************************************
オブジェクト(インスタンス)の作成
**********************************************************************
newによりメモリ上に展開されるデータの実体をインスタンスまたはオブジェクトといいます。
クラス名 参照変数 = new クラス名()
例)
Letter ICHIROU = new Letter ("一郎",34,"nyk u.s.a");
//インスタンスの生成
オブジェクトのメンバへのアクセス
参照変数(またはオブジェクト).フィールド変数
//オブジェクトのフィールド参照
参照変数(またはオブジェクト).メソッド
//オブジェクトのメソッド参照
例)
ICHIROU.getName(); //メソッドの呼び出し
**********************************************************************
参照型変数をフィールドとして持つクラス。
**********************************************************************
クラスの定義を行うと同時にクラス名と同じ名前のデータ型が作られる。
クラスの定義によって作られたデータ型を、基本データ型に対して参照型といい
参照型を持つ変数のことを、特に参照変数といいます。
オブジェクトのフィールドやメソッドにアクセスするのに参照変数を使います。
例)
// ContxtFieldRun.java
/**
* 自クラスの参照型変数をフィールドとして持つクラス。
*/
class ContxtField
{
// 自クラスの参照型変数のフィールドdataを定義します。
ContxtfField contxtField;
// int型変数のフィールドdata1を定義します。
int data1;
// int型変数のフィールドdata2を定義します。
int data2;
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class ContxtFieldRun
{
public static void main( String[] args )
{
// まずContxtFieldクラスのインスタンスを作り、
// 参照型変数contxtに参照を入れます。
ContxtField contxt = new ContxtField();
// もうひとつContxtFieldクラスのインスタンスを作り、
// 先ほど作ったインスタンスのContxtFieldフィールドに
// 参照を入れます。
contxt.ContxtField = new ContxtField();
// 2つめのインスタンスにあるdata1フィールドに
// 「100」を入れ、それを出力します。
contxt.ContxtField.data1 = 100;
System.out.println( contxt.ContxtField.data1 );
// 2つめのインスタンスにあるdata2フィールドに
// 「200」を入れ、それを出力します。
contxt.ContxtField.data2 = 200;
System.out.println( contxt.ContxtField.data2 );
// 実行結果:
// 100
// 200
}
}
**********************************************************************
COBOLで記述 ContxtFieldRunの処理
**********************************************************************
インスタンス(ContxtField)をプログラムとして記述。
(COBOLで8桁以上のプログラム名はエラーかもしれませんがJAVAにあわせました。)
呼び元
CALL 'CONTXTFIELD' USING CONTXTFIELD
呼び先のプログラム”CONTXTFIELD”の記述
〜
LINKAGE SECTION
01 CONTXTFIELD.
03 DATA1 PIC S9(9) COMP-3.
03 DATA2 PIC S9(9) COMP-3.
PROCEDURE DIVISION USING CONTXTFIELD.
〜
MOVE 100 TO DATA1.
MOVE 200 TO DATA2.
DISPLAY DATA1.
DISPLAY DATA2.
GOBACK.
**********************************************************************
staticメンバー
**********************************************************************
staticメンバー
newしなくてもクラス定義が実行された時点でメモリ上に展開されます。
staticでないメンバーをインスタンスメンバー(インスタンス変数/インスタンスメソッド)と言います。
1つのクラスにstaticメンバーとインスタンスメンバーとを混在して記述することができます。
staticは、クラス特有の値をもち、オブジェクト毎に値を持ちません。
class Car {
static int price = 0; // static変数
private String parts = "";
private int speed = 0;
以下省略…
staticメンバーのアクセス
インスタンスメンバーは「インスタンス名.メンバー名」と呼び出しますが、
staticメンバーは、インスタンスが生成されないので「クラス名.メンバー名」で呼び出します。
speed speedup = new speed();
//インスタンスの生成(インスタンス名=speedup)
speedup.speed; //インスタンスメンバーはインスタンス名speedupを使う
Car.price; //staticメンバは「クラス名.メンバー名」で呼び出す
//クラス名=Car staticメンバー=price を使う
static変数
static修飾子を使用して宣言される変数
すべてのオブジェクトが共有して使用する変数となる
例)javaの記述
public class TestCount{ //クラスTestCount定義
static int counterA; //static変数counterAの定義
//クラスにたいして1個しかエリアをもたない
int counterB; //インスタンス変数counterB定義
//メソッドごとにエリアがもたれる
//インスタンス変数
public static void main(String []args) {
TestCount testA = new TestCount(); //インスタンスtestAの生成
// TestCount型の変数testAの定義
//とメモリ領域の確保
TestCount testB = new TestCount(); //インスタンスtestBの生成
//TestCount型の変数testBの定義
//とメモリ領域の確保
testA.count(); //testAのメソッドcount()の呼出し
testB.count(); //testBのメソッドcount()の呼出し
}
public void count() { //メソッドcount()の定義
for(int i=0; i<5; i++){
counterA++; //counterA=cunterA+1
counterB++; //counterB=cunterB+1
}
System.out.println("counterA="+counterA);
System.out.println("counterB="+counterB);
}
}
実行結果
counterA = 5 //testAの結果:
counterB = 5 //testAの結果:
counterA = 10 //testBの結果:クラス単位にエリアが持たれる為、
//値が引継がれる
counterB = 5 //testBの結果:メソッド単位にエリアが持たれる為、
//値が引継がれない
**********************************************************************
static変数で指定したデータ項目をCOBOLで指定したら
**********************************************************************
COBOLで記述
counterAは、最初に0を設定し、それ以降状態を引き継がれるように定義する
為、呼びもとの項目とした。
counterBは、testAとtestBでそれぞれ0が設定されるイメージ
なので呼び先の項目とした。
メソッド呼び元
MOVE 0 TO counterA.
CALL 'testA' USING counterA.
CALL 'testB' USING counterA.
呼び先
〜
LINKAGE SECTION
01 counterA PIC 9(8).
WORKINGSTRAGE SECTION.
01 counterB PIC 9(8).
PROCEDURE DIVISION
〜
ENTRY testA.
MOVE 0 TO counterB.
PERFORM VARYING i FROM 1 BY 1
UNTIL i > 5
ADD 1 TO counterA
ADD 1 TO counterB
END-PERFORM
DISPLAY "counterA=" + counterA)
DISPLAY "counterB=" + counterB)
GOBACK.
ENTRY testB.
MOVE 0 TO counterB.
PERFORM VARYING i FROM 1 BY 1
UNTIL i > 5
ADD 1 TO counterA
ADD 1 TO counterB
END-PERFORM
DISPLAY "counterA=" + counterA)
DISPLAY "counterB=" + counterB)
GOBACK.
STOP RUN.
**********************************************************************
thisキーワード
**********************************************************************
thisキーワード
クラスの中でローカル変数を識別したい時thisを使います。
String name = ""; // (1)ローカル変数name
void setName(String name) { // (2)引数name
this.name = name; // this.nameは(1)ローカル変数name、
//右辺のnameは(2)引数name
}
**********************************************************************
継承
**********************************************************************
オブジェクト思考の考え方は、参照や更新をするデータ項目を
限定したクラスでさせることにあります。
継承は、フィールド変数やメソッドを別のクラスが引く継ぐことが
できるのようになり、オブジェクト思考のとても重要な概念になります。
継承とは、他のクラスを用いて、そのクラスに特徴を追加
したり、特徴を変更したりして新しいクラスを定義する
仕組みのことです。
また、親クラス(継承するクラス)の機能を上書きする
ことをオーバーライドといいます。
例)RapidCarは Carを継承したクラスとして作成
class RapidCar extends Car { // extendsはCarを継承することを示す
int speedup() { // メソット speedupを追加
speed = speed + 20 //
return speed;
}
}
RapidCar rapidCarObj = new RapidCar();
rapidCarObj.speedup(); // メソット speedupを呼び出し
rapidCarObj.speedDown(); // Carクラスのメソット speedDownを呼び出し
public class Car { //Carクラス
int speed; //フィールド変数
int speedup() { //Carクラスのメソッド
speed = speed + 10;
return speed;
}
int speedDown() { //Carクラスのメソッド
speed = speed - 10
if (speed < 0) {
speed = 0;
}
return speed;
}
}
**********************************************************************
COBOLの継承の場合、
**********************************************************************
COBOLで記述
COBOLでは、継承クラスが親クラスの処理を上書きするオーバーライド
することができないので、子クラスがオーバライドするかわりに
ある条件を満たせば処理する記述にすることにより実現できます。
例)親クラスが子クラス(継承クラス)を呼ぶ
(RAPIDCARの処理する条件は、POWERが50より大きいこととした)
呼び先
〜
LINKAGE SECTION
01 POWER PIC 9(8).
WORKINGSTRAGE SECTION.
01 SPEED PIC 9(8).
PROCEDURE DIVISION
〜
ENTRY CAR.
MOVE 0 TO SPEED.
CALL 'RAPIDCAR' USING SPEED.
PERFORM SPEEDUP.
PERFORM SPEEDDOWN.
GOBACK.
SPEEDUP SECTION.
IF SPEED < 20
ADD 10 TO SPEED
END-IF.
SPEEDUP-EXIT.
SPEEDDOWN SECTION.
ADD -10 TO SPEED.
SPEEDDOWN-EXIT.
ENTRY RAPIDCAR.
IF POWER > 50
ADD 20 TO SPEED
END-IF.
GOBACK.
STOP RUN.