Java3週目

第3週目 Jump to java 参照

コンソール入力と出力

生年月日(YYYYY/MM/DD)を入力してください:

このようにユーザーに上記のような文字列を見せるのがコンソール出力であり、上記の質問にユーザーが回答を入力することをコンソール入力という。


コンソールは環境によって変更されることがある。 もし、このプログラムをインテリジェイで実行したなら、インテリジェイのコンソールウィンドウがコンソールになり、ウィンドウ命令ウィンドウでこのプログラムを実行したなら、命令ウィンドウがコンソールになる。 すなわち、コンソールはユーザーの入力を受けたり、ユーザーに文字列を出力する役割をすることを通称する言葉だ。


IOException

上記の例題にmainメソッドを見ると、throwsIOExceptionを使った部分がある。 InputStreamから値を読み込む時はIOExceptionが発生する可能性があるため例外処理をしなければならないが、throwsでその例外処理を先送りさせたのだ。 

ストリーム(Stream)とは？

ストリームを最も簡単に理解するには蛇口を考えればいい。 蛇口を開けると水が出て、蛇口を閉めると水が出ない。 AというところからBというところまで水道管がつながっていて、Aから水を送り続けるとBから蛇口を開けるたびに水が出るようになるだろう。 ここでストリームはA水道管からB水道管へ移動する水の流れといえる。

ストリーム-水の流れ
* ファイルデータ（ファイルはその始まりと終わりのあるデータのストリームである。）
* HTTP送受信データ（ブラウザが要請し、サーバが応答するHTTP形態のデータもストリームである。）
* キーボード入力（ユーザがキーボードで入力する文字列はストリームである。）

こんなに簡単に覚えよう。
* * InputStream - byte
* * InputStreamReader - character
* * BufferedReader - String

Scanner
J2SE5.0からScannerというjava.util。Scannerクラスが新たに追加された。 Scannerクラスを利用すれば、コンソール入力をより簡単に処理することができる。
import java.util.Scanner;

public class Sample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(sc.next());
}
}
* next-単語
* nextLine-ライン
* nextInt-定数


パッケージ
パッケージは似たような性格のJavaクラスを集めたJavaのディレクトリである。
パッケージを使用する理由
パッケージを使えば、似たような性格のクラス同士を束ねることができ、クラスの分類が容易だ。 そして、Javaコードを作成してみると、他の人が作成したJavaクラスやライブラリーを使用しなければならない場合も多く発生するが、この時にクラス名が同じ場合も発生することがあるだろう。 しかし、パッケージ名が違えば、クラス名が同じでも衝突なく使用できる。 したがって、配布用に作成するJavaクラスは、必ずパッケージ名を含むのが正しい方法である。
上述のパッケージのメリットをまとめてみた。
* クラスの分類が容易である。 似たようなもの同士を結ぶ。
* パッケージが異なる場合は、同じクラス名を使用することができる。

アクセス制御者
1. private
2. default
3. protected
4. public

private
アクセス制御者がprivateに設定された場合、privateが付いた変数、メソッドは該当クラスでのみアクセスできる。
public class Sample {
private String secret;
private String getSecret() {
return this.secret;
}
}
secret変数とgetSecretメソッドは、ただSampleクラスでのみ接近が可能で、他のクラスでは接近が不可能だ。

default
アクセス制御者を別途設定しなければ、アクセス制御者がいない変数、メソッドはdefaultアクセス制御者となり、そのパッケージ内でのみアクセスが可能だ。

packagehouse;//パッケージが同じである。

public class HousePark {
String lastname = "park";

public static void main(String[] args) {
HouseKim kim = new HouseKim();
System.out.println(kim.lastname);//HouseKimクラスのlastname変数を使用できる。
}
}

protected
アクセス制御者がprotectedに設定されたとすれば、protectedが付いた変数、メソッドは同一パッケージのクラスまたは該当クラスを相続した他のパッケージのクラスでのみアクセスが可能だ。

public
アクセス制御者がpublicに設定されていれば、publicアクセス制御者が付いた変数、メソッドはどのクラスでもアクセスが可能だ。

 アクセス制御者を利用すればプログラマーのコーディングミスを防止でき、その他の危険要素を除去できるなどの長所がある

static変数
メモリ効率及び共有の目的で使用
class Counter {
static int count = 0;
Counter() {
count++;
System.out.println(count);
}

public static int getCount() {
return count;
}
}

public class Sample {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();

System.out.println(Counter.getCount());//スタティックメソッドはクラスを利用して呼び出し
}
}

メソッドの前にstaticキーワードをつけると、Counter.getCount()のようにオブジェクト生成なしにクラスを通じてメソッドを直接呼び出すことができる。 <共有の目的

シングルトーンパターン(singletonpattern)
今回はデザインパターンの一つであるシングルトーンについて見てみよう。シングルトーンはたった一つのオブジェクトだけを生成するよう強制するパターンだ。 すなわち、クラスを通じて生成できるオブジェクトはOnlyOne、すなわち一つだけになるように作るのがシングルトーンだ。

例外処理(Exception)

java.io.FileNotFoundException:指定されていないファイル
 ArithmeticException:4を0で割るとないので、
ArrayIndexOutOfBoundsException:配列でない値の場合

例外処理手法try ,catch
try {
...
} catch(例外1){
...
} catch(例外2){
...
...
}


try文案の遂行する文章から例外が発生しなければ、catch文の次の文章は遂行されない。 しかし、try文案の文章を遂行する途中に例外が発生すれば、例外に該当するcatch文が遂行される。

int c;
try {
c = 4 / 0;
} } catch(ArithmeticException e) {
c=-1;//例外が発生し、この文章が実行される。
}

ArithmeticExceptionが発生すれば、cに-1を代入するよう例外を処理したのだ。 ArithmeticExceptionでeはArithmeticExceptionクラスのオブジェクト、すなわちエラーオブジェクトに該当する。 このエラーオブジェクトを通じて該当例外クラスのメソッドを呼び出すことができる。

public class Sample {
public void shouldBeRun() {
System.out.println("ok thanks.");
}

public static void main(String[] args) {
Sample sample = new Sample();
int c;
try {
c = 4 / 0;
} } catch (ArithmeticException e) {
c = -1;
} } finally {
sample.shouldBeRun();//例外に関係なく無条件に実行される。
}
}
}


finally構文はtry文章遂行中に例外発生有無に関係なく無条件実行される。 したがって、上のコードを実行すれば、sample.shouldBeRun()メソッドが実行され、「OK、thanks」文章が出力されるだろう。

例外処理(throws)
呼び出した所で処理するように上に投げること

スレッド
動作しているプログラムをプロセス（Process）という。 通常、一つのプロセスは一つの仕事をするが、スレッドを利用すれば一つのプロセス内で二つまたはそれ以上の仕事を同時にすることができる。
public class Sample extends Thread {
publicvoidrun(){//Threadを相続するとrunメソッドを具現しなければならない。
System.out.println("thread run.");
}

public static void main(String[] args) {
Sample sample = new Sample();
sample.start();//start()でスレッドを実行する。
}
}

JavaはJava8バージョンから関数型プログラミングを支援するためにラムダ(Lambda)とストリーム(Stream)が導入された。 ラムダとストリームを使えば、最近流行している関数型プログラミングスタイルでジャバコードを作成することができる。

一般的なコード

interface Calculator {
int sum(int a, int b);
}
class MyCalculator implements Calculator {
public int sum(int a, int b) {
return a+b;
}
}

public class Sample {
public static void main(String[] args) {
MyCalculator mc = new MyCalculator();
int result = mc.sum(3, 4);
System.out.println(result);//7出力
}
}

インターフェースを作ってimplementsで受け取る>リターン値を出力してプリントアウト

ラムダ式の場合はこうだ

interface Calculator {
int sum(int a, int b);
}

public class Sample {
public static void main(String[] args) {
Calculator mc = (int a, int b) -> a +b;
int result = mc.sum(3, 4);
System.out.println(result);
}
}

ラムダ式は縮約も可能で、ラムダ関数を使えばMyCalculatorのような実際のクラスなしでもCalculatorオブジェクトを生成することができる。
ラムダ式はインターフェースメソッドは1つだけ可能だ。@FunctionalInterfaceをアノテーションを使用

ストリーム

文字通り解釈すれば"流れ"という意味だ。 データが波のように流れながらフィルタリング過程を通じて何度も変更されて返還されるため、このような名前を持つようになった。