🎉

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

2023/06/15に公開

静的クラス・動的クラス

静的クラス

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

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

例: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の変数instanceVarとinstance f2の変数instanceVarは異なる存在である。

Discussion