情報工学演習Ⅰ Java入門の入門 104 slides
表現系工学研究室の担当する内容 (ソフトウェア工学と人工知能の基礎) 認知システム論 演習Ⅰ 実験Ⅰ AIプログラミング Java入門の入門 オブジェクト指向 プログラミングⅠ ニューラルネット(1)(2) 探 索 論 理 論 理 ヒューマン・サイバネティクス 実験Ⅱ ニューラルネット 機械学習
内容 Javaの文法や扱うデータについて: C言語との共通点を確認する. C言語との相違点を学ぶ. (オブジェクト指向の内容は含まない.) 参考文献 改訂 新Java言語入門,林 晴比古,ソフトバンクパブリッシング(2004)
1 Javaの周辺 ・Javaとはどのような言語か ・Javaはどのような環境で動作するのか ・Java仮想マシンとは何か
Java言語とは Sun Microsystems社で開発されたプログラミング言語 プラットフォーム独立 CPUやOSが異なっていてもOK.移植が不要 ネットワークに1つあれば,どのプラットフォームからもダウンロードできる Write Once, Run Anywhere
Java仮想マシン (JVM: Java Virtual Machine) 仮想的なCPU.その機械語をバイトコードという. Javaコンパイラは,ソースプログラムをバイトコードにコンパイルする. 各プラットフォーム用のJVMでバイトコードを実行する. JVMは,インタプリタでバイトコードを解釈実行したり,ネイティブコンパイラで機械語に翻訳して実行する.
Javaで作成できるプログラム アプリケーション アプレット(Applet) サーブレット(Servlet) コンソール型アプリケーション ウィンドウ型アプリケーション アプレット(Applet) ホームページに埋め込まれて動作する サーブレット(Servlet) サーバーの上で動作する
Javaクラスライブラリ Javaプログラムはクラスという単位で構成される.
パッケージ 関連したクラスがパッケージと呼ばれる単位でまとめられている. 主要なJavaパッケージ パッケージ名 説明 java.applet アプレット作成 java.awt GUI java.io 入出力 java.lang Java言語の基本機能 java.math 算術演算 java.net ネットワーク処理 java.util ユーティリティ機能
Java開発キット JDK (Java Development Kit) Eclipse Sun Microsystems社のフリーソフト バージョン 1.0→1.1→1.2→1.3→1.4→5.0 J2SE = Java2 Standard Edition J2EE = Java2 Enterprise Edition J2ME = Java2 Micro Edition J2SE 5.0 (=Java2 Standard Edition 5.0) Eclipse IBM商品がオープンソース化したもの
・Javaプログラムの基本スタイル ・コンパイルと実行の方法 2 最初のアプリケーション ・Javaプログラムの基本スタイル ・コンパイルと実行の方法
基本プログラム例(1) ファイル名は Jsmp1.java のように .java を付ける. 大文字と小文字は区別される. public class Jsmp1{ public static void main(String args[]) { System.out.println("My first java."); } 2004.05.11 ここから
基本プログラム例(2) Jsmp1.java クラス メソッド public class Jsmp1{ クラス名とファイル名は同じ public class Jsmp1{ public static void main(String args[]) { System.out.println("My first java."); } クラス メソッド プログラムはmainメソッド からスタートする
基本プログラム例(3) System.out.println("My first java."); 1つの命令(文)最後に”;”が付く 画面に出力しろという命令 出力する内容(引数という)
プログラムのコンパイル手順 コマンドプロンプトを起動し,カレントディレクトリに移動する。 cd ........ プログラムをコンパイルする。 javac ファイル名 (例: javac Jsmp1.java) (成功すると クラス名.class というファイルが作られる) プログラムを実行する。 java クラス名 (例: java Jsmp1) (ここは,ファイル名ではないことに注意!) 2004.04.27 ここまで
3 最初のアプレット 省略
4 最初のウィンドウ型アプリケーション 省略
・コメント ・字下げ ・名前の付け方 ・文字列の出力 ・変数宣言と数値出力 ・繰り返し文と条件文の雰囲気 5 Javaの基礎知識 ・コメント ・字下げ ・名前の付け方 ・文字列の出力 ・変数宣言と数値出力 ・繰り返し文と条件文の雰囲気
基本スタイル public class クラス名{ public static void main(String args[]) { (いろいろな記述) }
コメントを入れる(1) /* ファイル名 Cmnt.java 開発者 ○○ ○○ 作成日 2006.10.18 */ 開発者 ○○ ○○ 作成日 2006.10.18 */ public /* このようにもコメントを入れられます */ class Cmnt{ public static void main(String args[]) { //mainの記述 System.out.println(“My first java.”); //文字出力 }
コメントを入れる(2) 用例1 /* a = 10; b = 20; c = 30; */ デバッグ作業への利用
字下げで見やすくする public class Smp1b { public static void main (String args[]) { System.out.println("My first java."); System.out.println("My second java."); }
名前のつけかた 1文字目に使用できる文字: 英字大文字(A~Z),英字小文字(a~z) 下線( _ ),ドル($) $はユーザは処理系用 2文字目以降に使用できる文字: 1文字目で使用できる文字 数字(0~9) 予約語(Javaが文法上使用するキーワード)は使用不可 大文字と小文字は区別される 全角文字(2バイト文字)はOK.
名前の慣例(1) 変数名とメソッド名には小文字を使う: int dt; public void sample1() 名前が複数の語で構成される場合,それぞれの語の先頭を大文字にするか,区切りにアンダーバー( _ )を入れる: public void getData() public void get_data()
名前の慣例(2) クラス名は先頭を大文字にする: public class Greeting public class TextSort 記号定数はすべて大文字にする。複数の語で構成されるときには,必要ならアンダーバー( _ )で区切る: public static final int SIZE = 1000; public static final int MAX_DATA = 2000;
文字列を出力する public class Jsmp4{ public static void main(String args[]) { System.out.print("AAAAA"); System.out.print("BBBBB\nCCCCC\n"); System.out.println("DDDDD"); System.out.println("EEEEE\nFFFFF\n\nGGGGG"); }
変数と代入 数字,文字等 変数への値の代入 a = 3; 変数 a
数値出力 自動的に 文字列に 変換される 文字列の結合 public class Jsmp5 { public static void main (String args[]) { int a, b, sum; a = 100; //変数aに100を代入 b = 200; //変数bに200を代入 sum = a + b; //変数sumにa+b (=300)を代入 System.out.print("a="); //文字列だけ System.out.println(a); //数値だけ System.out.println("b=" + b); //文字列と数値 System.out.println("a+b=" + sum); //結果 System.out.println("a+b=" + (a+b)); //直接計算 } 自動的に 文字列に 変換される 文字列の結合
繰り返し処理 public class Jsmp6 { public static void main (String args[]) { int i, sum; for(i=1; i<=5; i++) System.out.println("i = " + i); sum = 0; for(i=1; i<=5; i++) { sum = sum + i; System.out.println("sum = " + sum); } 繰り返される部分 繰り返される部分
条件処理 public class JSmp7 { public static void main (String args[]) { int i; for(i=1; i<=5; i++) { System.out.println("i = " + i); if (i < 3) System.out.println(" 3未満です"); else System.out.println(" 3以上です"); }
条件判定式 if (a == b) ー もしaとbが等しいなら if (a != b) ー もしaとbが異なるなら
よくあるエラー '{'と'}'の対応が取れていない '('と')'の対応が取れていない "(二重引用符号)の対応が取れていない /* と */ の対応が取れていない 文末の';'を忘れている 大文字と小文字の違いがある メインクラス名とファイル名が不一致である
・基本データ型 ・String型 ・参照型 ・定数 ・型変換(キャスト) 6 変数と定数 ・基本データ型 ・String型 ・参照型 ・定数 ・型変換(キャスト)
8つの基本データ型 (1) 論理 文字 整数 boolean true(真)またはfalse(偽) char \u0000 ~ \uFFFF 説明 表現範囲 boolean 1ビット真偽値 true(真)またはfalse(偽) char 16ビットUnicode文字 \u0000 ~ \uFFFF byte 8ビット符号付き整数 -128 ~ 127 short 16ビット符号付き整数 -32768 ~ 32767 int 32ビット符号付き整数 -2147483648 ~ 2147483647 文字 整数 2004.06.15 ここまで 2004.06.15 ここから
8つの基本データ型 (2) 実数 データ型 説明 表現範囲 long 64ビット符号付き整数 -9223372036854775808 ~ 9223372036854775807 float 32ビット浮動小数点数 単精度の浮動小数点数 double 64ビット浮動小数点数 倍精度の浮動小数点数 実数
変数宣言と初期化 int a; double b,c; int d = 10; int e, f = 20, g; 変数宣言 変数宣言と 初期化を同時に記述 混ざっていても可
データの代入 int dt1 = 100; int dt2, dt3, dt4; dt2 = 200; dt3 = dt2;
C言語はint型を用いて 論理値を表現している boolean型(1) 「真」か「偽」かという論理値の表現 true = 真 false = 偽 C言語はint型を用いて 論理値を表現している
boolean型(2) boolean b; // boolean型の宣言 b = true; // trueを設定 b = false; // falseを設定 if (b == true) // bがtrueなら if (b == false) // bがfalseなら if (b) // (b==true)と同じ if (!b) // (b==false)と同じ b = 0; // Javaではエラー
char型 文字(文字コード)を保持できる変数 Javaの内部の文字コードは"Unicode" (1文字16ビット) char ch1, ch2; ch1 =‘A’; //半角文字を設定 ch2 =‘亜’; //全角文字を設定
整数型 byte bdt; // 8ビット short sdt; //16ビット int idt; //32ビット long ldt; //64ビット bdt = 127; sdt = 32760; idt = 1234567890; ldt = 1234567890123456789L;
浮動小数点型 float fdt; //32ビット 単精度実数 double ddt; //64ビット 倍精度実数 fdt = 123.456F; ddt = 123.456789012345;
String型 (文字列) String型は「基本データ型」ではなく「クラス」 String ss; String gg = "aaaa"; ss = "bbbb"; ss = ss + "cccc" ss = "dddd" + "eeee";
参照型(1) 基本データ型以外のデータとして,クラスと配列がある. クラスと配列を扱う変数の型を参照型という. 参照とは,アドレスあるいはポインタのこと. C言語のように,&や*を用いてポインタを扱うことはしない.
参照型(2) 配列名 a を宣言し, int a[ ]; int型10個分の領域確保 a = new int[10]; a a[0] あるいは int a[ ] = new int[10]; a[9]
参照型(3) String s = "abcde"; s "abcde"
論理定数 bdt = true; // 論理定数 bdt = false; // 論理定数
数値定数(1) idt = 022; // 先頭が"0"だと8進数 idt = 22; // 10進数の22 idt = 0x12AB; // 先頭が"0x"だと16進数
数値定数(2) ldt = 123456789012L; // 末尾がLまたはlだとlong型 fdt = 111.222F; // 末尾がFまたはfだとfloat型 ddt = 123.45678; // 小数点表現の浮動小数点数double型 ddt = 5.67e4; // 指数表現の浮動小数点数double型 5.67×104の意味
文字定数と文字列定数 char ch; ch = 'A'; 文字定数 ch = '亜'; 文字定数 String ss; ss = "abcde"; 文字列定数
主なエスケープ文字 エスケープ文字 意味 \t タブ \\ \自身 \' シングルクォート 「’」 \" ダブルクォート 「"」 \n 改行 シングルクォート 「’」 \" ダブルクォート 「"」 \n 改行 \ooo 3桁の8進数 \uhhhh 4桁の16進数
エスケープ文字の使用例 String”ABC” ABC DEF System.out.println(”String\”ABC\””); と表示される System.out.println(”ABC\nDEF”); ABC DEF と表示される
final で設定した変数(定数)は、以後変更できない 1000が何を意味するのか判りにくい if (dt == 1000) ↓ final int MAX_DATA = 1000; …… if (dt == MAX_DATA) final で設定した変数(定数)は、以後変更できない
型変換(キャスト) int i ; double d; i = 123; d = i; //表現能力の高い方への代入はOK.dは123.0 d = 789.125; i = d; //表現能力の低い方への代入はエラー i = (int) d; //こうして型変換すればOK.iは789
・算術演算子 ・関係演算子 ・論理演算子 ・代入演算子 ・文字列の等価演算と連結演算 7 よく使われる演算子 ・算術演算子 ・関係演算子 ・論理演算子 ・代入演算子 ・文字列の等価演算と連結演算
おもな演算子の種類 演算子名 内 容 算術演算子 +やーなど四則演算を行う 関係演算子 2つの値の大小関係を判断する 論理演算子 内 容 算術演算子 +やーなど四則演算を行う 関係演算子 2つの値の大小関係を判断する 論理演算子 「かつ(AND)」や「または(OR)」などの論理演算を行う 代入演算子 計算結果を変数に代入する
算術演算子 + - * × / ÷ % mod Javaの演算子 数学の演算子 意味 使用例 結果 加算 12+4 16 減算 12-4 8 乗算 12*4 48 / ÷ 除算 12/4 3 % mod 余り 12%4
整数と浮動小数点数の混合計算 double ddt; ddt = 10 / 4; ddt = 10.0 / 4.0;
演算の優先順位 a = 10 + 20 * 30; 答えは? 610 * / % が + - より先に処理される ( ) が最優先
演算子には優先順位がある a = (10 + 20) * 30; a = 100 / 20 / 5; a = 100 / (20 / 5);
関係演算子と等価演算子 2つの値の大小関係を, true(真) false(偽) で表す。 例えば 1 < 3 → true 2つの値の大小関係を, true(真) false(偽) で表す。 例えば 1 < 3 → true 1 >=3 → false
関係演算子と等価演算子一覧 < <= ≦ > >= ≧ == = != ≠ 関係演算子 数学の演算子 意味 使用例 結果 < ~より小さい 1 < 2 true <= ≦ ~以下 1 <= 2 > ~より大きい 1 > 2 false >= ≧ ~以上 1 >= 2 == = 等しい 1 == 2 != ≠ 等しくない 1 != 2
論理演算子 (A && B;AかつB) A && B A false true B
論理演算子 (A || B;AまたはB) A || B A false true B
論理演算子 (!A;Aではない) !A A false true
代入演算子 a = 1234; a = a + 10; a = b = c = 10; ー a は 1234 ー a は 1244
複合代入 a += 10; a -= 10; += -= *= /= %= ー a = a + 10 と同じ += -= *= /= %= a += 10; a -= 10; ー a = a + 10 と同じ aに10を 足し込む ー a = a - 10 と同じ
++ -- インクリメント/デクリメント演算子(1) ++a; または a++; --a; または a--; 意味 使用例 ++ 1加算 ++a; または a++; -- 1減算 --a; または a--; ++a; または a++; は a = a + 1; と同じ. 2004.06.22 ここまで --a; または a--; は a = a - 1; と同じ.
先加算: a = ++b; b = b + 1; a = b; と同じ 後加算: a = b++; a = b; b = b + 1; インクリメント/デクリメント演算子(2) 先加算: a = ++b; b = b + 1; a = b; と同じ 後加算: a = b++; a = b; b = b + 1; と同じ 2004.06.22 ここまで
文字列の等価演算 s1 "abcde" s2 "abcde" String s1 = “abcde”, s2 = “abcde”; この2つの文字列の内容が同じかどうか調べたい. If( s1 == s2) とするのは危険である. アドレスの比較 値(内容)の比較 s1 "abcde" If( s1.equals(s2) ) とするのが良い. s2 "abcde"
文字列連結演算子(1) String ss; ss = "aa" + "bb"; ー ssは"aabb" 文字列は +演算子で連結することができる. String ss; ss = "aa" + "bb"; ー ssは"aabb" ss = "aa" + 10; ー ssは"aa10" ss = 20 + "bb"; ー ssは"20bb" ss = 20 + 10; ー エラー
文字列結合演算子(2) String ss; ss = "" + 10; ー ssは"10" ss = "cc" + 10 + 20; ー ssは"cc1020" ss = "cc" + (10 + 20); ー ssは"cc30"
文字列結合演算子(3) int a = 100; b = 200; System.out.println("a=" + a); --出力は a=100 System.out.println("a+b=" + (a+b)); --出力は a+b=300 System.out.println("a+b=" + a + b); --出力は a+b=100200
・分岐(if,switch) ・反復(for,while,do-while) ・脱出・継続(break,continue) 8 制御文を使う ・分岐(if,switch) ・反復(for,while,do-while) ・脱出・継続(break,continue)
分岐(if)の例(イメージ) 条件(お金は十分か?) YES 真 NO 偽 購入手続き 門前払い 分岐した後, 合流する
if文の書式 if (条件) { 文1 } else { 文2
単文の例 if (b > 10) - bが10より大なら b = 20; - これを実行 else - さもなければ
複文の例 if (a == 2){ - aが2なら x = 1; y = 2; } else { - さもなければ x = 3;
elseの省略 if (b > 10) b = 20; Elseは 無くても良い (何もしない)
else ifによる多方向分岐 if (条件1) { 文1 } else if (条件2) { 文2 : else if (条件n) { 文n else { 文 条件によって たくさん分岐させるときに用いる
else ifによる多方向分岐例 if (a > 1000) dt = 4; else if (a > 500) dt = 3; { } 中括弧は 無くても良い (文が1つの場合)
else ifによる多方向分岐例 (さらにコンパクトな書き方) if (a > 1000) dt = 4; else if (a > 500) dt = 3; else if (a > 100) dt = 2; else dt = 1;
switch文の一般形式(1) switch(式) { case 定数式1: 文1 break; case 定数式2: 文2 …… default: 文 } 式 case 定数式1 case 定数式2 default 文1 文2 文
どれにもあてはまらなかった場合に実行される switch文の一般形式(2) 整数でなくてはいけない! switch(式) { case 定数式1: 文1 break; case 定数式2: 文2 …… default: 文 } セミコロンではないので要注意 ここでswitch文から抜け出る これがないと次の文まで実行されてしまう どれにもあてはまらなかった場合に実行される
いくつ文を並べてもよい case 3: a = 100; sum = sum + b; myfunc(); break; 複数の文だからといって { } を用いる必要はない case 3: a = 100; sum = sum + b; myfunc(); break;
switch(式)の式には 整数か文字を結果とする式を書く int a; double f; char c = 'Y'; switch ( a+10 ) switch ( f ) switch ( c ) OK エラー OK
繰り返し処理のイメージ 条件を満たしているか? 仕事 NO YES 仕事 条件を満たしているか? YES NO
for文の書式 for (初期化; 継続条件; 再設定) { 文 } 用例 for (i=1; i<=10; i++) { セミコロン ; が無いことに注意
for文の決まり文句 for (i= 1 ; i <= 10; i++) から まで
for (初期化; 継続条件; 再設定) { 文 } 初期化 偽 継続条件 真 文 再設定
for文の中で宣言した変数は、for文の中だけでしか使えない for (int i=1; i<=10; i++) { 文 } System.out.printn(i); for文の中で宣言した変数は、for文の中だけでしか使えない エラーが出る
for文内での変数宣言(2) for (int i=1,a=2; i<=10; i++, a--){ 文 } 複数の変数を宣言できる 複数の文を書くこともできる
for文による無限ループ for (;;) { 文…… } ※特殊な用法 - ループが無限に繰り返される
while文の書式 while (継続条件) { 文 } 用例 while (i<=10) { forよりずっと単純 終了条件ではないことに注意
while (継続条件) { 文 } 偽 継続条件 真 文
最初に一度は必ず文が実行される点が異なる do-while文の書式 do { 文 } while (継続条件); 用例 } while (i<=10); 最初に一度は必ず文が実行される点が異なる 2004.07.06 ここまで
do { 文 } while (継続条件); 文 真 継続条件 偽
break文で脱出する ラベルなしbreak文はswitch文またはfor,while,doなどのループから脱出するために用いる swtich文以外で用いるbreak文は,if文と併用する
break文のイメージ 繰り返し文(forなど){ 命令; break; } ・・・ この2つの命令は飛ばして 繰り返しを止める
ネスト構造=入れ子構造 for (…){ …… if(…) { for (…) { break; }
continue文で継続する continueはfor, while, do-whileの中だけで使用できる
continueのイメージ 繰り返し文(forなど){ 命令; continue; } この2つの命令は飛ばして 次の処理に移る
Java入門クリアまでのみちすじ(1) 9 配列を用いる 10 コンソール入出力 11 メソッドの作りかた 12 クラスの基本 9 配列を用いる 10 コンソール入出力 11 メソッドの作りかた 12 クラスの基本 13 クラスの継承 14 インタフェースを実装する 15 パッケージにまとめる 情報工学実験Ⅰ オブジェクト指向プログラミング(1)
Javaクリアまでのみちすじ(2) 16 スレッドを使う 17 例外処理をする 18 ファイル入出力 19 標準のメソッドを使う 16 スレッドを使う 17 例外処理をする 18 ファイル入出力 19 標準のメソッドを使う 20 アプレットの作成 21 ウィンドウ部品を用いる 22 ウィンドウ型アプリケーションの作成 情報工学実験Ⅰ オブジェクト指向プログラミング(2)