Java学習ノート_140710（実行時ファイル入出力、while/do-while文、ラベル）

# 実行時のファイル入出力

コマンドプロンプトで、`java FileOutput > result.txt`とすると同一階層にresult.txtが作成され、`System.out.println("hogehoge");`の実行内容が表示される。

入力は、`java FileInput < input.txt`。

```java:FileIOSample.java
import java.util.Scanner;
public class FileIOSample {
	public static void main(String[] args) {
		System.out.println("数値を入力してください。"); //ファイル出入力の場合、コマンドプロンプトには表示されない。
		Scanner sc = new Scanner(System.in);
		int i = sc.nextInt();
		System.out.println("入力された値は"+ i +"です。");
	}
}
```

```text:FileInput.txt
10000
```

```
//コマンドプロンプト
java FileIOSample <FileInput.txt >FileOutput.txt

```

```text:FileOutput.txt
数値を入力してください。
入力された値は10000です。
```
## コマンドプロンプトからjavacの一括コンパイル

javac で、スペース区切りで複数の.javaファイルをコンパイルできる。*.javaでディレクトリ内のすべての.javaファイルがコンパイルされる（けど変なファイルあると当たり前にエラーが出る）。Eclipseだと意識しなくてもいいけど一応メモ。


## Eclipseでの実行結果のファイル出力

実行の構成＞共通のファイル入出力で、ファイルをチェックして、システムから適当にファイル名をconsole.logとかにして実行するとテキストファイルが生成され実行結果が内部に保存される。

# while, do-while文

実はあんまり使わない気がするので、サンプルコード写経してみた。

```java:WhileSample.java
public class WhileSample {
	public static void main(String[] args) {
		int counter = Integer.parseInt(args[0]);
		while(counter < 100){
			System.out.println(counter);
			counter++;
		}
	}
}
```

```java:DoWhileSample.java
public class DoWhileSample {
	public static void main(String[] args) {
		int counter = Integer.parseInt(args[0]);
		do{
			System.out.println(counter);
			counter++;
		}while(counter < 100);
	}
}
```

* continue : ループ処理をスキップ
* break : ループ処理から離脱

## ラベル

多重のループ処理をスキップするときなどに使用。よくわからないので書く。

```java:LabelSample.java
public class LabelSample {
	public static void main(String[] args) {
		outerloop: for(int i =0; i < 100; i ++){
			for(int j = 0; j < 100; j++){
				if(i  > 50){
					break outerloop; //iが51になったタイミングでouterloopのループの階層まで離脱
				}
				System.out.println( "i : " + i + " / j : " + j );
			}
		}
		System.out.println("ループ処理を終了しました。");
	}
}
```

# 問題1

###任意の数までの素数の計算

```java:PrimeNumber.java
public class PrimeNumber {
	public static void main(String[] args) {
		int limit = Integer.parseInt(args[0]);
		int len = 0;
		for(int i = 2; i <=limit; i++ ){
			boolean isPrimeNumber = true;
			for(int j = 2; j < i; j++){ // iより少ないすべての整数で割り切れるか判定を繰り返す
				if(i % j == 0){
					isPrimeNumber = false;
					break;
				}
			}
			if(isPrimeNumber){
				System.out.println( i + "は素数です。" );
				len++;
			}
		}
		System.out.println("2から" + limit + "までの素数は、以上の" + len +"個です。");
	}
}
```
# 問題2

## ランダムで文字を表示

```java:RandomSample.java
import java.util.Random;

public class RandomSample {
	public static void main(String[] args) {
		String[] words = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
		Random rand = new Random();
		System.out.println(words[rand.nextInt(words.length)]);
		System.out.println(words[rand.nextInt(words.length)]);
	}
}
```

# メソッドの基本

コード内で、例えば`static void add(int a, int b)`と宣言されたメソッドに含まれる引数をformal number,`add(15,5);`で実際に渡される引数をactual parameterと言うらしい。

```java:MethodSample.java
public class MethodSample {
	public static void main(String[] args) {
		int num =  multipleNumber(100);
		System.out.println(num);
	}
	static int multipleNumber(int a , int b){
		return a * b;
	}}
```

メソッドを利用することでコードを機能毎に適切に分割することができる。保守性や再利用性が上がって便利。さきほどの素数計算のプログラムも、メソッドを使うことで以下のように書き換えられる。

```java:PrimeNumber2.java
public class PrimeNumber2 {
	public static void main(String[] args) {
		int limit = Integer.parseInt(args[0]);
		int len = 0;
		for(int i = 2; i <=limit; i++ ){
			boolean isPrimeNumber = checkPrimeNumber(i);
			if(isPrimeNumber){
				System.out.println( i + "は素数です。" );
				len++;
			}
		}
		System.out.println("2から" + limit + "までの素数は、以上の" + len +"個です。");
	}
	static boolean checkPrimeNumber(int i) {
		boolean isPrimeNumber = true;
		for(int j = 2; j < i; j++){
			if(i % j == 0){
				isPrimeNumber = false;
				break;
			}
		}
		return isPrimeNumber;
	}
}
```

## メソッドの修飾子

staticなメソッドは、インスタンスをnewせずに呼び出すことができる。

# クラスの利用

```java:ClassSample.java
public class ClassSample {

	public static void main(String[] args) {	
		Person p1 = new Person();
		p1.name = "hanamura taro";
		p1.age = 15;
		p1.showProfile();
		
		Person p2 = new Person();
		p2.name = "arakawa tomonori";
		p2.age = 40;
		p2.showProfile();
	}
	static void ShowPair(Person p1, Person p2){
		System.out.println(p1.name + " と "  + p2.name + "、合わせて" + (p1.age + p2.age) + "歳です。");
	}
}
```
```java:Person.java
public class Person {
	//フィールド
	String name = "John Doe";
	int age = 120;
	
	void showProfile(){
		System.out.println("名前 : " + name + " / 年齢 : " + age + "歳");
	}
}
```

* [プロパティとフィールド - ushiday Wiki　(#ﾟДﾟ)/~~](https://sites.google.com/site/ushiwiki/java/property)

フィールドをゲッタ/セッタでアクセス制限したものがプロパティ。フィールドには初期値がデフォルトで設定される（0とかnullとかfalseとか）。クラス定義時に初期値を設定する。

## 複数のクラスを1つのファイルに記述できる。

そういえばProcessingでも出来てた。

public 修飾子をつけると、エラーが出る。public 修飾子をつけた場合、ファイル名とクラス名を同じにしなければならない。

```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	public 型 Dog はそれ独自のファイル内に定義されなければなりません

	at Dog.<init>(DogSample.java:1)
	at DogSample.main(DogSample.java:10)
```

```java:PersonSample.java
class Person {
	String name;
	int age;

	// コンストラクタ
	Person(String name, int age) {
		//thisを用いて明示的にフィールドであることを示すor仮引数の名前をフィールドと重複させない 
		this.name = name;
		this.age = age;
	}

	public void showInfo() {
		System.out.println("名前 : " + name + " / 年齢 : " + age + "歳");
	}

}

class PersonSample {

	public static void main(String[] args) {
		Person p = new Person("花村太郎", 30);
		p.showInfo();
	}

}
```
#その他

## Javaのバージョン

Javaのバージョンは、コマンドプロンプトで、`java -version`で確認できるがJava 8という記述は1.8のことを指してるようだ。Java SE 8 (JDK 1.8)みたいな。参考書選びでレビューを見ていると、1.4以前と以降では結構違うみたいなことが書いてあった。Effective Java 第2版は買ったほうが良さげ。

## for文のカウンタ変数 i, j, k

FORTRANの整数型変数の名残らしい。トリビア。

## Eclipse(4.4)でプロジェクトを作成した後での名称変更

パッケージ・エクスプロラーから対象プロジェクトを右クリック→リファクタリング→名前変更

## CmdSpace.exeでの入力切替

自分のマシンはMacなので、文字入力の切り替えが左上小指で押すのがどうしてもなれないので、検索してCmdSpaceをインストールした。Alt + Spaceで文字入力の切り替えができる。環境構築して自分に合わせるのもいいけど、あんまりカスタマイズしすぎるとその環境以外で作業できなくなりそう。

## Chromeで直接クリップボードにコピー

よく考えたら[Keyconfig](https://chrome.google.com/webstore/detail/empty-title/okneonigbfnolfkmfgjmaeniipdjkgkl?hl=ja)のクリップボードアクションでできる。使い方は以下が詳しい。

* [ChromeのショートカットキーはKeyconfigでさらに便利になる](http://hep.eiz.jp/201301/chrome-shortcut-keyconfig/)

## Qiitaでのノートの取り方

項目の章立てというか、見出しの階層関係は基本的にメモをしてる時に考えないで、基本的にH1の見出しで並列に記述を続けて、最終的に順序の整理して要素の階層化を行う。