Javaプログラミング始めました

 最近話題の大規模分散処理システムHadoopWikipediaなどでも利用されている全文検索エンジンLuceneなど、Javaで書かれたアプリケーションは数多くあります。それらを利用するにはJavaからアクセスするのがもっともパフォーマンスが良いです。そのため、大規模データを扱うのであれば、Javaを身につけておくことは非常に有意義だと思われます。また、データマイニングツールWekaやHadoop上で動く機械学習ライブラリMahoutなどもJavaで書かれており、機械学習用の豊富なライブラリを利用できるようになるのも重要です。さらに、JVM上で動くLispことClojureは、直にJavaのクラスを呼び出すことが出来るのですが、その折角の機能も、Javaの知識がないと宝の持ち腐れです。要するに、機械学習自然言語処理を行う上でJavaはとても重要です、学びましょう。
なお、教科書には「Eclipseで学ぶはじめてのJava2版」を利用します。


●開発環境を整える
自分の環境にあったJava6 SDKを下記からダウンロードし、インストール。私はWin7の64bit版を利用します。
http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u27-download-440405.html
(※2011/9/18時点では1.7にEclipseが対応していない模様。1.6を使いましょう)
EclipseEclipse IDE for Java EE Developers)を下記からダウンロード。
http://www.eclipse.org/downloads/


ダウンロードしたJDK6をダブルクリックでインストール。Eclipseはファイルを展開したものをC:\直下に置く。
下記を参考に初期設定や日本語化を行う。
http://kkaneko.com/rinkou/javaintro/eclipse.html


●コーディングことはじめ お約束のHello World!
Hello Worldを表示してみましょう。
新規プロジェクトを作成し、Sample_helloと名付けます。
コード的には以下のようになります。

public class Sample_hello {
	public static void main(String[] args) {
		System.out.println("hello world");
	}

}

 rubyPythonならprint "hello world"の一文で済んだのに、絶望的なコーディング量ですね。しかし心配不要。Eclipseという強力な、非常に強力すぎる味方がついています。public static void main〜と記述している箇所、実は"main"とタイプし、その後はCtrl + Spaceキーで入力補完され、mainブロックが完成します。さらに、System.out〜の部分は"sys"までタイプしたところで、またもやCtrl + Spaceとするだけで、後は表示したい文字列を記入するだけになります。つまり、実際コーディングするのはmain, sysのみ。一見冗長に見えるJavaソースですが、自分でタイプする量はそこまで膨らみません。Eclipseの恩恵を最大限享受して楽々コーディングに努めましょう。
 実行はAlt + Shift + xで実行メニューが右下隅に表示され、さらにjと打つとコンパイル実行されます。(元々Visual Studio使いの身としては、F5キーだけでデバッグ実行してくれる方が良い気もするのですがどうなのでしょう)。
 というわけで、案外簡単にHello Worldが出来ました。これにどんどん付け加えていきましょう

public class Sample_hello {
	public static void main(String[] args) {
		// コメント。実行に影響を与えません

		// 四則演算。4.0とすると、小数点まで計算する。4だと小数点部分無視する
		System.out.println((1 + 2 - 5) * 3 / 4.0); // 実行結果 -> -1.5
		// 変数利用
		int myAge = 27;
		final String MY_NAME = "AntiBayesian";// 定数
		System.out.println("私の名前は" + MY_NAME + "です。年齢は" + myAge + "歳です"); // -> 私の名前はAntiBayesianです。年齢は27歳です

		// 条件分岐文
		if (myAge < 30) {
			System.out.println("まだまだいける");
		} else if (myAge <= 25) {
			System.out.println("夢広がりまくり");//到達し得ない
		} else {
			System.out.println("おっさん");
		}

		// 配列
		int[] array = new int[3];
		array[0] = 100;
		array[1] = 20;
		array[2] = 72;

		String[] myFav = { "C#", "Clojure", "JavaScript" };

		// 繰り返し文
		int sum = 0;
		for (int cnt = 0; cnt < array.length; cnt++) {
			sum += array[cnt];
		}
		System.out.println(sum);

		for (String lang : myFav) {
			System.out.println(lang);
		}
	}
}

四則演算、条件分岐文・繰り返し文などの制御構文を書きました。
さて、ここまで書いたら後はメソッドやクラスを書こう…と思うところですが、ちょっと待った。
かりかりメソッド書いても良いのですが、Eclipseの便利機能を最大限活かしてメソッドを生成していきましょう。
まず、23行目の"int array = new int[3];"のarrayを選択し、Ctrl + 1とタイプすると、メニューが出てきて、その中に「ローカル変数をフィールドに変換」という項目があるので、それを選んでEnter押下。すると、"int array = new int[3];"がクラス変数になります。さらに、31行目からの配列の中身を合計するfor文を丸ごと選択してAlt + Shift + Mとタイプすると「メソッドの抽出」ダイアログが表示されます。メソッド名欄にsumArrayと入力してOK押下でsumArrayメソッドが作成されます。なんて簡単…。Eclipseの機能でリファクタリングされたコードは以下のようになります(余計な部分は削除しました)。

public class Sample_hello {

	private static int[] arrays;

	public static void main(String[] args) {
		arrays = new int[3];
		arrays[0] = 100;
		arrays[1] = 20;
		arrays[2] = 72;

		sumArray();

	}

	private static void sumArray() {
		int sum = 0;
		for (int cnt = 0; cnt < arrays.length; cnt++) {
			sum += arrays[cnt];
		}
		System.out.println(sum);
	}
}

とても簡単ですね。また、Ctrl + Shift + Fでコードを自動で整形してくれます。適当に処理をべた書きしておいて、メソッドにまとめたいところはメソッドに抽出機能を使い、最終的に自動整形を行えば、あら不思議、まるで最初からまともにコーディングしていたかのようなソースに。
同じようにして、メソッドに引数や戻り値を持たせてみましょう。
まずはべた書き。

public class Sample_hello {
	public static void main(String[] args) {
		int[] arrays = {1,2,3,4,5};
		int sum =0;
		//ここから選択開始
		for (int cnt=0;cnt<arrays.length;cnt++){
			sum += arrays[cnt];
		}
		//ここまで選択する
		System.out.println(sum);
	}
}

これのfor文の部分を選択してメソッド抽出Ctrl + Alt + M、さらに整形Ctrl + Shift + Fすると

public class Sample_hello {
	public static void main(String[] args) {
		int[] arrays = { 1, 2, 3, 4, 5 };
		int sum = 0;
		// ここから選択開始
		sum = sumArray(arrays, sum);
		// ここまで選択する
		System.out.println(sum);
	}

	private static int sumArray(int[] arrays, int sum) {
		for (int cnt = 0; cnt < arrays.length; cnt++) {
			sum += arrays[cnt];
		}
		return sum;
	}
}

と引数、戻り値を持ったメソッドが簡単に生成できます。


クラス呼び出してみた

public class Sample_hello {
	public static void main(String[] args) {
		TestClass.hello();
		TestClass test = new TestClass();
		test.hello2();
	}	
}


public class TestClass {
	public static void hello() {
		System.out.println("hello");
	}
	public void hello2(){
		System.out.println("helloooooooooooooo!!");
		hello3();
	}
	private void hello3(){
		System.out.println("heeeeeeeeeelo!!!!!!!!");
	}
}


パッケージを使ってみる。

import myPackage.*;
public class Sample_hello {
	public static void main(String[] args) {
		PackageTestCalss.packageMethod();
	}	
}

package myPackage;
public class PackageTestCalss {
	public static void packageMethod() {
		System.out.println("myPackage内のメソッドですよ");
	}
}


Javadocを吐いてみる。
パッケージエクスプローラ→右クリック→エクスポート→Java/Javadoc→「次の可視性を持つメンバー」=Protectedを選択→完了ボタン押下。docフォルダ生成されるので、index.htmlを右クリックして「アプリケーションから開く」→システムエディタで見る。


●ここまでの感想
JavaというかEclipseが偉い