본문 바로가기

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

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

Instance

初心者基準で考えると、実在する結果物として考えればいい。

鯛焼きという概念(設計図)Class。

そのたい鯛焼きを作るため、直接調理して出される鯛焼き(結果物)がInstanceだ。

そして、これをインスタンス化(インスタンスを生成する)という。

ClassによってInstanceを作るかどうかが異なる。

Math.PIのような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クラスを元に改造(拡張)し、WriterObjectというクラスを元に拡張した。

継承(拡張)元となるクラスのことを「スーパークラス」
継承(拡張)した新しいクラスのことを「サブクラス」という

ここで重要なポイントは「サブクラス」PrintWriter「スーパークラス」のWriterObjectの変数とメッソドを呼び出すことができる。逆に「スーパークラス」「サブクラス」のメッソドを呼び出すことができない。


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


また、「サブクラス」PrintWriter「スーパークラス」Writerと同じwriteというメッソドがあることが分かる。

この場合、PrintWriterはを「スーパークラス」Writerwriteメッソド使わず、自分がアレンジしたwriteメッソド

呼び出す。このように親クラス(スーパークラス)のメッソドを子クラスが定義し直すことをOverride(オーバーライド)という。


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

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

販売者(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を通してファイルをコンバートすることができるようだ。