Java
の勉強
和田@応用数学
@2017 Masami WADA ver.3.2 (2018.9.18作成) (ver.3.2.2) 10月中の授業で見つけたミスの修正をしました (ver.3.2.1) 9月中の授業で見つけたミスの修正をしました (ver.3.2) 再履クラスで使いながら加筆・修正していきます。完成することは無いですね(^_^;)目次
第
I
部
–
プログラミング言語
Java
基礎
1 –
1
第1章 Java言語を学ぶ前に 2 1.1 Java言語とは . . . 2 1.2 他のプログラミング言語との違い . . . 3 1.3 利用するソフトウェア . . . 3 1.3.1 EclipseとPleiades . . . 3 1.3.2 JDKとJRE. . . 4 第2章 Java言語の基本的な文法 I 5 2.1 プログラムの作り方と動かし方 . . . 5 2.1.1 プロジェクトを作る . . . 5 2.1.2 パッケージを作る . . . 6 2.1.3 ソースプログラムを作る . . . 7 2.1.4 プログラム名を間違ってしまったとき. . . 9 2.1.5 エディタとパッケージ・エクスプローラー . . . 10 2.1.6 プログラムを実行する . . . 10 2.2 プログラムの構造と決まりごと . . . 10 2.2.1 プログラム . . . 10 2.2.2 パッケージ . . . 11 2.2.3 プロジェクト . . . 12 2.2.4 でも、個人的に使うとき... . . . 12 2.2.5 ファイルの在りかを把握する . . . 13 2.3 コンソールへの出力I . . . 13 2.3.1 System.out.print . . . 13 2.3.2 System.out.println . . . 14 2.4 文字コード . . . 15 2.4.1 Unicodeとは . . . 16 2.5 コメント . . . 16 2.5.1 単一行コメント . . . 18 2.5.2 ブロックコメント . . . 19 2.5.3 Javadoc用コメント . . . 19 2.6 基本型 . . . 192.6.1 整数型 (integer type): byte, short, int, long. . . 20
2.6.2 実数型 (real number type): float, double . . . 21
2.6.3 論理値型: boolean . . . 22 2.6.4 文字型: char . . . 22 2.6.5 もっと大きな値はどうする? . . . 23 2.7 変数. . . 23 2.7.1 変数とリテラル . . . 23 2.7.2 変数の宣言と値の代入 . . . 24 2.8 五則演算 . . . 26 2.8.1 小かっこで計算順序の制御を . . . 27 2.9 文字列の連結演算 . . . 28 2.10 1を加えるという操作 . . . 29 2.10.1 複合代入演算子 . . . 29 2.10.2 インクリメント・デクリメント演算子. . . 31 2.10.3 多重代入文 . . . 32 2.11 キャスト . . . 33 2.12 条件分岐 . . . 36 2.12.1 比較演算子 . . . 36 2.12.2 論理演算子 . . . 37 2.12.3 if文 . . . 39 2.12.4 複数の分岐条件 . . . 40 2.12.5 処理が 1つの場合の中かっこの省略 . . . 44 2.12.6 switch文. . . 45 2.12.7 条件演算子 . . . 47 2.12.8 boolean型変数の真偽判定 . . . 47 2.13 繰り返し . . . 48 2.13.1 for文. . . 48 2.13.2 while文 . . . 51 2.13.3 do while文 . . . 52 2.13.4 変数のスコープ . . . 53 2.13.5 無限ループ . . . 55 2.13.6 繰り返しの入れ子 . . . 57 2.13.7 breakとcontinue . . . 59 2.14 配列. . . 61 2.14.1 配列の宣言 . . . 61 2.14.2 配列の初期値 . . . 62 2.14.3 配列と繰り返し . . . 64 2.14.4 多次元配列 . . . 70 2.14.5 凸凹配列 . . . 72 2.14.6 長さ0の配列や null. . . 75 2.14.7 配列のコピー . . . 75 2.14.8 拡張for文 . . . 77
2.14.9 行列とベクトルの計算 . . . 78 2.15 Mathクラス . . . 80 2.15.1 Mathクラスのクラスメソッド . . . 80 2.16 キーボードからのデータ入力 . . . 83 2.16.1 System.inとSystem.out . . . 83 2.16.2 Scanner(System.in) . . . 83 2.17 コンソールへの出力II . . . 85 2.17.1 System.out.printf() . . . 85 2.18 メソッドI . . . 88
2.18.1 API (Application Programming Interface) . . . 88
2.18.2 クラスメソッド . . . 88 2.18.3 実引数と仮引数 . . . 91 2.18.4 行列とベクトルの計算 (続) . . . 93 2.18.5 再帰プログラム . . . 95 2.18.6 mainメソッドの引数 . . . 98 2.18.7 System.arraycopy . . . 99 2.19 文字列型 . . . 102 2.19.1 文字型と文字列型 . . . 102 2.19.2 文字列のメソッド . . . 103 2.19.3 エスケープシーケンス . . . 104 2.20 応用プログラム(配列の要素のソーティング) . . . 105 2.20.1 選択法 (Selection sort) . . . 106 2.20.2 挿入法 (Insertion sort) . . . 107 2.20.3 泡立ち法 (Bubble sort) . . . 108 2.20.4 クィックソート(Quicksort). . . 110 2.20.5 ヒープソート(Heap sort) . . . 111 2.20.6 マージソート(Merge sort) . . . 113 2.20.7 シェルソート(Shell’s sort) . . . 115 2.20.8 Javaにおける時間測定について. . . 116 2.21 第2章のまとめ . . . 119
第
II
部
–
プログラミング言語
Java
基礎
2 –
128
第3章 Java言語の基本的な文法 II 129 3.1 オブジェクト指向とは . . . 129 3.2 オブジェクトとインスタンス . . . 130 3.2.1 クラス . . . 131 3.2.2 ファイルとクラスの関係 . . . 133 3.2.3 コンストラクタ . . . 134 3.2.4 フィールド . . . 141 3.2.5 メソッド . . . 1453.2.6 参照型配列 . . . 151 3.2.7 オーバーロード . . . 153 3.3 カプセル化 . . . 153 3.3.1 アクセス制御 . . . 153 3.3.2 private . . . 154 3.3.3 package-private . . . 156 3.3.4 protected . . . 156 3.3.5 public . . . 156 3.4 インヘリタンス(継承) . . . 157 3.4.1 単一継承 . . . 161 3.4.2 Object クラス . . . 164 3.4.3 オーバーライド . . . 166 3.4.4 super いろいろ. . . 169 3.4.5 final 修飾子 . . . 170 3.4.6 キャスト . . . 172 3.5 ポリモルフィズム(多態性)と動的束縛 . . . 175 3.6 例外処理 . . . 177 3.6.1 例外(Exception) . . . 177 3.6.2 Exception クラス . . . 179
3.6.3 try∼catch∼finally. . . 180
3.6.4 自作の例外 . . . 185 3.7 Scannerを使ったテキストデータの入力 . . . 186 3.7.1 nextとnextLine . . . 186 3.7.2 デリミターの設定 . . . 189 3.7.3 File. . . 190 3.7.4 ファイルからのテキスト入力:Scanner(File). . . 192 3.8 ファイルへの入出力 . . . 193 3.8.1 ストリームとファイル . . . 193 3.8.2 FileInputStream / FileOutputStream . . . 194 3.8.3 FileReader / FileWriter . . . 196 3.8.4 BufferedReader / BufferedWriter . . . 197 3.8.5 InputStreamReader / OutputStreamWriter . . . 198
3.8.6 Java のデータをExcelやMathematicaに読ませる. . . 199
3.9 import文 . . . 200 3.9.1 import 文の書き方. . . 201 3.9.2 java.langパッケージ . . . 202 3.9.3 静的インポート . . . 202 3.10 抽象クラスとインタフェース . . . 203 3.10.1 抽象クラス . . . 203 3.10.2 インタフェース . . . 205 3.10.3 デフォルトメソッド . . . 209 3.11 ジェネリックス. . . 210
3.11.1 パラメータ化された型 . . . 211 3.11.2 型パラメータ付きインスタンス・配列の生成不可. . . 214 3.11.3 ワイルドカード型 . . . 215 3.11.4 Genericなメソッド . . . 217 3.11.5 ラッパークラス . . . 218 3.11.6 オートボクシング . . . 219 3.12 Java API . . . 219 3.12.1 Collection系データ構造. . . 220 3.12.2 ArrayList . . . 221 3.12.3 LinkedList . . . 228 3.12.4 StackとQueue . . . 229 3.12.5 リスト構造を自作してみる. . . 231 3.12.6 木構造を自作してみる . . . 237 3.13 ネストしたクラスやインタフェース . . . 241 3.13.1 静的なメンバークラス . . . 242 3.13.2 非staticなメンバークラス(内部クラス) . . . 244 3.13.3 無名クラス . . . 245 3.13.4 ローカルクラス . . . 245 3.14 スレッド・並列処理 . . . 245 3.14.1 Threadクラスの継承 . . . 246 3.14.2 スレッドの制御 . . . 247 3.14.3 Runnableの実装 . . . 249 3.14.4 スレッドの排他制御 . . . 250 3.15 JavaFXとマルチメディア(執筆中) . . . 253 3.15.1 e(fx)clipseのインストール . . . 253 3.15.2 Scene Builderのインストール . . . 254 3.15.3 初めての JavaFX . . . 255 3.15.4 スレッドの様子を観察する. . . 258 3.15.5 Stageクラス . . . 259 3.15.6 Sceneクラス . . . 261 3.16 列挙型 . . . 261 3.16.1 タイプセーフな一連の定数. . . 261 3.16.2 enum定数のインポート . . . 264 3.17 アノテーション. . . 265 3.17.1 @Deprecated . . . 265 3.17.2 @Override . . . 266 3.17.3 @SuppressWarnings. . . 266 3.18 可変長パラメータ . . . 266
第
III
部
–
付録
–
Apx.1
付録A コンピュータ内の数の表現 Apx.2 A.1 2・8・16進数 . . . Apx.2 A.2 基数変換 . . . Apx.3 A.2.1 10進数から 2進数 . . . Apx.4 A.2.2 2 進数から10進数 . . . Apx.4 A.2.3 2 進数と8 進数 . . . Apx.5 A.3 実数の基数表示. . . Apx.5 A.3.1 2 進小数と10進小数 . . . Apx.5 A.3.2 2 進小数から8進小数 . . . Apx.6 A.4 2進数の桁数 . . . Apx.7 A.5 コンピュータ内の計算 . . . Apx.8 A.6 コンピュータ内の数 . . . Apx.8 A.7 2の補数表現 . . . Apx.9 A.8 実数の表現方法. . . Apx.10A.9 IEEE 754 . . . Apx.10
A.9.1 IEEE 754 の単精度実数 . . . Apx.10
A.10 表せる実数は一様ではない. . . Apx.12
付録B Eclipseのインストール Apx.13
B.1 インストールの前に . . . Apx.13
B.2 Pleiadesのダウンロード. . . Apx.13
B.3 Java APIドキュメントのダウンロード . . . Apx.14
B.4 Eclipseのインストール . . . Apx.15
B.4.1 既に前のバージョンがある場合 . . . Apx.15
B.4.2 新しくインストールする場合 . . . Apx.15
B.5 Java APIドキュメントのインストール . . . Apx.17
B.6 Eclipseの初めての起動 . . . Apx.17 B.6.1 workspaceの設定 . . . Apx.17 B.6.2 授業用プロジェクトの作成. . . Apx.20 B.6.3 APIドキュメントの関連付け . . . Apx.20 B.6.4 Eclipseを見やすくする . . . Apx.22 B.7 Eclipseを更新したとき . . . Apx.25 付録C javadoc:プログラムのマニュアル作り Apx.27 C.1 Javadocとは. . . Apx.27 C.2 まずはやってみよう . . . Apx.27 C.3 Javadocのタグ . . . Apx.31 付録D debug:プログラムの虫取り Apx.32 D.1 デバッギング . . . Apx.32 D.2 ビューいろいろ. . . Apx.32
D.2.1 「デバッグ」ビュー . . . Apx.32 D.2.2 「変数」ビュー . . . Apx.33 D.2.3 「ブレークポイント」ビュー . . . Apx.33 D.2.4 「式」ビュー . . . Apx.33 D.2.5 「表示」ビュー . . . Apx.33 D.3 デバッグの仕方. . . Apx.34 索引 Ind.1
ソースコード目次
2.1 HelloJava.java (はじめましてDuke) . . . 5 2.2 HelloJava2.java (はじめましてDuke改行版) . . . 14 2.3 UnicodeCheck.java (UNICODEの値) . . . 16 2.4 Comments.java (コメント文いろいろ) . . . 17 2.5 IntegerMaxAndMin.java (整数型の最大・最小値) . . . 20 2.6 RealNumberMaxAndMin.java (実数型の最大・最小値) . . . 21 2.7 CharIsInteger.java (文字は整数だった) . . . 22 2.8 Substitution.java (リテラルの代入) . . . 25 2.9 Arithmetics.java (五則計算). . . 26 2.10 PAdditionValues.java (2つの変数の和) . . . 27 2.11 SwapValues.java (2つの数の交換) . . . 27 2.12 AdditionValues2.java (2つの変数の和2) . . . 28 2.13 CompoundAssignment.java (複合代入演算) . . . 29 2.14 ErrorSubst.java (複合代入でのエラー) . . . 30 2.15 SubstInEquation.java (代入文は値を持つ) . . . 31 2.16 SubstInEquation2.java (式中のインクリメントは混乱原因) . . . 32 2.17 MultipleSubst.java (多重代入文) . . . 32 2.18 MultipleSubst2.java (多重代入文は使わなくても) . . . 33 2.19 MultipleSubst3.java (複雑な多重代入文) . . . 33 2.20 Casting1.java (ムリやりキャスト) . . . 34 2.21 Casting2.java (丸め誤差とキャスト) . . . 35 2.22 CompoundAssign.java (複合代入文での隠れキャスト). . . 352.23 IfElse.java (if else文) . . . 39
2.24 OddOrEven.java (偶数か奇数かで場合分け) . . . 40 2.25 Vote.java (投票プログラム) . . . 41 2.26 RankEvaluation.java (条件分岐で成績評価) . . . 43 2.27 IsVariable.java (boolean型変数の真偽判定) . . . 48 2.28 DoubleCounter.java (実数型の繰り返しカウンタ) . . . 49 2.29 FibonacciNumbers.java (フィボナッチ数列) . . . 50 2.30 NoMultiple.java (3の倍数以外を出力) . . . 51 2.31 CollatzSequence.java (コラッツ予想). . . 52
2.32 WhileVSDoWhile.java (while文とdo while文) . . . 53
2.35 GuessingGame.java (数当てゲーム) . . . 56 2.36 MultiplicationTable.java (九九の表) . . . 57 2.37 DoubleLoop.java (繰り返しの入れ子). . . 59 2.38 DoubleLoop2.java (ラベル付きbreak文) . . . 59 2.39 DoubleLoop3.java (ラベル付きcontinue文) . . . 60 2.40 LoopParameter.java (繰り返し内から値の取り出し) . . . 61 2.41 ArrayInitialization.java (配列の初期値指定) . . . 63 2.42 PrintArray.java (配列と繰り返し). . . 64 2.43 ArrayInitialization2.java (繰り返しによる配列の初期化) . . . 65 2.44 SumOfArray.java (配列の要素の合計) . . . 65 2.45 MaxOfArray.java (配列の要素の最大値) . . . 66 2.46 AverageOfPositive.java (配列内の正数の平均値). . . 67 2.47 OlympicGame.java (オリンピック採点方式) . . . 67 2.48 DifferenceTwoArray.java (ベクトルの差). . . 68 2.49 SwapArray.java (2つのベクトルの交換) . . . 68 2.50 ToReverseOrder.java (配列の要素の逆順化) . . . 69 2.51 EvaluateGrade.java (成績評価の集計) . . . 69 2.52 ShiftArray.java (配列の巡回シフト). . . 70 2.53 ArrayInitialization3.java (行列の初期値指定) . . . 71 2.54 StudentDegrees.java (凸凹行列で成績管理) . . . 73 2.55 SetArrays.java (多次元配列の宣言と処理) . . . 74 2.56 ArrayIndexOutOfBounds.java (配列でよく出すエラー) . . . 75 2.57 ArrayCopy.java (配列のコピー). . . 75 2.58 ArrayCopy2.java (配列のコピー失敗版) . . . 76 2.59 ArrayCopy3.java (多次元配列のコピー) . . . 77 2.60 ExtendedForEach.java (拡張for文) . . . 77 2.61 ExtendedForEach2.java (拡張for文2) . . . 78 2.62 ExtendedForEach3.java (拡張for文3) . . . 78 2.63 MatrixVector.java (行列とベクトルの積). . . 78 2.64 MatrixMatrix.java (行列と行列の積) . . . 79 2.65 TrigonometricTable.java (三角関数表) . . . 80 2.66 MathMethods.java (基本関数の例) . . . 80 2.67 TriangulumArea.java (三角形の面積). . . 82 2.68 OddEven.java (整数値のキーボード入力). . . 83 2.69 QuadraticEquation.java (2次多項式の根) . . . 85 2.70 TrigonometricTable2.java (printfで三角関数表). . . 85 2.71 NewtonMethod.java (浮動小数点数表示:Newton 法). . . 86 2.72 CircleArea.java (mainメソッド内で円の面積) . . . 88 2.73 CircleArea2.java (クラスメソッドで円の面積) . . . 88 2.74 CircleArea3 (クラスメソッドでの円の面積2) . . . 89 2.75 SwapValues2.java (クラスメソッドで数の交換できる?). . . 92 2.76 FormalParameter.java (配列をメソッドに渡す) . . . 93
2.77 LinearAlgebra.java (行列・ベクトルの積) . . . 94 2.78 FibonacciRecursive.java (再帰プログラムによるフィボナッチ数) . . . 95 2.79 FactorialRecursive.java (再帰プログラムによる階乗) . . . 96 2.80 HanoiTower.java (ハノイの塔) . . . 96 2.81 MainParameters.java (メインの引数を使う) . . . 98 2.83 ArrayCopyExample1.java (1次元配列のコピー) . . . 100 2.85 ArrayCopyExample2.java (多次元配列のコピー:失敗作) . . . 100 2.86 ArrayCopyExample3.java (多次元配列のコピー) . . . 101 2.87 ArrayCloneExample.java (配列のクローン) . . . 101 2.88 StringvsChar.java (文字列と文字) . . . 102 2.89 StringMethods.java (文字列のメソッドいろいろ) . . . 103 2.90 MyTools.java (乱数作成などのツール集) . . . 105 2.91 SortingExample.java (選択法によるソート) . . . 106 2.92 ArraySorting.java#selectionSort (選択法) . . . 107 2.93 SortingExample.java#main (追加:挿入法によるソート) . . . 108 2.94 ArraySorting.java#selectionSort (挿入法) . . . 108 2.95 SortingExample.java#main (追加:泡立ち法によるソート). . . 109 2.96 ArraySorting.java#bubbleSort (泡立ち法). . . 109 2.97 SortingExample.java#main (追加:クィックソートによるソート) . . . 110 2.98 ArraySorting.java#quickSort (クィックソート) . . . 111 2.99 SortingExample.java#main (追加:ヒープソートによるソート) . . . 113 2.100 ArraySorting.java#heapSort (ヒープソート) . . . 113 2.101 SortingExample.java#main (追加:マージソートによるソート) . . . 114 2.102 ArraySorting.java#mergeSort (マージソート). . . 114 2.103 SortingExample.java#main (追加:シェルソートによるソート) . . . 115 2.104 ArraySorting.java#shellSort (シェルソート) . . . 116 2.105 TimePrecisionExample.java (時間測定) . . . 116 2.106 WrongAverage.java (間違いだらけの平均値) . . . 119 2.107 SwapRowOfMatrix.java (行列の行の交換) . . . 119 2.108 VectorNormalize.java (ベクトルの正規化) . . . 121 2.109 Combination.java (組み合わせ数). . . 121 2.110 Maclaurin.java (マクローリン展開によるネイピア数eの計算) . . . 122 2.111 MonteCarlo.java (モンテカルロ法によるπの計算). . . 124 2.112 MargeArrays.java (2つの数ベクトルのマージ) . . . 124 2.113 ArrayTransform.java (配列の変形) . . . 125 2.114 InverseMatrix.java (逆行列を求める) . . . 127 3.1 Student.java (学生の成績情報) . . . 131 3.2 StudentExample.java (学生の成績処理) . . . 132 3.3 Course.java (履修科目と成績のクラス) . . . 133 3.6 (改) StudentExample.java (複数のコンストラクタが必要). . . 136 3.7 (改) Student.java (コンストラクタのオーバーロード) . . . 137 3.8 Point.java (平面上の点クラス) . . . 140
3.9 PointExample.java (コンストラクタ無しクラス) . . . 140 3.10 (改) Student.java (クラスフィールドの追加) . . . 142 3.11 MembershipExample.java (会員登録) . . . 142 3.12 Entry.java (会員情報の配列への登録) . . . 143 3.13 Member.java (会員情報). . . 143 3.16 TaroExample.java (クラスを作ってみる). . . 146 3.19 ComplexNumberExample.java (複素数計算). . . 148 3.20 ComplexNumber.java (複素数のクラス) . . . 148 3.21 MyMathExample.java (自作Mathクラス) . . . 150 3.22 CentroidExample.java (参照型配列Point[]) . . . 151
3.24 PrivateFieldExample.java (private fieldへ直接アクセス). . . 154
3.25 (改)PrivateFieldExample.java (private fieldへ直接アクセス) . . . 154
3.26 InheritanceExample.java (継承関係) . . . 158 3.27 Human.java (人クラス) . . . 158 3.28 Professor.java (教授クラス) . . . 159 3.29 Lecture.java (講義クラス) . . . 159 3.30 Student.java (学生クラス). . . 159 3.31 PointExample3.java (点集合の重心点を求める) . . . 161 3.32 WeightedPoint.java (重み付きの点クラス) . . . 161 3.34 ObjectExample.tex (Objectクラスのメソッド) . . . 164 3.35 ArrayIsObject.java (配列のObjectメソッド) . . . 165 3.36 StringIsObject.java ( ==とequals()の違い) . . . 166 3.37 PointExample4.tex (メソッドをオーバーライド). . . 166 3.38 ColoredWeightedPoint.java (色付き重み付き点クラス) . . . 167 3.39 OverrideExample2.java (オーバーライドにおけるアクセス権) . . . 168 3.40 SuperExample.java (supar.メソッドの例) . . . 169 3.41 FinalParameter.java (メソッドの仮引数にfinal). . . 171 3.42 FinalExample.java (finalな参照変数) . . . 171 3.43 OverrideExample3.java (クラスのキャスト) . . . 172 3.44 InstanceOfExample.java (インスタンスの型チェック). . . 175 3.45 PolymorphismExample.java (ポリモルフィズムで図形処理(?)). . . 176 3.46 DivideZeroExample.java (ゼロ割りの例外) . . . 178 3.47 OutOfBoundExample.java (配列の添字オーバーの例外) . . . 178 3.48 (改) DivideZeroExample.java (スタックトレース) . . . 180 3.52 TwoCatchExample.java (複数の例外のキャッチ) . . . 182 3.54 RedirectExample.java (出力先をファイルにリダイレクト) . . . 183 3.55 FinallyExample.java (例外処理のfinallyブロック) . . . 184 3.56 MyExceptionExample.java (自作の例外を作る) . . . 185 3.57 ScannerExample.java (標準入力装置より整数の入力) . . . 186 3.58 ScannerExample2.java (next) . . . 188 3.59 ScannerExample3.java (nextLine) . . . 188 3.60 ScannerExample4.java (Scannerでのデリミター) . . . 188
3.61 DelimiterExample.java (カンマをデリミターに) . . . 189 3.62 ScannerExample5.java (正規表現でパターン読み込み) . . . 190 3.63 HelloJavaFromFile.java (ファイルからDuke) . . . 191 3.66 FileScanner.java (Scannerでファイルから数値データ読み込み) . . . 192 3.67 ScannerReadFile.java (hasNext()を使ったデータファイルの読み込み) . . . 193 3.68 StreamExample01.java (FileOutputStreamを使って文字列をファイルへ). . . 194 3.69 StreamExample02.java (FileOutputStreamを使って画像ファイルのコピー) . . . 195 3.70 StreamExample03.java (FileWriterを使ってテキストファイルを扱う). . . 196 3.71 StreamExample04.java (BufferedWriterを使ってテキストファイルを扱う) . . . 198 3.72 StreamExample05.java (OutputStreamWriterを使ってテキストファイルを扱う). . . 198 3.73 CSV Example.java (CSV形式ファイルに出力) . . . 200 3.74 ImportExamaple.java (インポート文の例題) . . . 201 3.75 StaticImportExample.java (静的インポート) . . . 202 3.76 AbstractClass.java (抽象クラスで図形処理(?)) . . . 203 3.77 InterfaceExample.java (インタフェースの例題) . . . 205 3.78 InterfaceExample2.java (インタフェースのinstanceof) . . . 208 3.79 InterfaceExample3.java (デフォルトメソッド) . . . 209 3.80 BoxExample1.java (何でも入れられる箱1) . . . 211 3.81 BoxExample2.java (何でも入れられる箱2) . . . 212 3.82 BoxExample3.java (何でも入れられる箱3) . . . 212
3.86 IntegersToObjects.java (Integerの配列はObjectの配列でもある) . . . 215
3.87 IntegersToObjects3.java (境界ワイルドカード型の例) . . . 216
3.88 GenericMethod.java (Generic methodの例) . . . 217
3.89 IntegerExample.java (Integerクラスのインスタンス比較) . . . 219 3.90 ArrayListExample.java (ArrayListクラスの例題). . . 221 3.91 ArrayListExample2.java (整数配列をArrayListに変換) . . . 222 3.92 Point.java (Comparableを実装した平面の点クラス) . . . 223 3.93 ShapesExample.java (図形リストで並び替え) . . . 226 3.94 LinkedListExample.java (LinkedListクラスの例題) . . . 228
3.95 StackQueue.java (StackとQueueの例題). . . 230
3.96 students.txt (学生データファイル):src/section0312に置く . . . 231 3.97 StudentListExample.java (mainメソッド:両方向リストの自作). . . 231 3.98 Student.java (学生クラス). . . 232 3.99 Date.java (誕生日用の年月日クラス) . . . 233 3.100 StudentCell.java (リストのセル) . . . 234 3.101 StudentList.java (両方向リスト) . . . 234 3.102 BinarySearchTreeExample.java . . . 237 3.103 NestedClassExample.java (静的なメンバークラスの例題) . . . 242 3.104 InnerClassExample.java (内部クラスの例) . . . 244 3.105 AnonymouseClassExample.java (無名クラスの例). . . 245 3.106 ThreadExample01.java (Threadの継承によるスレッド処理) . . . 246 3.107 ”ThreadExample02.java (Threadの制御)” . . . 247
3.108 ”ThreadExample04.java (Runnableの実装によるスレッド処理)” . . . 249 3.109 BankBooks.java (お金が消える!) . . . 252 3.110 JavaFXExample01.java (初めての JavaFX) . . . 255 3.111 JavaFXExample02.java (JavaFXでの複数スレッド) . . . 258 3.112 JavaFXExample03.java (窓の大きさを設定) . . . 259 3.113 JavaFXExample04.java (複数の窓を作成) . . . 260 3.114 PlayCardExample01.java (タイプセーフでない列挙) . . . 262 3.115 PlayCardExample02.java (タイプセーフな列挙) . . . 262
3.116 PlayCardExample new.java (enumによる実現). . . 263
3.117 RGBColor.java (列挙型で色) . . . 264 3.118 EnumImportExample.java (列挙型をインポート) . . . 265 3.119 DeprecatedExample.java (アノテーション:非推奨) . . . 265 3.120 VariableArityExample.java (可変長パラメータの例) . . . 267 C.1 Circle.java (円クラス) . . . Apx.27 C.2 Point.java (点クラス) . . . Apx.28 C.3 Circle.java (円クラス) . . . Apx.29 C.4 Point.java (点クラス) . . . Apx.30
第
I
部
第
1
章
Java
言語を学ぶ前に
コンピュータの中で処理されているプログラムは、コンピュータが理解できる言葉 機械語 (machine language)に よって記述されて動いています。従って、コンピュータに新たな仕事をさせたいときは、機械語のプログラムを与えて やれば良いのですが、人の手でそれを直接作るというのは、複雑化したコンピュータ環境において現実的ではありま せん。 そこで、まずは人が理解できる言葉でプログラムを記述し、それをコンパイラ(compiler)というソフトウェアを利 用して機械語にコンパイル(翻訳) (compile) し、それを動かすという方法が現在の一般的な方法です。この「人が理 解できる言葉」がプログラミング言語(programming language)です。Java言語もその1つです。この授業では、プログラミング言語Javaの基礎を習得してもらい、各自のノートパソコンでプログラムを作成・実 行してもらいます。プログラミング言語の習得は、文法を覚えるということに尽きるのでしょうが、外国語を学ぶこと と一緒で「習うより慣れろ」が唯一の方法ではないでしょうか。 私が学生の頃は、まだスマホもPS–4もなかった頃なので、パソコン雑誌に載っているゲームプログラムをちまちま とパソコンに打ち込んで遊ぶ、ということでプログラミング言語を覚えました。そうしたモチベーションがあったので プログラミングが好きにもなったのです。みんなも、いろいろなプログラムを作ってくれれば自然とJavaを習得でき ますので、頑張って下さい。 このテキストは、まず「付録Aコンピュータ内の表現」を読み、次に「付録BEclipseのインストール」に従って ソフトウェアのダウンロードとインストールを行った上で、という前提の元で書いています。従って、突然第1章から 読み始めると難解な部分があるかと思います。
また、各項目は全ての情報を書いていません(このテキストのみでJavaはOK!と思われると困りますよ)。Javaを 習う最初の1年で知っておいたほうが良さそうなことだけを掻い摘んで書いているので、他の教科書で触れているのに 書かれていないことが結構あります。よって、無事単位習得のあかつきには、独学で読めそうなJava の参考書を手に 入れて、抜けているところを埋めていって下さい。
1.1
Java
言語とは
Java言語(以降、単にJavaと呼ぶことにします)は、1990年代初頭、Sun Microsystems社(現在のOracle 社)の 内部プロジェクトとして誕生したプログラミング言語(最初はOakという名前でした)で、すでに広く使われていたC 言語やC++に対抗して作られました。家電製品などに組み込むためにはC言語系のシステムは大きすぎてかつ複雑す ぎたこと、世の中がインターネットの時代に入ってWeb ブラウザの中で動く軽量ソフトが必要だったことなどから、 1996年Javaの最初のバージョンが発表されました。現在、Javaの最新バージョンは2017/9に発表されたver. 9 で す( 2018/2現在)。ちなみに、Javaはコーヒーの名前ですね。開発者たちが通っていたカフェの飲み物に由来してい るとか。
各自のパソコンに現在インストールされているJava のバージョンを知りたい時は、以下のページの説明を読みま しょう。>https://www.java.com/ja/download/help/version manual.xml
Javaの大きな特徴は、この言語が「オブジェクト指向(Object oriented)」のプログラミング言語である、というこ とです。オブジェクト指向とは、プログラミングのパラダイム(paradigm : 理論的枠組み・見方)の一つで、プログラ ムをデータとその振る舞いが結びつけられたオブジェクトの集まりとして構成するという見方です。 この時点では、ちんぷんかんぷん (^^;) このテキストでは、第2章では従来の (オブジェクト指向ではない)プログラミング言語(主に「手続き型プログラ ミング言語」)にも言える基本的な部分を、そして第3 章ではJavaのオブジェクト指向としての側面を学んでいきま す。プログラミング言語の世界は、より良いパラダイムを探して日々変化しています。新しい言語も次々出てきていま すので、Javaを習得後は新しい言語に挑戦してみて下さい。
1.2
他のプログラミング言語との違い
同じオブジェクト指向のプログラミング言語 C++らと Java が大きく異なる点は、Java で作ったプログラムは、 Windows OSやMac OSのようなOS (Operating System)の上で直接動かないということです。(^^;)例えばC++のコンパイラは特定のOSやハードウェアに合わせて最適化されて作られているので、翻訳した結果が直 接コンピュータ上で高速に動きます。しかしOSやハードウェアが変更されると動かなかったり、挙動がおかしくなっ たりします。一方、Java はJVM (Java Virtual Machine:Java 仮想マシン)というソフトウェアによる仮想コン ピュータ環境の中でプログラムを実行させる方法をとりました。それによって Java で書かれたプログラムは、JVM が用意された環境ならOSやハードウェアに依存せずにどこでも動くのです。
Javaのスローガン:「Write Once, Run Anywhere.」
Windows OSやMac OSやlinux (リナックス)、携帯電話やスマホなど、それぞれのOSに対応したJVMが用意 されています(みんなのスマホにも入っているんですよ)。それにより、みんなが作ったプログラムがパソコン上と同様 にスマホ上でも動くようになります(そう簡単ではないですけどね)。 また、Javaは後述する「型」の制約が厳しいのでプログラムの曖昧性が少なく(その分、柔軟性に乏しいかな?)、 また後述する「ガーベージ・コレクション」を自動で行うのでメモリーについての問題が起き難いなど、最初に習得す るプログラミング言語に適していると言われています(C系言語ではメモリー管理をプログラマがプログラム中に明 に書かねばならないので、高度なことができる一方、学習のハードルが少々高い)。> 最初にC++か?Javaか? はい ろいろ意見が分かれるところです。 ところで、2018年度の新入生が学ぶプログラミング言語が、「Python」に決まりました(橋口先生の趣味!?)。人工知 能などで有名になっている新しい言語です(といっても、生まれた年はJavaと同じ年です)が、YoutubeやInstagram などお馴染みの Web アプリも Pythonで作られています。Google が主に開発に使っている言語3つ「Java、C++、 Python」にも選ばれています。システム系ならJava、学術分野ならPythonなんて声もあります。
ちなみに、PythonはJavaより簡単!と言われていますので、Javaの後でPythonを学ぶのは楽勝かもしれません。
1.3
利用するソフトウェア
1.3.1
Eclipse
と
Pleiades
この授業では、 IDE (Integrated Development Environment:統合開発環境) というアプリケーションのひとつ Eclipse (エクリプス)を使用し、その中でプログラムを作成しながらJavaを学んでいきます。統合開発環境とは、従
来ならばテキストエディタ・コンパイラ・デバッガなど複数のアプリケーションを取っ替え引っ替えして行っていたプ ログラムの作成と実行をひとつの対話型操作環境で行えるようにしたものを言います。Javaに対応した統合開発環境 には、Eclipseの他にもNetBeansやIntelliJ IDEAなどがあります。
Eclipse はIBM社によって開発されたオープンソースなアプリケーションで、Java 以外にも様々な言語によるア プリケーション開発に対応しています。plugin (プラグイン:部品)を追加することで、C++、PHP、Perl、C♯、D、 TeX、Python、Ruby、JavaScript、AspectJ、Mathematica、SQL、UMLなどにも対応できます。Eclipseは2018/2 現在、ver.4.7コードネーム(Oxygen) を最新版としています。ちなみに、最近のコードネームは元素の名前に因んで 付けられています(Oxygenは酸素だね)。
Pleiades (プレイアデス)は英語仕様のEclipseを日本語仕様に変えるプラグインの名前で、ダウンロードサイトで は、Eclipseを含めたPleiadesの「All in one」ダウンロードを行うことができます(必要とされるものを一度に全て ダウンロードできる)。ちなみに pleiadesは、日本人が大好きな「すばる昴 」散開星団プレイアデスから名付けられていま す。以下では、PleiadesとEclipseを区別せずにEclipseと書きます。
1.3.2
JDK
と
JRE
Java を用いてプログラムを作ったり、作ったプログラムを実行させるには、必ずしもEclipse を必要としません。 (図 1.1 参照)Java プログラムの実行に必要な JVM の構築やコンパイルコマンドなどを実行するためには JRE
(Java Runtime Environment:Java実行環境)が必要です。JREさえあれば、Javaプログラムを「実行」することが できます。さらにJavaプログラムを「作成」するには、JDK (Java Development Kit:Java開発キット)をインス トールすることが最もコンパクトです。JDKはOracle 社のフリーソフトウェアとして各OSに対応したバイナリ形 式で配布しており、JDKのインストールでJREも自動的にインストールされます。ただし、JDKはプログラムを作 るための特別なエディタは含んでいないのと、コマンドプロンプトでコマンドを入力するなどの多少のマニアックさ? が必要です。一方、Eclipseをインストールすると、JDK・JREも同時にインストールされるので、Eclipseをモノに したあかつきにはJDKの使い方も学んで下さい。
OS: Operating System JVM : Java Virtual Machine
JDK Eclipse
JRE
第
2
章
Java
言語の基本的な文法
I
2.1
プログラムの作り方と動かし方
まずは以下のJavaプログラムHalloJava.javaを例にして簡単にEclipseでのJavaプログラムの作り方・動かし方 を説明します。これが、Java言語で書かれたプログラムです。日本語が一部にあるとはいえ、中学校レベルの英単語 の意味不明の羅列「これを1年間学ぶのかぁ。退屈しそうだぁ...」ですかね?(^_^)
頑張ってください!
ソースコード2.1 HelloJava.java (はじめましてDuke)
package section0201;
public class HelloJava {
public static void main( String[] args ) { System.out.print( "はじめまして。" ); System.out.print( "Duke と言います。" ); }
}
図2.1 Dukeって何者?(DukeはJavaのマスコットキャラクタです)
2.1.1
プロジェクトを作る
まず最初に、Java プロジェクト という入れ物(フォルダ)を作ります。プロジェクトとは、事業計画とか研究課題 などを意味する言葉ですが、これはEclipseで定義されている言葉です(Javaの言葉ではありません)。 この授業では、「プログラミング基礎 1・2 及び演習」という科目の単位を取るという大きな事業計画?がありますか ら、これを我々のプロジェクト「プログラミングの授業」と名付けることにしましょう。プロジェクト名は、日本語で も、英語でも中国語でも構いません。好きな名前を付けられますが、みんなが同じだと説明しやすいので、「プログラ ミングの授業」で統一しましょう。Eclipseのメニューで「ファイル(F)> 新規 (N)>Java プロジェクト」と順に選択し、表示された窓「新規Java プロジェクト」の「プロジェクト名(P)」の欄に「プログラミングの授業」と入力し、「完了 (F)」ボタンをクリックし て下さい。(図2.2参照) 図2.2 プロジェクトを作る プロジェクトは、プログラムを作る度に作るものではありません。従って、この授業では、これ以外にプロジェクト は作りません。授業とは別にプロジェクトを作成し、例えば「自習」とでも名前を付ければ、授業のプログラムと無関 係にその中に自習プログラムを作ることもできます。
2.1.2
パッケージを作る
次に、出来上がったプロジェクトの中にパッケージを作ります。パッケージとは、関連するプログラムの集合を入れ る入れ物(フォルダ)で、今度はJavaの言葉です。 まず、パッケージ・エクスプローラーで、「プログラミングの授業」プロジェクトの左にある > のマークをクリック します。すると、中に入っている「src」フォルダのアイコンが表示されます。Java のプロジェクトの中には幾つかの フォルダが入っていて、パッケージ・エクスプローラーは、そのうちのsrcのみを表示するようになっています。この src フォルダがプログラムを入れる入れ物となります。(図2.3参照) 図2.3 パッケージを作る(1) そこで、表示されたsrc のアイコンを右クリックし、出てきた縦長のメニューの上の方「新規(W)> パッケージ」 を選択して下さい。(図2.4参照) このテキストのプログラムは、章・節ごとに同じパッケージ内に入れることにしたいので、 section**** という名 前のパッケージに入れることにします。****の部分には章番号と節番号をそれぞれ 0付きの2 桁で入れていきます。図2.4 パッケージを作る(2) 従って、2.1節にあるプログラムHelloJavaはsection0201パッケージに入れることにします。そこで、表示された窓 「新規 Javaパッケージ」の「名前(M)」の欄にsection0201と入力し、「完了(F)」ボタンをクリックして下さい。こ れでパッケージsection0201がプロジェクト「プログラミングの授業」のsrc パッケージ・フォルダ中に出来上がりま した。(図2.5参照) 図2.5 パッケージを作る(3) パッケージは関連するプログラムの集合を入れる入れ物ですから、授業のテーマ (章や節) が変わるたびに異なる パッケージを作って、その中にプログラムを作っていくことになります。
2.1.3
ソースプログラムを作る
次は、いよいよプログラムファイルを作成します。 人間が読める状態のプログラムのことをソースコード(source code) とか、ソースプログラムと言います 。逆に、コンピュータが実行できる状態のプログラムをバイナリーコード (binary code)と言います。一般にコンピュータはソー スコードを直接実行できません(これは正確にはウソです)(^^;)。
package section0201;
public class HelloJava {
public static void main( String[] args ) { System.out.print( "はじめまして。" ); System.out.print( "Duke と言います。" ); }
}
このプログラムの名前は、ソースコード2行目でpublic classの次に書かれているHelloJavaです。Javaのソー スプログラムのファイル名は、プログラムの名前(正確にはクラスの名前)に拡張子java を付けます。つまり、この ソースプログラムのファイル名はHelloJava.javaとなります。HelloJavaと拡張子javaの間にはドット「.」が入りま すので、忘れずに。(コンピュータの世界では、ピリオッドとは言わずドットというのが慣例です)
「パッケージ・エクスプローラ」のパッケージ「section0201」のアイコン上で右クリックし、「新規(W)> クラス」 と選択して下さい。表示された窓「新規Java クラス」 の「名前(M)」の欄にプログラム名の HelloJavaを入力して 下さい。(図2.6参照)拡張子.java は必要ありません。「どのメソッド・スタブを作成しますか?」という項目の1つ 目の選択肢「public static void main(String[] args) (V)」のチェックを入れて下さい。そして、「完了(F)」ボタンを クリックしましょう。 図2.6 ソースプログラムを作る(1) Eclipseがプログラムの外枠部分を事前に作ってくれています。(図2.7参照) • このテキストでは空行を極力省いています。ただし、空行はプログラム中に自由に入れられるので、見やすさを 考えて自由に挿入して下さい。コンパイル時には空行は無視されるので、実行に影響は与えません。 • // TODOで始まるコメント行が挿入されていますが、これは我々素人にはしばらくは必要のない行なので、1行 まるまる消しましょう。後で、初めから表示されないように設定します。 入力するのは4行目と 5行目だけです。この 2行を間違えずに入力して下さい。
図2.7 ソースプログラムを作る(2) なお、プログラムの各行がそれぞれ意味ありげ(?)に右に数文字ずつ字下げされていますが、この字下げのことを、 インデント (indent)と言います。インデントはブランクキーを決まった個数(慣例的に3· 4個)打ち込むのでも良い のですが、tabキーを打つことでも簡単に入力できます。 プログラムは原則、半角文字(英数字)で記述しますが、文字列などの一部に日本語など他の言語も利用できます(こ の辺りの話は後で触れます)。日本語入力が終わった後、英語入力モードに戻ることを忘れないで下さい。例えば、「は じめまして。」の直後の” (ダブルクォーテーション)が全角文字のままだと、プログラムはエラーとなって稼働しま せん。 インデント以外で単語間に空白がある部分は半角のブランクを 1 つ入れて下さい。例えば、1 行目で package と section0201の間には半角のブランクが1つ入っています。逆に、半角のブランクは文法的にエラーにならない限りは どこに幾つ入れても構わないことになっています。例えば、和田はSystem.out.print( の後と、その対となる)の 前に1 つブランク入れる癖があります。入れない教科書が多いですが、和田は見易さを重視して開けています。こう した、Java の文法規則には無いけれど慣例的に行なわれていることは、先人たちのプログラムを数多く見ることで真 似ましょう。 入力が終わったら、メニューで「ファイル(F)>保管(S)」と選択します。このとき、ショートカットのCommand+s を覚えて利用するのも良いでしょう。
2.1.4
プログラム名を間違ってしまったとき
と こ ろ で 、プ ロ グ ラ ム の 名 前 を 間 違 っ て 作 っ て し ま っ た と き 、例 え ば 、HelloJava.java と す る と こ ろ を HalloJava.javaとしてしまった(e→a)!の場合、プログラム名の直し方を知っておきましょう。これは、間違って いなくても、クラス名を変更するなど頻繁に起こる操作です。 「パッケージ・エクスプローラー」でそのファイル (例えば HalloJava.java)を右クリックし、出てきた窓で「リ ファクタリング (Alt+Shift+T)」そして「名前変更(Alt+Shift+R)」と選択します。頻繁に行う操作ではないので、 ショットカットを覚えるのは無理かな。そして、「新しい名前」で名前を編集し、「完了」を押すと、関連するプログラムを検査して (そのプログラムを呼び出している全てのプログラムをチェックしている)、変更して良いか聞いてきま す。再度「完了」を押すと変更できます。
2.1.5
エディタとパッケージ・エクスプローラー
Eclipseのエディタ上でプログラムを作っていると、上部のファイル名のタグのところに*マークが付きます。そし て、出来上がったプログラムをメニューで「ファイル(F) >保管(S)」すると、その*マークが消えます。エディタ上 のプログラムはメモリー内で作成中のもの、パッケージ・エクスプローラーはハードディスクに格納されたもの、で す。プログラムを動かす場合、その2つが揃った状態でないと動かないように設定されているため、*マークが表示さ れたままで実行させると、Eclipseが先ずファイルの格納をするように言ってきます。その場合は、格納して下さい。2.1.6
プログラムを実行する
Eclipseは、プログラマがソースプログラムを作成中、裏でプログラムのコンパイル(翻訳)作業を行っています。正 確に言うと、ソースコードを中間言語というJVM上で解読可能なコードに書き直す作業を行っています。そこで書き 直しができない場合、つまり Javaの文法規則に違反したソースコードの場合に、Eclipseは文法エラーメッセージを 表示し、人間にコードの書き直しを要求してきます。エラーメッセージが表示されずにプログラムコードが完成する と、中間言語によるプログラムが完成し、あとはJVM上での実行を待つこととなります。 最初に行ったように、Eclipseというソフトは、ソースコードを作成するエディタであり、コンパイラ(中間言語への 翻訳器)であり、そして出来上がったプログラムを実行するアプリケーションでもあるわけです。作成した HelloJava に文法エラーがなければ、続いて実行に移ります。もし、エラーがあった場合は、その行の行頭に「ランプに赤い×の アイコン( )」が表示されますので、修正しましょう。 メニューで「実行(R)>実行(S)>Javaアプリケーション」を選択するか、ツールバーの「緑色の円の中に白抜き 右向き三角( )」のアイコンをクリック、あるいは、その横の小さな下向き黒三角で「実行(R)>Java アプリケー ション」を選択など、幾つかの選択肢で実行ができます。この実行、前に動かしたプログラムとの関係で上手くいかな い場合もあって、その場合は「実行の構成(N)」で始めないといけなかったりで、ちょっと慣れが必要です(説明が難 しい)。 もし、表示しているプログラムでは無く、前回動かしたプログラムが動いてしまうようなら、次の設定をチェックし て下さい。パッケージ・エクスプローラでプロジェクト「プログラミングの授業」が選択されている状態で、メニュー の「ウィンドウ(W)>設定(P)」を選択し、左の「実行/デバッグ」の「起動」を選んだ際に、右の画面の「起動操作」 の2項目目の「選択したリソースまたはアクティブなエディター云々」と「関連プロジェクトを起動する」にチェック が入っていることを確かめて下さい。これが1項目目の「常に前回起動した云々」にチェックされていると、上記のよ うなことが起きます。2.2
プログラムの構造と決まりごと
ここまでに出てきたプログラム・パッケージ・プロジェクトについて、より細かい決まりごとなどをここでまとめて おきます。2.2.1
プログラム
Java においてプログラムは、いくつかのクラス (class) の集合体です。HelloJava プログラムは唯一つのクラス HelloJavaからできていますが、先に進むと複数のクラスが絡み合って 1つのプログラムを形成するようになります。
クラスを表記したテキストファイルをソースファイル(source file)と言います。ソースファイルは、拡張子に.javaを 付けなければいけません。 1つのクラスを複数のソースファイルに分けて格納することはできませんが、1つのソースファイル内に複数のクラ スを格納することはできます。この時、クラスの名前とファイルの名前には、次のような規約があります。 • ファイルの中にクラスが1つだけの場合は、ファイル名とクラス名は一致する(今回の HelloJavaはこの場合) • ファイルの中に複数のクラスがある場合は、スコープ(後で学びます)がpublicなクラスの名前とファイル名は 等しくなければならない publicというスコープについての説明は後にするとして、この規約よりファイル内にはpublicなクラスが複数あっ てはいけないことになります。また、入っているクラスが全てpublicでなければ、ファイル名には特に制約はありま せん。ただし、中身と入れ物の名前が全く違うのは使いにくいものです。慣例的には、ファイル名は中に入っているク ラスのいずれかと等しい名前とし、混乱を招きそうな場合は、各クラスを別個のファイルに分割して (1クラス1ファ イル)、クラス名とファイル名を等しくする方法が取られます。 今、これを読んでちんぷん・かんぷんでも一向に構いません。テキストを読み終わる頃には、ちゃんと理解できてい る?と思いますので。(^^;) 問題 2.2.1. 次のクラスとファイルの関係で許されるのはどれですか。 1. クラスAとクラス BをソースファイルA.javaに格納する 2. public クラスAと クラスBをソースファイルA.javaに格納する 3. クラスAとpublicクラスBをソースファイルA.javaに格納する 4. public クラスAとpublicクラスBをソースファイルA.javaに格納する
Javaでの名前の付け方には幾つかの形式があります。 • スネーク形式で単語をつなげる。(例:graphical_tools) • キャメル形式で単語をつなげる。(例:graphicalTools) • パスカル形式:アッパーキャメル形式とも(例:GraphicalTools) スネーク形式とは、単語は全て小文字に、単語間のブランクをアンダースコア(under score:下線) ” ”に変える書き 方です。一方、キャメルはラクダのこと。全ての文字を小文字にしてから単語間のブランクを削除し、2単語目以降の 1文字目を大文字にしてつなげる書き方です。そして、キャメル形式の特殊な場合として、最初の文字を大文字にする パスカル形式があります。 クラス名はパスカル形式の名前にするのが慣例になっています。
2.2.2
パッケージ
パッケージは、何らかの関連のあるプログラムの集合のことを言い、一般にその関連性から付けられた名前が英数字 を用いて付いています。慣例的に、全て小文字で書かれます。 各パッケージはそれぞれコンピュータの中のフォルダに対応し、その名前がそのまま使用されるので、OSのフォル ダ命名法にも従わないといけません(英数字以外の記号はほとんど使えない)。また、ネット上に公開するような場合を 考えて、世界中のどのプログラムとも名前が重複しないよう組織や個人のドメイン名を逆順に記述したものをパッケージ名の頭に付けるという方法も用いられています。(例:jp.ac.tus.ed.jmwada.programmingexamples) Java の教科書によってはパッケージを設定せずに全てのプログラムを記述しているものもあります。その場合、デ フォルトパッケージという無名のパッケージ内にプログラムが作られているとして処理されます。一般に、デフォル トパッケージによるプログラム作りは推奨されておらず、Eclipseでも作成することはできますが、この授業では必ず パッケージを作ってからプログラムを作ります。 図2.8 デフォルトパッケージ Eclipseでパッケージを指定せずにプログラムを作ると、図2.8 のように、デフォルト・パッケージという名無しの パッケージ内にプログラムが作られます。その場合、パッケージ・エクスプローラー上で、そのプログラムのアイコン (白いファイルにJの文字)を別のパッケージの中にドラッグすることでパッケージの移動ができます。
2.2.3
プロジェクト
プロジェクトはJavaの言葉ではなく、Eclipseの言葉です。関連する複数のパッケージを集めた集合体をプロジェ クトとして定義します。プロジェクト名には特にルールはありませんが、一般的なJava の命名法に従うのが無難で しょう。また、パッケージと同様に、各プロジェクトはそれぞれコンピュータ内のフォルダに対応するので、OS の フォルダ命名法には従わないといけません。2.2.4
でも、個人的に使うとき...
以上の命名ルールを守らないと必ずコンパイルエラーを起こすのか?というと、そうでもありません。(^^;) プログラムをコンパイル・実行する際に、プロジェクト名・パッケージ名・クラス名(プログラム名)が一意に識別で きて矛盾がないなら、ほとんどの場合スムーズに実行まで行えます。つまり、教授にレポートとして提出するとか学外 に公開するとか、で無い個人的な場合は多少ルールを無視しても大丈夫です(こんなこと、教科書では書けない)。 例えば、パッケージを「行列の練習」なんてのにして、プログラム名を「行列の掛け算の練習.java」なんてのにして も(拡張子の.javaは変えられない)、(たぶん)動きます(あくまでも、個人使用ですよ)。2.2.5
ファイルの在りかを把握する
自分で作ったプログラムをメールで提出しなければならなくなった。でも、どこにあるのかわからない!では困りま すから、自分のプログラム群がパソコンのどこにあるのか、しっかり把握しておきましょう。
この授業ではEclipseをインストールした際に、workspaceというプログラムの置き場(フォルダ)を、C:Yjava に 置きました。こ C:Yjava.workspace中にEclipseで作る全てのプログラムがあります。このフォルダをバックアップ しておけば、Eclipseを再インストールしたりしても、以前のプログラムを再利用することができます(ただし、新し いEclipseにその場所を教えてやらねばいけませんが)。
2.3
コンソールへの出力
I
HelloJavaプログラムに戻りましょう。 プログラムの1行目には、そのプログラムがどのパッケージに入っているかを書きます。今回はsection0201パッケー ジでしたね。2行目からが HelloJavaクラスのブロックです。ブロックとは、対となる中かっこに囲まれた部分を言 い、この場合、2 行目から7行目までの赤い中かっこ内がHelloJavaクラスのブロックです。さらに、その中にもう 1つブロックが入っています。public static void main( String[] args )に続く青いブロック(3行目から6 行目まで)、これを mainメソッドのブロックと呼びます。実行したい命令をmain メソッドのブロック内に書きます。このプログラムでは、2つのSystem.out.printという 命令が入っています。
まず、このSystem.out.printという命令について見ていきましょう。
package section0201;
public class HelloJava {
public static void main( String[] args ) { System.out.print( "はじめまして。" ); System.out.print( "Duke と言います。" ); } }
2.3.1
System.out.print
Java プログラムでは、プログラムの実行結果を様々な出力装置に出力できますが、特に設定を変えない限り、標準 出力装置「コンソール(console)」にテキストとして出力します。Eclipseではコンソール・ビュー(コンソールの窓) を表示させておけば、そこに出力が行われます。コンソールへの出力はSystem.outと名付けられたオブジェクトの持つprintというメソッド(method : 機能)を 利用します。オブジェクトについては第3 章に説明するので、今は呪文としておきます。第2 章では呪文(意味は後 まわしにして、とにかく使う文)が多いです。System.outのprintなので、ドットでつなげてSystem.out.printと書 きます。単に出力するのに面倒臭い!と思うでしょう。はい、面倒です。(^^)
出力したい文字列を二重引用符 (double quotations)「” ”」で囲んで printに続く小かっこの中に書きます。最後 に、1つの命令が終わったことを意味するセミコロン(semicolon)「;」を書きます。Javaでは、命令の最後に必ずこ の「セミコロン」を付けるので、忘れないように。
定期試験でプログラムを書いてもらう際にセミコロンが抜けたら1点減点!なんてこと、ありますので宜しく。 このプログラムを実行させると、文字列が次のようにコンソールに出力されます。
はじめまして。Dukeと言います。 問題 2.3.1. Dukeの代わりに、あなたの名前が「はじめまして。和田雅美 と言います。」みたいに書かれるように、 HelloJavaプログラムを改良しなさい。
2.3.2
System.out.println
出力結果を見てわかるように、printメソッドには改行する機能がなく、2つの出力命令の結果が1行に続けて書か れています。この2つの間で改行を行いたいとき、2通りの方法があります。 • 文字列内の改行したい場所にエスケープシーケンスYnを置く • 出力後に改行してくれる別のメソッドprintlnを使う エスケープシーケンスによる方法は、後述します。以下は、println (プリントエルエヌ)メソッドの使い方の例です。 これまで学んだ手順に沿って、新しいプログラムを作成しましょう。次のプログラムを読むと、そのプログラムがどの パッケージに入っていて、何というファイルにしたら良いかがわかるはずですが、如何かな。(^^)b? ソースコード2.2 HelloJava2.java (はじめましてDuke改行版) package section0203;public class HelloJava2 {
public static void main( String[] args ) { System.out.println( "はじめまして。" ); System.out.println( "Duke と言います。" ); } } このプログラムの名前はHelloJava2.javaで、パッケージsection0203内に作る、と読み取れましたか。では、このプ ログラムを実行させて下さい。 はじめまして。 Dukeと言います。 今度は、System.outの別のメソッドprintlnを使って出力させました。この命令は、出力が終わると自動的に改 行を行ってくれます。System.outには、他にもより高度な出力のできるprintf (プリントエフ)メソッドもあります (これは後述)。とりあえず、2つのメソッドprintとprintln を使えるようになりましょう。ところで、 printlnの ln に意味は?これはline の略です。
はじめまして。 Dukeと言います。 こうした場合、改行のエスケープシーケンスを書く、という方法もありますが、println メソッドを使うという のも良く行われます。その場合、改行だけで、文字を出力するわけではないので、小かっこの中に何も入れずに、 System.out.println();と書きます。HalloJava2.javaに1行あける命令を挿入してみましょう。
2.4
文字コード
コンピュータは欧米が起源なので、文字といえばローマ字によるアルファベットです。従って、最初のコンピュータ ではaからZ までの52文字の大小英文字と 0から9までの 10文字の数字、そして幾つかの記号が使えれば構いま せんでした。コンピュータ内は2 進数でデータを表しているので、文字もそれぞれ1 つずつ2 進数で定義され、それ をASCII コード(アスキーコード:American Standard Code for Information Interchange)と呼びます。0 1 2 3 4 5 6 7 0 NUL DEL SP 0 @ P ` p 1 SCH DC1 ! 1 A Q a q 2 STX DC2 “ 2 B R b r 3 ETX DC3 # 3 C S c s 4 EQT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ‘ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL 図2.9 ASCIIコード表 ASCII コード表(図2.9 参照)は、表の横・縦の順に 16進数の数値として読みます。例えば、文字A なら、横4 縦1 なので、16進数の41 (10進数なら65)が文字A のASCIIコードになります。2桁からなる 16進数を2 進数 で表現するには、8 bitsで済みますよね。従って、ASCIIコードは 8 bitsで出来ています。
うん?気づいた人がいるかな。表の横が7までしかないのだから、7 bitsで済むんじゃないか?って。そうですね。 でも2 進数の世界では7という数はキリが悪く、余分な1 bitの0を頭に置いて ASCIIコードは 8 bitsで表現され ています。
コードを定義していきました。日本の場合、JISコードと Shift JISコードが今でもコンピュータのやインターネット 上で利用されています。その話は、Java とは別のところで(「コンピュータ入門」あたりで聴けるかな)。
で、世界中で様々な文字コードが発明されると、当然「コードを統一すべきだ!」ということになり、生まれたのが 「ユニコード(Unicode)」という万国共通の文字コードです。
2.4.1
Unicode
とは
Unicodeは、Xerox社が発起としてMicrosoft、Apple、IBM、Sun Microsystems、Hewlett-Packard、JustSystems などが参加した組織The Unicode Consortiumが、1993年までに作り上げた国際標準の文字コードで、全ての国の文 字を1つの文字コードの中に定義しようというものです。
JavaはUnicodeを基本の文字コードと設定しています。幾つかの文字のUnicodeを調べてみましょう。ここでは、 半角の「A」と全角の「A・あ・Ω」の文字コードを出力しています。プログラムの中身は、とりあえずまた呪文とい うことで。(^^)
ソースコード2.3 UnicodeCheck.java (UNICODE の値)
package section0204;
public class UnicodeCheck {
public static void main( String[] args ) {
System.out.println( "A のUnicode番号は、" + Integer.toHexString(’A’) ); System.out.println( "AのUnicode番号は、" + Integer.toHexString(’A’) ); System.out.println( "あのUnicode番号は、" + Integer.toHexString(’あ’) ); System.out.println( "ΩのUnicode番号は、" + Integer.toHexString(’Ω’) ); }
}
半角の「A」のUnicode がASCIIコードの値を同じこと・半角の「A」と全角の「A」のコードが違うことをチェッ クしておいて下さい。その他の文字のコードは、次のページで見ることができます。自分の名前の Unicode列を調べ てみるのも面白いかも。 >Unicode一覧表 (https://ja.wikipedia.org/wiki/Unicode一覧表) 最後に、文字コードの注意点を1つ: 日本に ASCII コードが持ち込まれた際に1文字だけ日本特有の文字に変更したものがあります。それは円マーク 「¥」。ASCIIコードの5Cの文字です。以下のテーブルを見比べると、本来バックスラッシュ「\」の文字が、日本で よく使う文字¥に入れ替わっています。多分使わないだろう!と思われた\のところに代わりに入れてしまったのです が、実はコンピュータの世界ではバックスラッシュはいたる所に出てくるので、以降、キーボードの¥のキーを押した ら\が表示された!とか、英語モードのキーボードなので¥のキーが見当たらない!など、いろいろな問題が起こって います。とりあえず、ASCIIコードの世界では、この2つは同じもの!(コード5C)です。なお、ユニコードでは、こ の2つは区別されていて、¥は Unicode 00A5、\は Unicode 005Cです。面倒ですね。
2.5
コメント
プログラムを頑張って作っても、しばらく時間が経つと「これって何のプログラムだっけ?」「この変数、何のため にあるんだっけ?」「入力データはどうやって入力するんだっけ?」と忘れてしまって使えない、なんてことになりが ちです。操作マニュアルなる文章を作ることが良いわけですが、結構大変。そこで、最も簡単は方法はプログラム中に コメントを書いておくことです。コメントは、プログラムの実行時(コンパイル時)には無視されているので、コメン トが多くても実行が遅くなるなんてことはありません。和田がプログラミング言語を習ったときは、処理文よりコメン0 1 2 3 4 5 6 7 0 NUL DEL SP 0 @ P ` p 1 SCH DC1 ! 1 A Q a q 2 STX DC2 “ 2 B R b r 3 ETX DC3 # 3 C S c s 4 EQT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ‘ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL 0 1 2 3 4 5 6 7 0 NUL DEL SP 0 @ P ` p 1 SCH DC1 ! 1 A Q a q 2 STX DC2 “ 2 B R b r 3 ETX DC3 # 3 C S c s 4 EQT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ‘ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L ¥ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL 図2.10 ASCIIコード表 ト文の方が多いくらいのプログラムを書け!なんて教授に言われました。 和田の試験では、過去に自分で作成したプログラムを参照しながらプログラムを作ってもらう問題もあるので、しっ かりコメントを書いておくのは、試験対策としても役立ちます。なお、このテキストではプログラムリストには原則、 コメントは入れていません。各自で自由に入れて下さい。コメントの書き方には以下の3 種類があります。 • 単一行コメント:2 つの斜線//で始めるコメント • ブロックコメント:/*で始まり*/で終わるコメント • Javadoc 用コメント:/**で始まり*/で終わるコメント ソースコード2.4 Comments.java (コメント文いろいろ) package section0205;
public class Comments {
public static void main(String[] args) { // このように始めると 、単一行コメント @SuppressWarnings("unused") int x = 10; // こうして命令の右にコメントを置くことが可能 // int y = 20; でも、命令の左に斜線2本を置くと、命令自体もコメントに /* 複数行のコメントを書きたいとき このように、ブロックコメントを使う 間に挟まったものは全てコメントとなる int z = 30; これもコメントになってしまう */ /* * Eclipse でブロックコメントを書くと、このように途中の行の行頭に * 星印が続きます */ /**