🎉

プログラミング自主学習 DAY8 インスタンス/継承/今までの知識でアプリ作成

2023/06/15に公開

Instance

初心者基準で考えると、実在する結果物として考えればいい。
鯛焼きという概念(設計図)がClass。
そのたい鯛焼きを作るため、直接調理して出される鯛焼き(結果物)がInstanceだ。
そして、これをインスタンス化(インスタンスを生成する)という。

ClassによってInstanceを作るかどうかが異なる。
MathのようなClassは基本的にはインスタンス化をしない。

しかし、PrintWriterのようなClassでは、
Class名の前にnewを入力し、コンストラクタ(構築者,생성자)を通してインスタンス化をする。

プログラムを作るための思考法

プログラムの目的➡ その目的を果たすため、どのClassを宣言するか
※どのClassを宣言するか、知らない場合は詮索してみたり、API documentationを参照する問題解決力が必要。

目的:result1.txtにhello1というテキストを入れる。
Class:調べた結果、PrintWriterを宣言することにした。

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class InstanceApp {
public static void main(String[] args) throws IOException {

PrintWriter p1 = new PrintWriter("result1.txt");
p1.write("hello 1");
p1.close();



 1. newを入力することでPrintWriterのコピーを作り、p1という変数に格納する。
 2. このp1に格納された値がPrintWriterのInstance(インスタンス)である。
 3. 変数p1は変数であるためデータータイプが必要だ。
 4. p1に何でも入れるわけにはいかないため、p1の前にPrintWriterをデータ型として入力する。
 5. p1にはPrintWriterのclassのInstanceだけ入るようになった。
 6. 例外処理をする。現時点では理解しなくて構わない。まずは例外処理を行っておく必要があることだけを覚える。

それなら、なぜインスタンスを活用するのか?
以下はインスタンス化したプログラムの結果である。

PrintWriter p1 = new PrintWriter("result1.txt");
p1.write("hello 1");
p1.close();

PrintWriter p2 = new PrintWriter("result2.txt");
p2.write("hello 2");
p2.close();

result1.text -> hello 1
result2.text -> hello 2

しかし、インスタンス化をしなかった仮想のコードの場合は、

PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result2.txt", "Hello 1");
PrintWriter.write("result1.txt", "Hello 2");
PrintWriter.write("result1.txt", "Hello 3");
PrintWriter.write("result2.txt", "Hello 3");
PrintWriter.write("result1.txt", "Hello 1");
PrintWriter.write("result2.txt", "Hello 2");
PrintWriter.write("result2.txt", "Hello 1");
PrintWriter.write("result1.txt", "Hello 2");

インスタンスを活用できず、入力が必要なたびに相当な手間がかかることが分かる。
場合によって異なるが、インスタンス化を通じて、効率を上げることができる。

Inheritance (継承,상속)


Youtube '생활코딩', JAVA1- 13.5 자바 문서 보는 법- 상속


PrintWriterはWriterクラスを元に改造(拡張)し、WriterはObjectというクラスを元に拡張した。

継承(拡張)元となるクラスのことを 「スーパークラス」
継承(拡張)した新しいクラスのことを 「サブクラス」 という。
ここで重要なポイントは「サブクラス」PrintWriterは「スーパークラス」のWriter、Objectの変数とメッソドを呼び出すことができる。逆に「スーパークラス」は「サブクラス」のメッソドを呼び出すことができない。


Youtube '생활코딩', JAVA1- 13.5 자바 문서 보는 법- 상속

また、「サブクラス」PrintWriterも「スーパークラス」のWriterと同じwriteというメッソドがあることが分かる。
この場合、PrintWriterはを「スーパークラス」Writerのwriteメッソドを使わず、自分がアレンジしたwriteメッソドを呼び出す。
このように親クラス(スーパークラス)のメッソドを子クラスが定義し直すことをOverride(オーバーライド) という。

今までの知識でアプリ作成


販売者(seller)が商品を販売して得た利益を配当するアプリを作成する。

1.変数なし(一番単純)

public class AccountingApp {
public static void main(String[] args) {

System.out.println("value of supply : "+5000.0);
System.out.println("VAT : " +(5000.0*0.1));
System.out.println("Total : "+(5000.0+5000.0*0.1));
System.out.println("Expanse : "+(5000.0*0.3));
System.out.println("Income : "+(5000.0-5000*0.3));
System.out.println("Devidend 1: "+(5000.0-5000*0.3)*0.5);
System.out.println("Devidend 2: "+(5000.0-5000*0.3)*0.3);
System.out.println("Devidend 3: "+(5000.0-5000*0.3)*0.2);

   }
 
}
value of supply : 5000.0
VAT : 500.0
Total : 5500.0
Expanse : 1500.0
Income : 3500.0
Devidend 1: 1750.0
Devidend 2: 1050.0
Devidend 3: 700.0

Ctrl+F(Find/Replace)を通して、Value of supplyを変更できる。
今度は5000から15072.5を代入してみるとこのような結果が表示される。

System.out.println("value of supply : "+15072.5);
System.out.println("VAT : " +(15072.5*0.1));
System.out.println("Total : "+(15072.5+15072.5*0.1));
System.out.println("Expanse : "+(15072.5*0.3));
System.out.println("Income : "+(15072.5-15072.5*0.3));
System.out.println("Devidend 1: "+(15072.5-15072.5*0.3)*0.5);
System.out.println("Devidend 2: "+(15072.5-15072.5*0.3)*0.3);
System.out.println("Devidend 3: "+(15072.5-15072.5*0.3)*0.2);
value of supply : 15072.5
VAT : 1507.25
Total : 16579.75
Expanse : 4521.75
Income : 10550.75
Devidend 1: 5275.375
Devidend 2: 3165.225
Devidend 3: 2110.15

2.変数を活用
同じ数字を一括して、変数にまとめる素晴らしい機能がある。
Extract Local Variableという機能であり、ショートカットキーはAlt+Shift+Lである。

double valueOfSupply = 10000.0;

System.out.println("value of supply : "+ valueOfSupply);
System.out.println("VAT : " +(valueOfSupply*0.1));
System.out.println("Total : "+(valueOfSupply+valueOfSupply*0.1));
System.out.println("Expanse : "+(valueOfSupply*0.3));
System.out.println("Income : "+(valueOfSupply-valueOfSupply*0.3));
System.out.println("Devidend 1: "+(valueOfSupply-valueOfSupply*0.3)*0.5);
System.out.println("Devidend 2: "+(valueOfSupply-valueOfSupply*0.3)*0.3);
System.out.println("Devidend 3: "+(valueOfSupply-valueOfSupply*0.3)*0.2);

double valueOfSupply = 10000.0;
double vatRate = 0.1;
double expanseRate = 0.3;
double vat = valueOfSupply*vatRate;
double total = valueOfSupply+vat;
double expanse = valueOfSupply*expanseRate;
double income = valueOfSupply-expanse;
double devidend1 = income*0.5;
double devidend2 = income*0.3;
double devidend3 = income*0.2;

System.out.println("value of supply : "+ valueOfSupply);
System.out.println("VAT : " +vat);
System.out.println("Total : "+total);
System.out.println("Expanse : "+expanse);
System.out.println("Income : "+income);
System.out.println("Devidend 1: "+devidend1);
System.out.println("Devidend 2: "+devidend2);
System.out.println("Devidend 3: "+devidend3);
value of supply : 10000.0
VAT : 1000.0
Total : 11000.0
Expanse : 3000.0
Income : 7000.0
Devidend 1: 3500.0
Devidend 2: 2100.0
Devidend 3: 1400.0

3.inputを活用
実引数と仮引数を活用する。
ただし、変数がダブル型なので、string型 args(仮引数)ををダブル型にキャストする。

しかし、このプログラムを作動するためには常にEclipseを起動する必要がある。
CMDを通してCompileし、Run(&Input)をする。

このプログラムを自分のパソコンだけではなく、他の人のパソコンにも作動できるためには
相手のパソコンにもJVMがインストールされている必要がある。
JVMもインストールしていない場合は、launch4jを通してファイルをコンバートすることができるようだ。

Discussion