본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

プログラミング自主学習 18日目 静的クラス・動的クラス/フィールドとメソッド/Class/Instance/Static

静的クラス・動的クラス

静的クラス

静的クラスとは、インスタンス化をせずに、主にメソッドを使用して使用されるクラスのことだ。

数学的演算や時間・日付などの処理などの機能が提供される。

例:Math.

 

Math.PI;
Math.ceil(1.1);

 

動的クラス

動的クラスとは、インスタンス化を通して、必要なデーターを保持し、メソッドを呼び出すことができるクラスのことだ。同じクラスから複数のインスタンス(クラスの分身だと考えば良い)を制作することで、それぞれのインスタンスを独立して管理することができ、柔軟性を提供する。

例:FileWriter

 

FileWriter a1 = new FileWriter("text.txt");
a1.write("hello");
a1.close;

FileWriter a2 = new FileWriter("text2.txt");
a2.write("hello2");
a2.close;



フィールドとメソッド

以下のコードをメソッドを使用して、分かりやすくまとめてみる。

 

 

 

PrintA()とPrintB()というメソッドを作成し、複雑なコードを片付いてみた。

しかし、ここからPrintA()とPrintB()のメソッドの値を変更したいと仮定してみよう。

 

 

 

このように、パラメーターを使って対応することができる。

しかし、今は15行目にすぎないコードが一億行目のコードだと想像してみるとパラメーターを活用したとしても
パラメターを一行一行コピーしてペーストする非常に手間がかかるだろう。

 

その際に活用することがグローバル変数である。

 


Class

先ほどのメッソドをパラメーターやグローバル変数を活用し、まとめてみた。

しかし、複雑なコードの中で、1億行のメッソドがあると仮定してみる。

それぞれのメッソドに区別がつかないので、クラスを使用してもう一度まとめる必要がある。

 

 

新しく作成されたClass Printの変数(field)とメソッドをClass Printのメンバー(MEMBER)だという。

field:delimiter method:A(), B()

 

今はMyOPPというClassに二つのClassであるMyOPPとPrintが存在するが、Refactorを使用して、引っ越しすることもできる。

 

 

 

 

 

 


Instance

一つのClassであるMyOOPの状態を変更する必要があると仮定する。

 

18行目を見ると、Printクラスの変数delimiterを宣言し、新しい値に初期化を繰り返されていることが分かる。

このような問題を解決するためには、インスタンスを活用する。

 

1)インスタンスを作成する。

class MyApp

classname
変数名 = new classname();
例) Print p1 =new Print();

 

2)既存のクラスのStaticを除去する。これにより、ClassのメンバがInstanceのメンバーになる。

class Print

public class Print {
public static string delimiter = "";

public static void A(){
  system.out.println(delimiter);
  system.out.println("A");
  system.out.println("A");
}
public static void B(){
  system.out.println(delimiter);
  system.out.println("B");
  system.out.println("B");
}
}

 

3)作成したインスタンスより変数とメソッドを活用する。

 

class MyApp

 Print p1 =new Print(); 
 p1.delimiter = "----"
 p1.A();
 p1.A();
 p1.B();
 p1.B();

 Print p2 = new Print();
 p2.delimiter = "****"
 p1.A();
 p1.A();
 p1.B();
 p1.B();

p1.A();
p2.A();
p1.A();
p2.A();


<結果>

----

A

A

----

A

A

----

B

B

----

B

B

****

A

A

****

A

A

****

B

B

****

B

B

----

A

A

****

A

A

----

A

A

****

A

A

 

このように、インスタ化によりコードが整理され、柔軟性が向上した。


Static

 

① Staticがある場合Classはinstanceの変数にもメソッドにもアクセスできない。


② InstanceはClassの変数とメッソドを利用でき、Classの変数を直接変更することもできる。

 

Instanceはお互いに独立されているため、Instance f1の変数instanceVarinstance f2の変数instanceVarは異なる存在である。