区分 環境情報科目
ディプロマ・ポリシーとの関係
環境 データ処理 ソリューション開発・エシカルテクノロジー
サステナブル・エンジニアリング
カリキュラム・ポリシーとの関係
教養 応用力 実践力
科目間連携
カリキュラム全体の中でのこの科目の位置づけ

科目の目的
本科目では、Javaの応用を学び、業務における実践的な視点から必要とされるプログラミング技術を習得することを目的とします。特に、オブジェクト指向設計を重視し、保守性の高いシステムの構築手法を学びます。適切なクラス設計を行うことで、システムの拡張性や可読性を向上させ、開発・運用の効率化を図ることができます。また、環境という視点を踏まえ、ソフトウェア開発の持続可能性にも配慮したプログラミングを実践します。
到達目標
本科目を修了することで、以下の能力を習得することを目標とします。

1.Javaのオブジェクト指向プログラミング
 (1)クラスやメソッドの適切な設計と実装ができる。
 (2)継承やポリモーフィズムを活用した設計ができる。

2.実践的なプログラミングスキル
 (1)IDE(Eclipse)を用いた開発環境を整え、適切に活用できる。
 (2)標準ライブラリを活用し、効率的なプログラムを記述できる。

3.システムの保守性と拡張性の向上
 (1)クラス設計の原則を理解し、設計品質を意識したコーディングを始められるようになる。
 (2)例外処理やファイル操作を適切に実装し、堅牢なシステムを構築できる。


科目の概要
本科目では、Javaの基本的な復習から始め、オブジェクト指向プログラミングの実践的な技術を体系的に学習します。授業では、以下の流れで進行します。

1.開発環境の活用:Eclipseを用いたプロジェクトの作成とクラスの定義、操作方法を確認する。
2.Javaの基本復習:制御文、文字列操作、日付・時刻の処理などを確認する。
3.オブジェクト指向の基礎:クラス・メソッドの定義やコンストラクタの活用を学ぶ。
4.オブジェクト指向の発展:継承・ポリモーフィズム、抽象クラス、インタフェースを学習する。
5.標準ライブラリの活用:コレクションフレームワークや例外処理、ファイル入出力を学ぶ。
6.総合演習:実際のシステム開発を想定した機能実装・テストを行う。
7.演習を通じて、実務レベルのプログラミングスキルを習得し、実際の開発現場で求められるスキルを身につけます。

科目のキーワード
オブジェクト指向設計, クラスとインスタンス, メソッドとコンストラクタ, オーバーロード, オーバーライド, 継承とポリモーフィズム, 抽象クラスとインタフェース, 例外処理, コレクション, ジェネリクス, Eclipse(統合開発環境)
授業の展開方法
本科目は、以下の手順で進行します。

1.理論の理解
 各トピックの原理や仕組みを講義形式で学び、基本的な文法や使い方を理解する。
2.実践的な演習
 理論を基に、演習課題を通じて実際にコードを記述し、理解を深める。
3.応用課題への取り組み
 実際のシステム開発を想定し、複数の技術を組み合わせた機能実装を行う。
4.フィードバックと改善
 作成したプログラムのレビューを行い、改善点を学ぶことでスキルの向上を図る。

各コマでは、まず理論を学び、その後すぐに演習を行うことで、知識の定着を促します。また、後半ではシステム開発を意識した演習に取り組み、実務で求められるスキルを養います。

オフィス・アワー
深澤良彰:【前期】月曜4限、火曜4限、水曜4限、木曜2限
【後期】
サスティナブルソフトウェア概論
サステナブル・ソフトウェア論Ⅱ(オブジェクト指向設計)
環境プログラミングⅡ
全科目:月曜4限、火曜4限、水曜4限、木曜4限
須藤竜之介:【前期】
情報リテラシーⅠ(パソコンの活用と情報倫理)
環境プログラミングⅠ(基本文法)
全科目:水曜4限
【後期】
環境プログラミングⅡ(クラスの作成)水曜4限
請園正敏:【前期】
月曜4限、水曜4限、金曜5限
【後期】
環境統計学概論月曜4限、水曜4限

科目コード UC2022
学年・期 1年・後期
科目名 環境プログラミングⅡ(クラスの作成)
単位数 12
授業形態 演習
必修・選択 必修
学習時間 【授業】90分×90 【予習】90分以上×90 【復習】90分以上×90
前提とする科目
展開科目
関連資格
担当教員名 深澤良彰・須藤竜之介・藤浪遼太郎・請園正敏
主題コマシラバス項目内容教材・教具
1 IDEの活用、Eclipseの実行とワークスペース 科目の中での位置付け ループと配列を組み合わせ、簡易的な処理フローのミニアプリを作ることでJava基本文法を復習する。
コマ主題細目 ① 本科目の概要 ② Eclipseの基本的な扱い方の復習 ③ 便利なショートカット機能の確認
細目レベル ① 本科目は1週間に6回の授業を実施し、大学の授業の15週分、つまり90回の授業を実施する。本科目の中核はJava言語を用いたオブジェクト指向構文の理解とその活用である。講義の流れとしては以下のとおりである。まず、第1回から第6回までで、前期の復習としてEclipseを用いたJava言語の基本的な構文に関する問題演習、プログラム演習を実施する。第7回から第39回までで、オブジェクト指向の基本的な構文について確認し、プログラムの作成を演習する。第40回から第64回までで、オブジェクト指向におけるカプセル化、継承、ポリフォーリズムについて学修し、その内容の確認を行う。第65回から第72回までで、コレクションフレームワークについて学修し、プログラムへの応用を確認する。第73回から第90回まではオブジェクト指向構文の活用として、入れ子のクラス、ジェネリクス、例外処理などを実行する。これらの学修に関するより詳細を説明し、内容を確認する。
②  前期科目であるJavaⅠで扱った基本的なプログラムの作成について復習する。Eclipseを用いてクラスの作成、ショートカットを用いた基本的なプログラムの作成について確認する。まずEclipseを起動する。ワークスペースとしてのディレクトリ-選択の画面では、後期の授業である「Java2」に変更し、新しい絶対パスを設定する。後期の授業中の演習において作成するプログラムはすべてJava2のフォルダに作成していくことになる。
 ファイルタブから「新規」→「Javaプロジェクト」を選択する。プロジェクト名は「Java2_1」とする。実行環境はJavSE-21を使用する。次に、Javaのクラスを作成する。ファイルタブから「新規」→「クラス」を選択する。クラス名は「Exp1_1」とする。また、どのメソッド・スタブを作成しますか?という項目についてはpublic static void main(String[] args)(V)にチェックを入れることを必ず行う。

③  講義内で指定されたプログラムの作成を行う。その際に必要ないくつかのショートカットを確認する。Javaのクラスを作成すると自動的に書かれてい+E20:J41る「// TODO 自動手生成されたメソッド・スタブ」の1行を消すためにカーソルを合わせてctrl + d を入力する。また、文字列をコンソール上に表示するメソッドであるSystem.out.println()を入力するにはsysoutと記入し、ctrl + spaceキーで補完変換してくれる。また、コメントアウトするときのショートカットも確認する。1行のコメントアウトをするときには、コメントアウトしたい行のにカーソルを合わせてctrl + / で行の戦闘に//が入力され、コメントアウトができる。なお、複数行をコメントアウトするときは、複数行を範囲選択することで可能である。ただし、連続した複数行をコメントアウトするときは、/* */でコメントアウトするのが一般的である。そのようなコメントアウトをする場合には、範囲選択をし、ctrl + spaceキー + / を入力することで可能になる。


キーワード ① Java言語の基本構文 ② Eclipse ③ ショートカット ④ インデント
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 Eslipseを用いたプログラム作成の基本的な手法について復習する。特にショートカットは何度も実施し、自然と手がやれるまで何度も繰り返し実施する。
2 プロジェクトの作成とアプリの実行 科目の中での位置付け 既存コードに新機能を追加し、ソースを拡張・修正する流れを体験して、開発の更新サイクルを学ぶ。
コマ主題細目 ① プログラム作成のショートカット
細目レベル ① コード修正に関するEclipseのショートカットキーについても確認する。前期の授業中に伝えていたように基本的にはインデントは、自身で意識的にすることが重要であるが、Eclipseには自動的なインデント機能がある。自動フォーマットと呼ばれる機能であり、プログラムの作成後、ctrl + shift + fキーで実施される。また、エラーや警告が出ている箇所を選択してctrl + 1を入力することで、修正方法を提案してくれます。ただし必ずしもその提案通りにすればよいわけではなく、提案がない場合もあるので注意が必要です。
キーワード ① 自動フォーマット ② 修正方法提案 ③ ショートカットキー
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 Eslipseを用いたプログラム作成の基本的な手法について復習する。特にショートカットは何度も実施し、自然と手がやれるまで何度も繰り返し実施する。
3 振り返りプログラム演習① 科目の中での位置付け 数値⇔文字列変換を正しく使いこなし、入力処理などで活用できるフォーマット変換力を高める。
コマ主題細目 ① 変数の型と扱い方 ② 文字列と型変換
細目レベル ① 変数には型が存在します。大きくはプリミティブ型(基本データ型)と参照型に分けられます。プリミティブ型にはbyte, short, int, long, float, double, char, booleanの8種類、参照型にはString型と配列変数が含まれることを前期に学習しました。また、型の変換には暗黙的型変換と明示的型変換が存在します。暗黙的型変換はJavaのプログラムを実行した際に自動的に変換されることであり、明示的型変換は変換する先の型を明示的にプログラム中に記述し、型変換をすることでした。また、縮小変換と拡大変換があり、確保できる値の範囲によってその呼称が変わることを学習しました。
② 文字列、つまりStiring型の変数を型変換するにはプリミティブ型の型変換とは異なる手法が必要でした。つまり暗黙的型変換や明示的型変換などと異なり、特定のメソッドを活用する必要がありました。文字列をint型の変数、つまり整数型の変数に変換する場合はparseintメソッドを使う必要があり、文字列をdouble型の変数、つまり小数型の変数に変換する場合はparsedoubleメソッドを使う必要がありました。これらの文字列変数の型変換に関する理解を深め、活用できるように演習を行います。
キーワード ① プリミティブ型 ② 参照型 ③ 文字列の型変換 ④ parseIntメソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 さまざまな変数の型変換を理解し、プログラム中の挙動を理解できるように演習を行う。特に変換が行われた1行に対してどのようなことが起こるのか(小数点以下は切り捨てられるなど)をコメントとして残し、実行し、理解を確認する。
4 振り返りプログラム演習② 科目の中での位置付け 文字列比較の仕組みを理解し、判定ロジックのバグを減らすことでアプリケーションの安定性を向上させる。
コマ主題細目 ① 条件分岐 ② 繰り返し文
細目レベル ① Java言語における条件分岐の記述方法を復習します。条件分岐の基本はif文であり、条件文がtrueになった場合、実行されます。条件文がfalseであった場合は何も書かなければ実行されませんが、falseの場合にtrueの場合とは異なることを実行したい場合はelse文を使えば記述が可能です。また、falseの場合にさらに条件を分岐したい場合はelse if文を記述することで実行可能となります。分岐が多く、それぞれに同じ処理を行いたい場合はswitch文、またはswitch式を用いて記述します。それぞれ条件に一致した内容を実施するところは同様ですが、いくつか注意点が存在しました。switch文ではbreak文を記述しなかった場合、条件に一致したところから下の条件がすべて実行されてしまうという点です。switch式ではdefault、つまりすべての条件に一致しなかった場合を記述しなければコンパイルエラーになってしまうことを忘れてはいけません。
② Java言語における繰り返し文の記述方法を復習します。繰り返し文はwhile文があります。これもif文と同様に条件文がtrueの間、繰り返すというものです。また、1度は必ず実行してから条件を確認し、繰り返す記述方法としてdo while文があります。このdo while文では条件文のあとにセミコロン(;)がなければコンパイルエラーになることを忘れてはいけません。また、初期値、条件文、変数増減をすべてまとめて記述し、繰り返す方法としてfor文があります。このfor文の使い方を復習し、for文のネストなどを用いた2次元配列の要素の表示方法などを確認します。
キーワード ① 条件分岐文 ② 繰り返し文 ③ 論理演算子 ④ 文字列の比較
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 この授業で紹介した制御構文の記述方法を復習するためプログラムの作成課題を実施する。プログラムは制御文を用いて作成し、指定された要件に一致するように作成する。この課題については提出を求め、プログラムの正しい記述ができるように確認を行う。
5 振り返りプログラム演習③ 科目の中での位置付け 文字列の部分抽出や置換を習得し、多様なテキスト編集を実現できるようにする。
コマ主題細目 ① 実行時引数 ② import文
細目レベル ① Javaプログラムにおける実行時引数の扱い方について学修する。実行時引数はプログラムを実行する際に変数として渡される値のことである。public static void main(String[] args)のargs変数に代入され、String型(文字列型)の配列変数に格納される。配列変数であるため最初の引数は要素0番目として扱われることに注意が必要である。また、args型に格納されるのはString型であるため、数値を代入した場合はInteger.parseInt()メソッドやDouble.parseDouble()を用いて変換する必要がある。なおEclipseを用いて実行時引数を設定するときは実行ボタンのタブから「実行の構成」を選択します。「新しい起動構成プロトタイプ」→「引数」を選択し、プログラムの引数に入力したい引数を代入して実行ボタンを選択すれば実行できます。
② Java言語単体では「これができたら…」という機能が足りていないことがあります。例えばプログラムの実行中にキーボードから「文字列が入力出来たら…」などです。これらが簡単に実行できるようにこれまでのプログラマーたちがその機能を作成してくれていることがあります。その機能の呼び出しに使うのがimport文です。例えばプログラムの実行中にキーボードで入力を受け付けたいときScannerクラスを利用します。利用の際にはプログラムの先頭にimport java.util.Scanner;と記述し、インポートを行います。続けて、mainメソッド内にScanner scanner = new Scanner(System.in)と記述することで準備が完了します。整数を読み取りたいときは整数を宣言後に入力を受け付けて代入すればよいので例えばint number = scanner.nextInt();と記述することでnumber変数にキーボードで受け付けた入力を代入することができます。1行全体の入力を読み取る時にはString line = scanner.nextLine(); と記述すればよいです。lineという文字列型の変数に代入することが可能になります。実行時引数とimport文を用いたプログラム作成の演習を行います。
キーワード ① 実行時引数 ② import文 ③ 入力受付
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 実行時引数やimport文を用いたプログラムの作成を実施する。授業内でプログラム作成のテーマを確認し、完成したものを実行時引数を与えた画面、実行結果ともに合わせて提出をする。
6 振り返りプログラム演習④ 科目の中での位置付け String.formatやprintfを使いこなし、整形表示やログ出力の可読性を向上させる技術を習得する。
コマ主題細目 ① デバッグ
細目レベル ① Eclipseを用いたデバッグの手法について確認する。バグの原因を確認し、修正することをデバッグと呼びます。また、プログラムにバグがあったときにその原因を調査するために利用するものをデバッガと呼びます。Eclipseではこのデバッガが豊富にそろっています。このコマでは基本的なデバッガの扱い方について確認します。例えばループ文のトレースを行いたいときに、そのループ文内にブレークポイントを設定します。ブレークポイントとはプログラム実行時にプログラムを一時停止させる行のことを指します。プログラムのエディターウィンドウの一番左側をダブルクリックすると、ブレークポイントが設定され特定の記号が表示されます。なお、このブレークポイントは複数行に設定できます。そのうえで実行をするとデバッグ・モードで起動するか聞かれるので、「はい(Y)」を選択する。するとブレークポイントに到達したところで一時停止をする。そこから処理を行って次の行に進むにはステップオーバーコマンドを実行する。その際にはショートカットキーのF6を押して実施するのでも構いません。より複雑なループ文のトレースをEclipseを用いて実行し、その手法を理解します。
キーワード ① デバッグ ② ブレークポイント ③ ステップオーバー
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ループ文のトレース課題をブレークポイントを設定し、ステップオーバーを用いてデバッグを用いたトレースを実施し、その結果をまとめて提出する。
7 クラスの構成要素 科目の中での位置付け テンプレートやプレースホルダーを使って柔軟な文字列生成を行い、可変要素を安全に取り扱う方法を学ぶ。
コマ主題細目 ① クラスとオブジェクトの関係 ② クラスの基本的な構成要素(フィールド・メソッド) ③ クラスとインスタンスの違いと役割
細目レベル ① オブジェクト指向プログラミングにおいて「オブジェクト」はプログラムの基本単位です。オブジェクトは「データ(フィールド)」と「処理(メソッド)」を一体化した部品であり、それを生み出す設計図が「クラス」です。クラスが存在することで、多くのオブジェクトを効率的に作り出すことが可能になります。ここで重要なのは、クラスはあくまで「型」や「設計図」であり、実体そのものではないという点です。
② クラスには「フィールド」と「メソッド」が含まれます。フィールドはそのクラスに属するデータであり、例えば「商品クラス」なら「名前・価格・在庫数」などが考えられます。一方メソッドは、そのクラスに属する処理を表し、「表示する」「値引きする」などの操作が該当します。Javaではこれらをまとめて「メンバ」と呼びます。ここでの理解のポイントは、「フィールド=データ」「メソッド=操作」という対応関係をしっかり押さえることです。これにより、クラスを設計するときに「このクラスが持つべき情報と振る舞いは何か」を整理できるようになります。
③ クラスは「設計図」にあたり、インスタンスはその設計図から具体的に作られた「製品」にあたります。例えば「図形クラス」という設計図をもとに、「赤い円」や「青い四角」といった具体的な図形インスタンスを作ることができます。重要なのは、オブジェクトという言葉は広く使われ、クラスから生成された具体的なオブジェクトを特に区別して呼ぶときに「インスタンス」という用語を使う、という点です。

授業では、インスタンスの生成までは行いませんが、クラスがどのような構成要素を持ち得るかを意識する練習を行います。具体的には「食品クラス」「図形クラス」など身近な例を取り上げ、フィールド(データ)を3つ、メソッド(操作)を2つ以上書き出してもらいます。この練習によって、クラスが「データと処理をまとめる設計図」であることを体験的に理解できます。

キーワード ① クラス ② オブジェクト ③ フィールド ④ メソッド ⑤ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習:今日学んだ「クラス」「オブジェクト」「インスタンス」の関係を図にまとめ、ノートやワードなどに整理してください(クラス=設計図、インスタンス=具体物という整理を明確にする)。日常生活から1つ題材を選び(例:スマートフォン、飲み物、自転車など)、その「クラス」にふさわしいフィールドを3つ、メソッドを2つ考えて書き出してください。
8 クラスとインスタンスの作り方 科目の中での位置付け 演習形式で複雑な文字列操作を体得し、実務レベルのテキスト変換や解析ロジックを身につける。
コマ主題細目 ① フォルダ構成・コマンドライン基本 ② コンパイルと実行(javacとjava-cp)の型と落とし穴 ③ クラスとフィールドの宣言
細目レベル ① 授業の進め方と評価方法を共有し、以後の演習がサブフォルダ単位で提供される前提を確認する。端末上での基本操作(移動・一覧・編集)を復習し、「作業用ルート/各回サブフォルダ/ソースとクラスファイル」の対応を板書と実機で対応づける。ここで重要なのは、コンパイル生成物(.class)の出力先を意識し、検索起点と一致させるという視点である。
② コンパイルと実行では、javac サブフォルダ名/*.java で一括コンパイルし、java -cp サブフォルダ名 メインクラス名 で起動する一連の型を確実に身につける。-cp はクラス探索の起点を指定し、ソースの場所と必ずしも一致しない点を体験的に理解する。初学者の典型的つまずきは、(a)クラス名の大文字小文字違い、(b)メインメソッドの所在クラスを誤指定、(c)カレントディレクトリとクラスパスの混同、の3点。演習でエラーになったらメッセージを読み、原因→対処を言語化する癖をつける。
③ クラスとフィールドの宣言では、「クラス=設計図、インスタンス=製品」という比喩で全体像を掴み、public class クラス名 { ... } の基本形と、クラス内部でのフィールド宣言(型 識別子;)を学ぶ。題材として Dog クラスを用い、String name; int age; を定義。識別子の命名は lowerCamelCase、意味のある英語名、略語の多用は避けることを確認する。ローカル変数と似ていても、フィールドはインスタンスやクラスに結びつき寿命が長い点を強調する。次回のインスタンス生成に備え、宣言と「まだ中身はない」状態を区別して認識できるようにする。
キーワード ① サブフォルダ構成 ② コンパイル(javac) ③ 実行とクラスパス(-cp) ④ クラス宣言 ⑤ フィールド宣言
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 自分の作業用フォルダで、サブフォルダ構成を作成し、2つのクラスを実装。javac サブフォルダ名/*.java → java -cp サブフォルダ名 クラス名 で実行し、使用コマンドと出力結果をスクリーンショットまたはテキストで提出。
9 フィールドの定義と規定値 科目の中での位置付け 日付・時刻の文字列パース・整形を通じて、日時入力や表示に対応する基礎を確立する。
コマ主題細目 ① インスタンス生成(new)と参照変数 ② フィールドアクセス(ドット演算子)と標準出力 ③ フィールドの既定初期値の確認とメソッド化
細目レベル ① 前回作成した クラス を実体化する。クラス名 インスタンス名A = new クラス名(); クラス名 インスタンス名B = new クラス名(); のように new でヒープ上にインスタンスを生成し、参照変数にアドレス(参照)を受け取って扱うことを理解する。ここで大切なのは、同一設計図から状態の異なる個体を複数作れるというオブジェクトの本質である。
② フィールドアクセスはドット演算子で行い、値を代入し、System.out.println(インスタンス名.フィールド名1 + "(" + インスタンス名.フィールド名2 + ")"); で表示する。代入前後で出力を比べ、プログラムの実行順序(宣言→生成→代入→参照)を意識して追跡する。文字列連結や括弧の使い方もここで確認する。
③ 初期値の確認では、参照型フィールドは既定で null、プリミティブ型は 0 等になることを実行結果で観察する。未設定のまま使うと null がそのまま出力されたり、将来は NullPointerException の原因になり得るため、初期化の習慣化が重要である。
キーワード ① インスタンス生成(new) ② 参照変数 ③ ドット演算子 ④ フィールド初期値
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 指示されたクラス からインスタンスを2つ生成し、それぞれのフィールドを設定して出力。表示差から初期値の性質を80–120字で説明する。(クラスの仕様は授業資料で配布する)
10 クラス定義演習(演習) 科目の中での位置付け 多彩なフォーマット指定を使い分け、システムログやUI表示に適した日付・時刻の出力を行えるようにする。
コマ主題細目 ① クラスとオブジェクトの関係 ② クラスの基本的な構成要素(フィールド:データ) ③ クラスとインスタンスの違いと役割
細目レベル ① オブジェクト指向におけるオブジェクトは、現実や概念をプログラム上で表した「個体」である。その設計図がクラスで、クラスは同じ構造をもつ多数の個体を生み出すための型を提供する。本授業では実体生成は扱わないが、以後の学習で混同しないために「クラス=設計図」「オブジェクト(インスタンス)=実体」という対応を明確に頭へ刻む。ここまでの演習で見たとおり、クラスを先に設計しておくと、後で多様な個体(色・名前・在庫数などの違い)を同一の枠組みで扱えることが最大の利点である。

「設計の列挙」
題材を1つ選び(例:Food/Shape)、クラス名とフィールド3つ以上を箇条書きで示せ(各フィールドは型・名称・一言理由を付す)。

② 本回はフィールド(データ)のみ扱う。フィールドは「そのクラスが恒常的にもつ情報」で、宣言は 型 名称;。例として商品なら「名前(String)・価格(int あるいは double)・在庫数(int)・バーコード(String)」、図形なら「色(String)・半径や辺の長さ(数値型)・塗りつぶし有無(boolean)」が候補になる。重要なのは、(1)何を表す情報かを言語化し、(2)適切な型を選び、(3)命名を lowerCamelCase で一貫させること。型は大きくプリミティブ型(int,double,boolean など)と参照型(String などのクラス型)に分かれ、既定初期値はプリミティブが 0/false、参照型が null になる点を押さえる(生成時の話だが、設計段階で念頭に置く)。単位や範囲(例:価格は0以上、長さは正)などの制約も、フィールド設計の段階でメモしておくと後の実装が楽になる。

「クラス骨子の作成」
①を基に、public class クラス名 { ... } にフィールド宣言のみを書いた .java を作成し、javac でコンパイル成功の証跡を添付せよ。

③ クラスとインスタンスの違いは次のように整理する。クラスは「共通の項目名と型」を定義する設計図、インスタンスはその枠に具体的な値が入った実体。設計の練習では、まだ値は入れないので「どのような項目が必要か/どの型がふさわしいか」に集中する。今回の演習は、題材(食品・図形など)を決め、フィールドを最低3つ列挙し、型選択の理由を短く添える。さらに、命名の一貫性(英語・読みやすさ・省略乱用の回避)と、将来の拡張性(例:価格は小数対応が必要か)の観点で自己チェックし、設計根拠を言語化して提出する。メソッドは次回以降に扱うため、本回では記述しない。

「誤りの発見と修正」
配布された誤り入りのクラス定義(フィールドのみ)を読み、問題点を列挙してから正しい定義に書き直せ(命名・型・セミコロン・重複定義などを是正)。

キーワード ① クラスとオブジェクト ② フィールド(データ) ③ メソッド(処理) ④ インスタンス(設計図と実体)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 クラスを定義し、フィールドを用意。newでインスタンス生成、値を設定してSystem.out.printlnで確認。命名規約を守り、コンパイルが通ることを確認する。(クラスの仕様は授業資料で配布する)
11 メソッドの定義と引数 科目の中での位置付け 日付・時刻演算(加減算や比較)を学び、期限管理やスケジューリングなどで活用できる計算ロジックを獲得する。
コマ主題細目 ① メソッドの役割の基本構文 ② シグネチャ(戻り値型・名前・仮引数) ③ 呼び出しの流れと引数の一致
細目レベル ① メソッドは「まとまった手順に名前を与え、いつでも同じ契約で呼び出せる」単位です。重複を1か所へ集約し、変更時の影響範囲を限定します。例としてvoid printBanner()は区切り線表示、int add(int a,int b)は2数の和を返す契約です。何を返し、何を受け取り、何をするかを宣言で明示することが最初の一歩で、mainからは1行の呼び出しで意図を表現できます。クラス内の責務を小さなメソッドに割るほど、テストや再利用が容易になります。
② シグネチャは「メソッド名+仮引数の並び」で、どの定義を選ぶかの鍵です。宣言形は「戻り値型 メソッド名(型 名, …)」。戻り値型は“返す値の型”という契約、仮引数は“受け取る材料の型と順序”という契約です。命名は動詞+目的(printTitle, addAll, setLevel)を推奨し、仮引数は自然な意味順(対象→条件→オプション)にします。同じ型が続く時こそ、短く意味の通る名前で誤用を防ぎます。読み手が迷わない宣言を心がけます。
③ 呼び出しの内部は「実引数評価→一致するシグネチャ解決→仮引数へ値受け渡し→本体実行→(あれば)return」です。ここで重要なのは型・個数・順序の完全一致。TextUtil.pad("A",5,''.'')はOKでも、順序を入れ替えるとコンパイル不可です。呼び出し側には型名を書かない点も強調します。宣言と呼び出しの整合を常に確認しましょう。
キーワード ① メソッド宣言 ② シグネチャ ③ 仮引数と実引数 ④ 戻り値型 ⑤ 再利用性
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 「シグネチャ設計」任意のクラスを1つ作成し、次の3種類のメソッドをそれぞれ1つずつ定義:
① 引数あり・戻り値なし ② 引数なし・戻り値あり ③ 引数あり・戻り値あり
それぞれを最低2回ずつ呼び出すmainを作成(引数の型・個数・順序の一致を確認できる例にする)。
提出物:ソース一式+「どのシグネチャにしたか/なぜその順序にしたか」の短い説明(150–200字)。
予習:次回の内容を読み、入力を受け取らずに実行できる処理を3つ挙げて、結果が画面出力か内部状態かを一言で整理してください。計算と表示を分ける利点を自分の言葉で1~2文にまとめておく。

12 引数も戻り値もないメソッド 科目の中での位置付け 総合演習で日時処理を一通り試し、入力やデータ連携での日付操作をスムーズに組み込む力を身につける。
コマ主題細目 ① voidメソッド(引数なし)の用途 ② 副作用とスコープ ③ 設計上の注意(可観測性と凝集性)
細目レベル ① 引数も戻り値もないメソッドは、外部から材料を受け取らず、結果を値で返さない代わりに副作用で効果を出します。代表例はConsoleHelper.printBanner()のような固定出力、State.reset()のような内部状態初期化です。呼び出しは1行で統一可能になり、複数箇所に散らばる出力や初期化コードを一括管理できます。まずは「表示・初期化・通知」など副作用が主の処理を切り出して体験します。「副作用(side effect)」とは、メソッドの実行によって、プログラムの外部または状態に変化をもたらす処理を意味します。
② 値を返さないため、確認は画面出力・ログ・状態の変化に依存します。ここでスコープを整理します。メソッド内のローカル変数は終了とともに破棄され外から見えませんが、フィールドはオブジェクト状態として継続します。reset()のようなvoidはこの状態を変更しがちなので、初期値を定数化し、変更後に検証できるAPI(boolean isInitialized())を別途用意するとテストしやすくなります。※「API(エーピーアイ)」とは、「外部から利用可能なメソッド(関数)」のことです。

出力は標準出力とロガーを混在させず出力先を統一し、観測可能性を高めます。「観測可能性」とは、ソフトウェア設計における重要な概念で、「ある処理や内部状態の変化を、外部からどれだけ明確に観測・確認できるか」を指します。「voidメソッド」=戻り値がないメソッド をテーマにしています。戻り値がないため、処理が成功したか、想定通りに動作したかを外から確認する手段が限られます。そこで観測可能性の確保が重要になるのです。

③ 落とし穴は「なんでもvoidに詰める」こと。計算と表示を混在させると再利用性とテスト性が下がります。原則はI/Oと計算の分離:計算は戻り値で返し、表示は上位で行う。将来的に可変表示にしたいなら、固定文字列をprintBanner(String title)のように引数化する余地を検討します。さらに、voidメソッドの粒度は小さく保ち、名前で副作用が想像できる(print/reset/clear/logなど)ようにして凝集度を維持します。「凝集度」とは、1つのメソッドやクラスがどれだけ単一の目的に集中しているかを示すソフトウェア設計の概念です。高凝集(high cohesion)は、メソッドの中の処理が密接に関連し、1つの責務にまとまっている状態を指します。一方、低凝集(low cohesion)は、処理がバラバラで複数の目的を混在させている状態です。
キーワード ① void ② 副作用 ③ 凝集度 ④ 観測可能性 ⑤ スコープ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 「副作用の設計」
 任意のクラスに内部状態を2–3項目もたせ、引数なし・戻り値なしのメソッドを1つ実装。
 役割は「固定メッセージの出力」または「内部状態の初期化」のいずれか。
 状態が変化したことを観測できる仕組み(ゲッターやフラグの表示など)を用意し、mainで呼び出し前後を比較。
 提出物:ソース一式+「副作用の範囲/観測方法/今後引数化するなら何を渡すか」のメモ(150字程度)。
予習:次回の内容を読み、身近な“1つの値を設定・変更する場面”を3例書き出し、各例に妥当な範囲や禁止値を添えてください。フィールド名と引数名が衝突しない命名の工夫を一文で説明できるよう準備する。

13 引数だけを持つメソッド(単一) 科目の中での位置付け ユーザーからの入力(Scannerなど)をハンドリングし、対話型プログラムの基礎を固める。
コマ主題細目 ① 単一引数メソッドのねらい ② 値渡しと名前の衝突(thisの活用) ③ 単一引数+軽い検証
細目レベル ① 引数1つの設計は、責務が明確で誤用されにくいのが利点です。例:void setLevel(int level)は内部levelを更新、void log(String message)は渡された文を記録、void seed(long seed)は乱数の種を設定。呼び出し側は「何を渡せば何が起こるか」を一読で理解できます。特に状態変更系は副作用が避けられないため、1変更=1メソッドで影響範囲を把握しやすくします。責務とはメソッドが 「何をするメソッドか」=責務 ということであり、シンプルな引数設計により責務が明確に伝わります。
② Javaの引数は値渡しです。setLevel(5)の5は仮引数にコピーされ、メソッド終了で破棄されます。フィールド名と同名の仮引数を使う場合はthis.level = level;と書いてシャドーイングを解消します。読みやすさのため、引数名は短く意味の通る語(ms, width, labelなど)を選び、必要に応じて単位・範囲をJavadocで明示します。
③ 受け取った値には軽いバリデーションを入れて不正状態を防ぎます。たとえば0<=level<=10の範囲に収める、空文字は禁止、負数を補正する等。初学段階では例外ではなく「補正+警告ログ」も実務的選択肢です。失敗時の方針を一貫させる(補正する/無視する/デフォルトに戻す)ことで、呼び出し側は挙動を予測できます。検証は「入口で早く・小さく」を合言葉に、テストケースを作りやすい形にしましょう。※「バリデーション(validation)」とは、入力された値やデータが、あらかじめ決められた条件やルールに合っているかどうかを確認・検証することです。
キーワード ① 単一引数 ② 値渡し ③ this ④ シャドーイング ⑤ バリデーション
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 単一引数+検証
 任意のクラスに数値または文字列の1項目の設定用メソッドを作成(引数は1つ、戻り値なし)。
 受け取る値に軽いバリデーションを実装(範囲・空文字・nullなどから適切に防御/補正)。
 正常/境界/不正の少なくとも3ケースをmainで試し、失敗時の方針(補正・拒否・既定値)を統一。
 提出物:ソース一式+テスト実行結果のスクリーンショット(またはログ)+方針説明(100–150字)。
予習:次回の内容を読み読み、2~3要素を同時に渡す状況を2例挙げ、自然な並び順(対象→条件→装飾など)を決めて理由を一文で書いてください。固定値→変数→反復の呼び出し手順を自分用チェックリストにする。

14 引数だけを持つメソッド(複数) 科目の中での位置付け クラスの構成要素を把握し、オブジェクト指向の基礎となるフィールド・メソッド設計を再確認する。
コマ主題細目 ① 複数引数の定義と順序 ② 一括設定と可読性の確保 ③ 複数引数の練習
細目レベル ① 複数の材料を同時に渡すときは、型・個数・順序の完全一致が必須です。特に同じ型が続くと可読性と安全性が低下しやすいので、引数は意味の自然な順(対象→条件→オプションなど)に並べ、呼び出し側でも自己文書化された変数名を用いて意図を明確にします。Javaには名前付き引数がないため、位置=意味という前提で設計・レビューを行うことが重要です。コメントではなく宣言そのもので伝わるように、短く一貫した命名と順序設計を心掛けます。
② 複数引数は強力ですが、増えるほど理解負荷が上がります。可読性を保つために(a)よく使う組み合わせは一括設定メソッドでまとめて提供する、(b)意味の塊は小さな型に束ねて引数を減らす、(c)呼び出し側で定数を用いてマジックナンバーを追放する、といった対策が有効です。まずは3つ程度までに抑えることを目安にし、どうしても増える場合は呼び出しを段階に分割(準備→適用→仕上げ)するなど、読み手が追いやすい形に分解します。これにより誤読や順序ミスを未然に防ぎ、後からの差し替え(引数の追加・削除)にも耐えやすくなります。※「マジックナンバー(magic number)」とは、意味や目的が明示されていない「生(なま)の数値リテラル」のことを指します。
キーワード ① 複数引数 ② 引数順序 ③ 一括設定 ④ 反復呼び出し ⑤ マジックナンバー
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習:新規作成タスク(複数引数の練習)
 任意のクラスに、意味の異なる2~3引数を受け取って何らかの処理を行うメソッドを1つ実装(戻り値の有無は任意)。
 呼び出し側で、(A)固定値で3回、(B)変数を使って3回、(C)配列+ループで5回以上、の合計11回以上呼び出す。
 すべての呼び出しで同じ形式の出力を行い、入力と結果の対応が一目で分かる簡易の呼び出し表を画面に出す。
 提出物:ソース一式+実行結果。レポートには「引数の並び順をこう決めた理由」「反復で気づいた不具合や学び」を150~200字で記述。
 注記:クラス名・メソッド名・フィールド名などの具体名は任意(指示しません)。
予習:「戻り値」の導入を読み、値を返す形に分けられそうな処理を2~3個選び、返す型と使い道を1行ずつ整理してください。戻り値の受け取り方(代入/式中/別メソッドの引数)を一言ずつ説明できるようにする。

15 戻り値を持つメソッド 科目の中での位置付け new演算子とオブジェクト生成

コマ主題細目 ① returnと型の契約 ② 計算系や判定系、生成系の戻り値 ③ 戻り値の受け取り方
細目レベル ① 戻り値は処理結果を呼び出し側へ返す仕組みで、宣言の戻り値型とreturn値の型は一致しなければなりません。int sum(int a,int b)、boolean isEmpty(String s)、String repeat(String s,int n)などが典型です。void以外では全経路でreturnに到達する必要があり、条件分岐では見落としに注意します。戻り値を設計することは、メソッドの公開する成果を設計することでもあります。
② メソッドは用途別に捉えると整理しやすいです。計算系:NumberUtil.clamp(int v,int min,int max)は値を範囲に収めて返す。判定系:boolean inRange(int v,int min,int max)は条件の真偽を返す。生成系:String join(String sep,String... parts)は新しい文字列を作って返す。これらは副作用を持たない(入力だけで結果が決まる)ため、テスト容易性が高く、mainの読みやすさにも貢献します。副作用が必要な場面でも、計算は戻り値、表示は上位の原則を意識します。
③ 返ってきた値は(a)変数へ代入して後で使う、(b)式中で直接使う、(c)別メソッドの実引数として再利用する、の3パターンが基本です。例:int w = clamp(readWidth(),1,120); System.out.println(TextUtil.padLeft("OK", w)); のように、小さな戻り値メソッドを合成すると、mainは「物語(意図)」だけを書けます。戻り値を無視して“捨て呼び”するのはバグの温床なので、必ず使い切る習慣を持ちましょう。
キーワード ① return ② 型の契約 ③ 計算系/判定系/生成系 ④ 副作用最小 ⑤ 合成
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習:新規作成タスク(3種類の戻り値)
 同一のクラス内に、次の3種を各1つ実装:
  ① 計算系:数値を入力して加工した数値を返す
  ② 判定系:入力から真偽値を返す
  ③ 生成系:入力から新しい文字列または配列を返す
 mainで3メソッドを合成して利用(例:判定→条件分岐→生成の結果を出力、など)。
 提出物:ソース一式+「戻り値を捨てない設計上の工夫」の振り返り(120–180字)。
予習:小さなテーマを1つ決め、生成→初期化→加工→表示→集計の流れを3~5行で書き、どこで戻り値を使い、どこで出力するかを区別して示してください。読みやすい出力形式を一つ選び、その理由を一文でまとめます。

16 メソッド総まとめ 科目の中での位置付け フィールド定義・初期値設定を中心に、データ管理とクラス設計の重要性を習得する。
コマ主題細目 ① ドメインに依存しない構成 ② mainの呼び出し設計 ③ 設計指針と命名・粒度・副作用・検証
細目レベル ① ソフトウェアの構成を考える際には、特定の業務分野に縛られず、汎用的に使える最小限の構成を設計することが重要です。こうした「ドメインに依存しない」設計とは、特定の用途(たとえば教育、販売、医療など)に特化するのではなく、さまざまな場面で再利用できるような中立的な構造を意味します。

そのためには、処理やデータを「意味のかたまり」として適切に整理し、役割ごとに分担された小さな部品に分解しておくことが有効です。たとえば、設定処理、表示処理、数値の補正、文字列の整形、出力や集計など、それぞれが独立した役割(責務)を持つように設計すると、構成がシンプルになり、変更の影響も局所的に抑えられます。

さらに、数値や文字列などの処理には補助的なユーティリティ機能を用意し、メインの処理ロジックから切り離すことで、可読性や再利用性が向上します。値の制限や整形など、よくある共通処理を個別のクラスやメソッドにまとめておくことで、同じ機能を複数の場所で繰り返し使えるようになります。

このような構成にすることで、設計全体の見通しがよくなり、修正・拡張への対応が容易になります。結果として、システムの一部を他のプロジェクトや異なる用途に転用することも可能となり、保守性と柔軟性の高い設計が実現します。

② mainでは「生成→初期化→加工→表示→集計」の物語順に呼び出します。例:Entry e=new Entry(); e.init("SAMPLE",73); e.value=NumberUtil.clamp(e.value,0,100); ConsoleHelper.printBanner(); System.out.println(TextUtil.padLeft(e.label,8)+''=''+e.value);。配列Entry[]を用意し、Stats.average(...)等の戻り値メソッドで結果を得てから表示へ渡すと、I/Oと計算が自然に分離されます。mainは“手順の台本”、クラスは“役者の演技”という役割分担を意識します。
③ 指針の総括:(a)一処理一メソッドで粒度を揃える、(b)動詞+目的語で命名、(c)計算は戻り値で返し副作用を最小に、(d)引数は少数・意味順、必要ならオーバーロードで既定値を提供、(e)入口で検証して不正状態を早期に遮断、(f)ユーティリティ化で重複削減、(g)Javadocで契約を明示。これらを守ると、他課題へも持ち運べる汎用APIとして育ちます。
キーワード ① ドメイン ② 呼び出し設計 ③ 情報隠蔽 ④ 責務分割 ⑤ バリデーション方針
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 「小規模統合」
任意の小さなドメインを自分で設定し、1つのクラスに以下を揃える:
 引数なし・戻り値なし(副作用系)×1
 単一引数(検証あり)×1
 複数引数(オーバーロードあり)×1
 戻り値あり(計算/判定/生成のいずれか)×1
 mainでは「生成→初期化→加工→表示」の順で物語化し、I/Oと計算の分離を守る。
 提出物:ソース一式+自己評価(何を改善できるかを3点)。
予習:次回の内容を読み、thisが現在のインスタンスを指すことをまず押さえてください。次に、(1)フィールドと引数・ローカルが同名のときに衝突を避ける使い方、(2)同一クラス内のメソッドを呼ぶ際に対象を明示する使い方、(3)現在のインスタンスを他の処理へ渡す使い方――の3場面を身近な例で各1文ずつメモしすること。

17 Thisキーワード 科目の中での位置付け オブジェクト自身を参照するthisキーワードの仕組みを学ぶ。フィールドとローカル変数の衝突を解決し、正しく区別して扱えるようになることを理解する。また、thisを通じてオブジェクト内部の設計と外部利用の関係性を意識できるようにする。
コマ主題細目 ① Thisキーワード
細目レベル ① Javaにおけるthisキーワードは、オブジェクト自身を参照する特別な仕組みです。特に重要なのは、メソッドの引数やローカル変数とフィールド名が同じ場合に、インスタンスのフィールドを明示的に区別できる点です。例えばクラス内で 『int value;』というフィールドを持ち、メソッドの引数として同じ名前『value』を受け取った場合、そのまま代入を書くとローカル変数を参照してしまいます。このとき『this.value = value;』と書くことで、左側が「このオブジェクトのフィールド」であることを明確に示せます。また、thisは自分自身を参照するため、メソッドの中からthisを引数として別のメソッドに渡すことも可能です。これらの点から、this はクラス内で「オブジェクトの持つフィールドやメソッドを自分自身に結びつける」ための重要なキーワードであることを理解する。
キーワード ① Thisキーワード ② クラス ③ フィールド ④ メソッド ⑤ ローカル変数
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
フィールド名とローカル変数(またはメソッド引数)の名前が同じ場合、通常はローカル変数が優先して参照されます。このとき this を用いるとフィールドを明示的に指定できるため、プログラムの動作が変わることを学修した。演習で扱ったプログラムを用いて、this を使った場合と使わなかった場合でメソッドの処理結果にどのような違いが出るかを再度確認してください。

◆次回授業の予習
第18回の授業「メソッドのオーバーロード」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

18 メソッドのオーバーロード 科目の中での位置付け 同じ名前で複数のメソッドを定義できるオーバーロードの仕組みを理解する。引数の数や型に応じて処理を切り替えられることを体験することで、メソッド設計の柔軟性やコードの可読性が高まることを学ぶ。
コマ主題細目 ① 引数の個数によるオーバーロード ② 引数のデータ型によるオーバーロード
細目レベル ①  Java では、同じ名前のメソッドを複数定義できます。これをオーバーロードと呼びます。その際のメソッドの区別方法の一つが「引数の個数」です。たとえばメソッド『add(int a, int b)』では2つの整数を受け取りますが、『add(int a, int b, int c)』と定義すれば3つの整数を受け取る別のメソッドとして扱われます。呼び出し時に渡す引数の数が異なれば、コンパイラは対応するメソッドを自動的に選択します。この仕組みにより、同じ「処理の意味」を持つメソッドを、入力データの量に応じて柔軟に使い分けられるようになります。例えば計算処理や表示処理などを、2つでも3つでも呼び出せるように統一的に扱えるため、プログラムの可読性や利便性が向上します。
②  オーバーロードを区別するもう一つの方法は「引数のデータ型」です。同じメソッド名であっても、引数の型が異なれば別のメソッドとして定義できます。たとえば、メソッド『print(int x)』と『print(double x)』を用意すると、整数を渡せば前者が、実数を渡せば後者が呼び出されます。呼び出し時の引数の型に応じて、コンパイラが適切なメソッドを選択する仕組みです。この特徴を利用すると、異なる型のデータを扱う処理を統一的に「同じメソッド名」で書けるため、利用者は細かい型の違いを意識せずに使えます。ただし、似た型(例:int と long)では混乱を招く場合があるため、設計時にはどの型を受け付けるのかを意識してオーバーロードを行う必要があります。
キーワード ① メソッド ② 引数 ③ オーバーロード ④ データ型
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回学んだメソッドのオーバーロードについて、まず、引数の個数が異なるメソッドを同じ名前で定義し、呼び出すときに渡す引数の数によってどのメソッドが選ばれるかを確認してください。次に、引数のデータ型を変えたオーバーロードを作成し、整数や小数など異なる型を渡したときに正しく処理が切り替わるかを検証してみましょう。

◆次回授業の予習
第19回の授業「クラス定義と実行1」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

19 クラスの定義と実行1(演習) 科目の中での位置付け 仕様に基づいてクラスを定義し、オブジェクトを生成・利用する方法を学ぶ。具体的な演習プログラムの作成を通じて、クラスの構造や動作を理解する。ここまでのクラスの学修内容のまとめとして、オブジェクト指向設計の基礎を身につけ、実務に必要なプログラミングの流れを体験する。
コマ主題細目 ① クラスの定義と実行1
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「四則演算を行う電卓」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 加算、減算、乗算、除算のメソッドをもつCalculatorクラスを定義する」「2. メインメソッドでユーザから2つの整数の入力と1つの演算子の指定を受け取る処理をもつCalculatorAppクラスを定義する」「3. プログラムを実行すると、CalculatorAppクラスはCalculatorクラスのメソッドを呼び出す」「4. ユーザが入力した2つの整数と演算子に応じて計算が行われ、結果が画面に表示される」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。
キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第19回の授業では、四則演算とデータの入出力の2つの機能ごとにクラスを定義した電卓プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第20回の授業「クラスの定義と実行2」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

20 クラスの定義と実行2(演習) 科目の中での位置付け ここまでに学んできたクラスの知識を用いて、実務的なクラス実装の演習でその理解を深める。複数のクラスを連携させる演習プログラムを作成し、実際の開発で役立つモジュール化や分割設計の考え方を養う。
コマ主題細目 ① クラスの定義と実行2
細目レベル ① プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「商品の在庫管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 商品名、単価、在庫数のフィールドをもつProductクラスを定義する」「2. 商品情報の表示、在庫の販売(減少)、在庫の追加を行うメソッドをProductクラスに実装する」「3. メインメソッドの中で任意の商品(Productのインスタンス)を生成する、ProductAppクラスを定義する」「4. 生成したインスタンスに対して、Productクラスのメソッドを呼び出して在庫状況を操作し、結果を画面に表示する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。
キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第20回の授業では、商品情報と在庫の管理の2つの機能ごとにクラスを定義した商品の在庫管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第21回の授業「変数のスコープの種類」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

21 変数のスコープの種類 科目の中での位置付け フィールド、ローカル変数、ブロックといったスコープの違いを学ぶ。変数の有効範囲を意識することで、安全で読みやすいコード設計の重要性を理解する。スコープ管理を通じてプログラムの可読性や保守性を高める技術を習得する。
コマ主題細目 ① フィールドのスコープ ② ローカル変数のスコープ ③ ブロックのスコープ
細目レベル ①  変数のスコープとは、「その変数がコード内のどの範囲で有効に使えるか」を示す概念です。スコープが広いほど多くの場所から参照できますが、管理が難しくなる側面もあります。その中で フィールドは、クラス内に定義される変数であり、クラス全体から参照できるスコープを持ちます。インスタンスフィールドの場合は、生成されたオブジェクトごとに値が保持され、オブジェクトが存在する限り利用可能です。例えば 『class Student { String name; }』と書けば、変数name はクラス内のどのメソッドからも参照できます。フィールドはオブジェクトの「状態」を表現するために重要ですが、範囲が広いため意図せぬ変更が起きる危険もある。これらの点について、実際にコードを書くことで理解する。
②  ローカル変数は、メソッド内やコンストラクタ内で宣言される変数で、宣言されたメソッド内のみで有効なスコープを持ちます。たとえば『void greet() { String msg = "Hello"; ... }』のように書いた場合、変数msgは greet メソッドの処理が行われている間だけ存在し、他のメソッドからは参照できません。メソッドの処理が終わるとローカル変数は自動的に破棄されるため、メモリ効率が良く、一時的な計算やデータ保持に向いています。フィールドと違い、状態を長期間保持しないため、プログラムの構造を分かりやすくする効果もあります。ただし、同じ名前のローカル変数は異なるメソッドで独立して存在するため、変数のスコープを意識して名前付けを工夫することが重要です。
③  ブロックのスコープとは、中括弧 {} で囲まれた範囲内で有効な変数のスコープを指します。例えば if 文や for 文の中で変数を宣言すると、その変数はブロックの外から参照することはできません。『for (int i = 0; i < 5; i++) { ... }』のように書いた場合、変数 i はループの中だけで利用可能で、ループを抜けると使えなくなります。この仕組みにより、同じメソッド内でも局所的に変数を宣言し、不要な影響を避けることができます。スコープを狭く保つことは、コードの見通しを良くし、予期せぬ変数の上書きを防ぐために有効です。ただし、同じメソッド内でスコープが異なる変数を同じ名前で宣言すると混乱を招く可能性があるため、ブロックごとの変数名の使い方には注意が必要です。実際にコードを書き、正しいスコープ内の参照が行われていなければコンパイルができないことを確認します。
キーワード ① スコープ ② クラス ③ フィールド ④ ローカル変数 ⑤ ブロック
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第21回の授業では、変数のスコープの種類について学修した。復習として、演習課題として配布したプログラムを用いて、再度参照の関係とプログラムの挙動の違いを確認する。また、同じ名前の変数を異なるスコープで宣言したプログラムを作成し、その挙動を観察することで、スコープの広さと変数管理のしやすさの関係を整理しましょう。

◆次回授業の予習
第22回の授業「コンストラクターの基本」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

22 コンストラクターの基本 科目の中での位置付け オブジェクト生成時に自動的に呼び出されるコンストラクターの仕組みを理解する。生成と同時に適切な初期化を行うことで、堅牢なプログラム設計が可能になることを学ぶ。
コマ主題細目 ① コンストラクター
細目レベル ①  コンストラクターとは、クラスからオブジェクトを生成するときに自動的に呼び出される特別なメソッドです。その主な役割は、オブジェクトのフィールドを初期化したり、生成時に必要な処理をまとめたりすることにあります。コンストラクタの名前はクラス名と同じになること、通常のメソッドと異なり戻り値の型を記述しないことが、大きな特徴です。たとえば『class Student { String name; Student(String n) { this.name = n; } }』と書くと、『new Student("Taro")』としてオブジェクトを生成した際に自動的にコンストラクターが実行され、フィールド name に "Taro" が代入されます。このように、コンストラクターを用いることでオブジェクト生成と同時に適切な初期化が行えるようになり、コードの見通しや信頼性の向上が可能になることを理解します。
キーワード ① クラス ② フィールド ③ インスタンス ④ コンスタラクター
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第22回の授業では、コンストラクターの使い方の初歩について学修した。復習として、演習で作成したプログラムを振り返り、コンストラクターに引数を渡すとどのようにフィールドが初期化されるかを実際に動作させて確かめましょう。また、通常のメソッドとの違いを整理し、コンストラクターを使う利点を自分の言葉でまとめてみてください。

◆次回授業の予習
第23回の授業「デフォルトコンストラクター」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

23 デフォルトコンストラクター 科目の中での位置付け コンストラクターを定義しない場合に自動生成されるデフォルトコンストラクターを理解する。引数なしでオブジェクトを生成できる仕組みや、自動生成が行われない条件を確認することで、クラス設計における初期化方法の選択肢と設計上の注意点を学ぶ。
コマ主題細目 ① デフォルトコンストラクター
細目レベル ① Java では、クラスに明示的なコンストラクターを定義しなかった場合、コンパイラが自動的に デフォルトコンストラクター を用意します。これは引数を持たず、特別な処理を行わないコンストラクターで、オブジェクト生成時に呼び出されます。たとえば『class Student { String name; }』のようにコンストラクターを書かなくても、『new Student()』としてオブジェクトを生成できるのは、デフォルトコンストラクターが自動的に作られるためです。ただし、プログラマが一つでもコンストラクターを定義した場合、デフォルトコンストラクターは自動生成されなくなります。そのため、引数つきのコンストラクターを作った場合にも、引数なしで生成できるようにしたいときは、自分でデフォルトコンストラクターを書き加える必要があります。これらの挙動の違いを、自分でコードを書くことで理解しましょう。
キーワード ① クラス ② フィールド ③ インスタンス ④ コンスタラクター
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第23回の授業では、デフォルトコンストラクターについて学修した。前回のコンストラクターの基本と合わせて、コンストラクターの基本的な挙動が理解できることが重要である。演習で作成したプログラムを使って、デフォルトコンストラクターがある場合とない場合でどのような挙動の違いがあるかを確認してみましょう。

◆次回授業の予習
第24回の授業「コンストラクターのオーバーロード」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

24 コンストラクターのオーバーロード 科目の中での位置付け 複数の引数パターンでコンストラクターを定義できる仕組みを学ぶ。引数の個数や型に応じてオブジェクトを柔軟に初期化できることを理解する。異なる利用場面に対応した設計を可能にし、クラスの利便性を高める意義を理解する。
コマ主題細目 ① コンストラクターのオーバーロード
細目レベル ①  Java では、通常のメソッドと同様に コンストラクターもオーバーロード することができます。これは「同じクラス名で、引数の個数や型が異なる複数のコンストラクターを定義できる」という仕組みです。例えば 『Student(String n)』は名前を指定して生成するコンストラクターですが、『Student(String n, int s)』を定義すれば、名前と点数を同時に初期化することも可能になります。オブジェクトを生成する際、渡された引数に応じて適切なコンストラクターが自動的に呼び分けられるため、開発者は目的に応じた生成方法を柔軟に選べます。これにより、同じクラスでも異なる初期化方法を統一的に扱えるようになり、クラスの利便性や表現力が向上します。コンストラクターのオーバーロードを使いこなすことで、オブジェクト設計に幅を持たせることができるようになることを理解することが目標です。
キーワード ① クラス ② フィールド ③ インスタンス ④ コンスタラクター ⑤ オーバーロード
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第24回の授業では、コンストラクターのオーバーロードについて学修した。クラスのインスタンスの生成時に、名前だけを指定して生成する場合と、名前と点数を同時に渡して生成する場合など、用途に応じて異なる初期化方法を用意できることが重要でした。プログラム実行時には、渡した引数の情報に基づいて適切なコンストラクターが自動的に呼び分けられます。演習で作成したクラスを使い、引数の違いによってどのコンストラクターが選ばれるかを再度確認してみましょう。さらに、オーバーロードを利用する利点を整理し、自分ならどんな場面で使えるか具体例を考えてみましょう。

◆次回授業の予習
第25回の授業「コンストラクターの定義と利用」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

25 コンスタラクターの定義と利用(演習) 科目の中での位置付け 演習課題を通じて、複数のコンストラクターを設計・利用する方法を学ぶ。与えられた仕様に基づいてクラスを実装し、意図した処理に応じてオブジェクトが初期化されるという、プログラムの動作の一連の流れを理解する。
コマ主題細目 ① コンストラクターの定義と利用
細目レベル ① プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「タスク管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 商品名、単価、在庫数のフィールドをもつProductクラスを定義する」「2. 商品情報の表示、在庫の販売(減少)、在庫の追加を行うメソッドをProductクラスに実装する」「3. メインメソッドの中で任意の商品(Productのインスタンス)を生成する、ProductAppクラスを定義する」「4. 生成したインスタンスに対して、Productクラスのメソッドを呼び出して在庫状況を操作し、結果を画面に表示する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。
キーワード ① クラス ② フィールド ③ インスタンス ④ コンスタラクター
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第25回の授業では、コンストラクターを活用したタスク管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第26回の授業「アクセス制御の考え方と修飾子の基本」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

26 アクセス制御の考え方と修飾子の基本 科目の中での位置付け アクセス修飾子を用いたアクセス制御の基本を理解する。情報隠蔽やカプセル化を通して、クラスを外部から保護する仕組みを学ぶ。この仕組みが、堅牢で変更に強いプログラム設計の基盤となることを理解する。
コマ主題細目 ① オブジェクトの堅牢性を高めるアクセス制御 ② アクセス修飾子による公開範囲の設定
細目レベル ①  プログラミング、特に複数人での開発や長期間にわたるシステムの保守を考えると、作成したクラス(オブジェクトの設計図)が意図しない形で利用されたり、不正な値に変更されたりするリスクを最小限に抑えることが極めて重要になります。これを実現するのが「アクセス制御」という考え方です。 アクセス制御とは、クラスの内部にあるフィールド(データ)やメソッド(処理)に対して、どこからのアクセスを許可するかを制限する機能です。

このアクセス制御を適切に行うことで、クラスの「内部」と、それを利用する「外部」を明確に分離できます。これを「情報隠蔽」と呼び、オブジェクト指向プログラミングにおける重要な概念である「カプセル化」の実現手段の一つです。 なぜ情報隠蔽が重要かというと、クラスの内部実装を自由に変更できるようになるからです。例えば、内部の計算方法をより効率的なものに変えたとしても、外部への公開部分(インターフェース)に変更がなければ、そのクラスを利用している他のプログラムに影響を与えることがありません。 このように、オブジェクトを外部の干渉から守り、安全で変更に強い(堅牢な)部品として扱えるようにすることが、アクセス制御の最大の目的です。

②  Javaでアクセス制御を実現するために用いるのが「アクセス修飾子」です。 これまで何気なく使ってきた public もその一つです。 アクセス修飾子には、主に以下の4つのレベルがあります。
(1) public: 最も制限が緩く、どのクラスからでもアクセス可能です。
(2) protected: 同じパッケージ内のクラスと、別のパッケージにあるサブクラス(継承関係にあるクラス)からアクセス可能です。
(3) 省略: 同じパッケージ内のクラスからのみアクセス可能です。
(4) private: 最も制限が厳しく、そのクラスの内部からしかアクセスできません。

実務における一般的な設計方針として、「フィールドは原則として private に、コンストラクタとメソッドは public にする」というものがあります。 これは、データ(フィールド)を外部から直接書き換えられないように保護し、定められた手続き(メソッド)を通してのみ操作を許可するためです。 これにより、オブジェクトの状態が不正になることを防ぎ、クラスの作成者が意図した通りの安全な利用を促すことができます。ただし、これは絶対的なルールではなく、プログラムの性質に応じて最適なアクセスレベルを選択する判断力がエンジニアには求められます。

キーワード ① アクセス制御 ② アクセス修飾子 ③ カプセル化 ④ 情報隠蔽
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第26回の授業では、アクセス修飾子を用いたアクセス制御について学修した。アクセス制御はクラス内部のフィールドやメソッドを外部から直接操作されないように守り、オブジェクトを堅牢に保つ仕組みであることが重要でした。復習として、演習課題として配布したプログラムを用いて、フィールドをprivateにした場合とpublicにした場合での、アクセスの挙動の違いを確認しましょう。また、なぜフィールドは原則 private にすべきなのか、自分の言葉で説明できるようにしておきましょう。


◆次回授業の予習
第27回の授業「フィールド保護とゲッタ・セッタ」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

27 フィールド保護とゲッタ・セッタ 科目の中での位置付け ゲッタ(getter)・セッタ(setter)を用いてフィールドを安全に操作する方法を学ぶ。入力値の検証や読み取り専用・書き込み専用の設計を通じて、情報隠蔽の実践を理解する。
コマ主題細目 ① ゲッタとセッタによるフィールドの保護と操作 ② 読み取り専用・書き込み専用の設計とカプセル化
細目レベル ①  フィールドを private にすると、クラスの外部から直接その値を読み書きできなくなります。 これでは不便な場面があるため、その解決策として「ゲッタ(getter)」と「セッタ(setter)」という専用のメソッドを用意します。

ゲッタ: private なフィールドの値を取得して外部に返すための public メソッドです。 一般的に getフィールド名() という名前になります。

セッタ: 外部から値を受け取り、それを private なフィールドに設定するための public メソッドです。 一般的に setフィールド名() という名前になります。

ゲッタとセッタを設ける最大の利点は、単にフィールドを読み書きさせるだけでなく、その過程で「追加の処理を挟める」ことです。 特にセッタでは、引数として渡された値が妥当であるかをチェックする処理(バリデーション)を実装できます。 例えば、年齢(age)をマイナスの値に設定できないようにしたり、名前(name)に空文字列が設定されるのを防いだりすることが可能です。 このように、ゲッタとセッタは private なフィールドへの安全なアクセス経路を提供し、オブジェクトの状態を常に正しく、整合性の取れたものに保つための重要な役割を担っています。

②  ゲッタとセッタは両方そろえて使うのが一般的ですが、状況によっては ゲッタ のみを用意して「読み取り専用」 にしたり、セッタ のみを用意して「書き込み専用」 にする設計も可能です。例えば社員番号や学籍番号などは外部から変更されるべきではないため ゲッタのみを公開し、逆にパスワードのように「外部から設定はできるが読み取りは許可しない」値についてはセッタ のみを公開する、という使い分けが実務で行われます。
こうした設計の背景にあるのが カプセル化(encapsulation) という考え方です。カプセル化とは、クラス内部のデータを直接公開せず、必要に応じて用意されたメソッドを通じて操作させることで、内部実装を外部から隠し、安全性と保守性を高める仕組みです。ゲッタとセッタの使い分けを通じて、情報隠蔽や堅牢なクラス設計といったオブジェクト指向の原則が実現されます。

キーワード ① アクセス制御 ② アクセス修飾子 ③ カプセル化 ④ 情報隠蔽 ⑤ ゲッタ (getter)、セッタ (setter)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第27回の授業では、ゲッタ(getter)とセッタ(setter)という特殊なメソッドを学修した。前回の名用も含めたアクセス修飾子の総復習課題として、商品(Product)を表すクラスを新しく作成し、以下の要件を満たすように実装してください。

(1)商品の価格(price)を保持するための int 型のフィールドを private で宣言する。
(2)price フィールドの値を外部から取得するための public なゲッタ(getPrice)を実装する。
(3)price フィールドに値を設定するための public なセッタ(setPrice)を実装する。
(4)セッタ内では、引数として渡された価格が0以上の場合のみ、フィールドに値を設定する。もし負の値が渡された場合は、価格を変更しないようにする。
(5)実装後、「なぜ価格フィールドを public にして直接操作させるのではなく、チェック機能を持つセッタを介する方が良いのか」その理由を説明してください。

◆次回授業の予習
第28回の授業「パッケージの役割とパッケージ宣言」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

28 パッケージの役割とパッケージ宣言 科目の中での位置付け パッケージを使って多数のクラスを体系的に整理する方法を学ぶことで、クラス管理を効率化し、大規模な開発に対応できる基礎を身につける。パッケージ宣言とフォルダ構造の対応関係を理解し、正しく利用できるようにする。
コマ主題細目 ① パッケージの概念と役割 ② クラスのパッケージ化とパッケージ宣言
細目レベル ①  Javaによるシステム開発、特に規模が大きくなるにつれて、作成するクラスの数は膨大になります。数百、数千というクラスを無秩序に作成すると、名前の衝突が発生したり、似たような機能を持つクラスがどこにあるのか分からなくなったりと、管理が非常に困難になります。この問題を解決するのが「パッケージ」という仕組みです。

パッケージとは、互いに関連性の高いクラス群を一つのグループとしてまとめるための機能です。 これは、コンピュータのファイルシステムにおける「フォルダ(ディレクトリ)」に似た概念だと考えると理解しやすいでしょう。 例えば、画面表示に関連するクラスはviewパッケージに、データアクセスに関するクラスはdaoパッケージに、といった具合に分類することで、クラスの役割が明確になり、コードの可読性やメンテナンス性が格段に向上します。

②  私たちが普段何気なく利用しているStringクラスやSystemクラスも、実はJavaが標準で提供しているjava.langというパッケージに所属しています。このように、Javaには便利な機能を持つクラスが予めパッケージとして整理されており、これらを「Java API (Application Programming Interface)」と呼びます。

それでは、自分たちが作成したクラスを特定のパッケージに所属させるにはどうすればよいのでしょうか。そのために用いるのが「パッケージ宣言」です。packageというキーワードに続けて所属させたいパッケージ名を記述し、その文をソースファイルの必ず先頭に置きます。たとえば、『package jp.ac.myuniversity.cis.ui;』と宣言した場合、そのソースファイルに記述されたクラスは、uiパッケージに所属することになります。この時、ソースファイルは宣言に対応したフォルダ構造、つまりルートとなるディレクトリから/jp/ac/myuniversity/cis/ui/という場所に配置する必要があります。このように、パッケージ宣言とフォルダ構造を一致させることが、Javaのコンパイラがクラスを正しく認識するための重要なルールであることを理解します。

キーワード ① クラス ② パッケージ ③ パッケージ宣言 ④ ルートディレクトリ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第28回の授業では、パッケージの概念と実際にクラスをパッケージ化するパッケージ宣言を学修した。復習として、自分で作成した任意のクラスのパッケージ化を行ってみましょう。このとき、複数の階層からなるディレクトリを構成し、ルートディレクトリを意識したパッケージ宣言を試してみましょう。コンパイルがうまくいかない場合は宣言したパッケージ名とフォルダ構造が一致していないので、エラーの原因を究明し、解決するところまでを反復して練習しましょう。

◆次回授業の予習
第29回の授業「パッケージの利用と設計」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

29 パッケージの利用と設計 科目の中での位置付け インポート宣言を使った他パッケージのクラス利用方法を学ぶ。命名規則や設計指針に基づくパッケージ管理の重要性を理解することで、チーム開発や実務において秩序あるコード構成を実現する方法を習得する。
コマ主題細目 ① 他のパッケージに所属するクラスの利用とインポート宣言 ② パッケージ命名規則と実務的な設計指針
細目レベル ①  異なるパッケージに所属するクラスを利用する場合、原則としてそのクラスの「完全修飾クラス名(Fully Qualified Class Name, FQCN)」、つまりパッケージ名を含んだ正式名称で指定する必要があります。たとえば、ken.testパッケージのPack1クラスを利用するには、『myname.test.Pack1 obj = new myname.test.Pack1();』のように記述します。

しかし、利用するクラスが増えるたびに、この長い完全修飾クラス名を記述するのは非常に煩雑です。 そこでJavaには、「インポート宣言」という便利な仕組みが用意されています。 ソースファイルのパッケージ宣言とクラス定義の間にimport文を記述することで、コンパイラに対して「これからこのクラスを使います」と予め知らせることができます。 たとえば『import myname.test.Pack1;』と宣言しておけば、コードの他の部分では単にPack1というクラス名だけでそのクラスを利用できるようになります。

インポートには、特定のクラスを一つだけ指定する方法と、『import myname.test.*;』のようにアスタリスク(*)を使い、指定したパッケージに含まれる全てのクラスを対象とする方法があります。 このimportを使いこなすことは、冗長な記述を減らし、クリーンで読みやすいコードを書くための必須スキルと言えるでしょう。

② パッケージを利用する上で欠かせないのが、命名規則です。たとえば、Java では原則としてパッケージ名をすべて小文字で記述し、複数の単語を連結する場合はドット(.)で区切ります。さらに、実務の世界では、パッケージ名は世界中で一意(ユニーク)になるように命名するのが鉄則となっています。これは、自分が作成したクラスが、世界中の誰かが作ったライブラリ(クラスの集合体)と偶然同じ名前になってしまい、予期せぬエラーを引き起こすのを防ぐためです。そのための一般的な慣習として、自身が所属する組織のインターネットドメイン名を逆順にして使う方法があります。たとえば、example.comというドメインならcom.exampleというパッケージ名から始めることで、グローバルな一意性を担保します。

また、パッケージは単なる名前の集まりではなく、システム設計の単位として利用されます。画面表示関連を ui パッケージに、データ処理関連を dao パッケージに、共通処理を util パッケージに、といった具合に分類することで、役割が明確になりコードの見通しが向上します。適切な命名規則と設計方針に基づいたパッケージ管理は、規模の大きな開発において秩序と保守性を維持するための必須のスキルです。

キーワード ① クラス ② パッケージ ③ パッケージ宣言 ④ インポート宣言 ⑤ 完全クラス名(FQCN)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第29回の授業では、より実践的なパッケージの利用とインポート宣言について学修した。前回の内容も含めたパッケージについての総復習として、package宣言とimport宣言の役割と、それぞれの記述ルールについて説明してみましょう。また、なぜ大規模な開発ではパッケージが不可欠となるのか、その理由を考察してください。

◆次回授業の予習
第30回の授業「クラスメソッドとクラスフィールドの役割と定義」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

30 クラスメソッドとクラスフィールドの役割と定義 科目の中での位置付け インスタンスとクラスの違いを整理し、static修飾子を用いたクラスメンバーを理解する。プログラムにおける個別と共有の情報を適切に扱う方法を学ぶ。設計判断の基準を習得することで、現実のシステム設計に応用できる知識を身につける。
コマ主題細目 ① インスタンスメンバーとクラスメンバー(static)の概念的区別 ② staticメンバーを用いたクラス全体の情報管理
細目レベル ①  これまでの学習で、私たちはクラスから生成される個々の「インスタンス」が、それぞれ固有の状態(データ)を持つことを学んできました。その状態を保持するのが「インスタンス変数(フィールド)」であり、そのインスタンスを操作するのが「インスタンスメソッド」です。業務システム開発の世界で例えるなら、「従業員(Employee)」クラスから生成された「Aさん」と「Bさん」という2つのインスタンスは、employeeId(従業員ID)やdepartment(所属部署)といったインスタンス変数にそれぞれ異なる値を持ちます。


ここでは、このインスタンス単位の考え方に加え、クラスそのものに属するメンバーという新しい概念を学びます。それがstatic(スタティック)修飾子によって定義される「クラス変数」と「クラスメソッド」です。 これらは「staticメンバー」とも呼ばれます。

インスタンスメンバーが個々のオブジェクトの状態や振る舞いを定義するのに対し、staticメンバーは全てのインスタンスで共有される情報や、特定のインスタンスに依存しない機能を定義するために使用されます。 例えば、従業員全員に共通の「会社名(companyName)」や、システム全体で統一された「消費税率(TAX_RATE)」といった値は、static変数として管理するのが適切です。ITエンジニアの実務において、このstaticの概念を正しく理解し、インスタンスメンバーと的確に使い分けることは、堅牢で保守性の高いシステムを構築するための基盤となります。

②  staticメンバーが業務システムでどのように活用されるか、具体的なコードを想定して理解を深めます。授業資料にある「インスタンスの総数をカウントする」例を応用し、 「従業員(Employee)」インスタンスが生成されるたびに、その総数をカウントするという機能を考えます。

この「従業員の総数」という情報は、個々の従業員インスタンスが持つべきではなく、Employeeクラス全体で管理すべき情報です。 そこで、static修飾子を付けたクラス変数employeeCountを用意します。 この変数は、特定のインスタンスに紐づくのではなく、クラスにただ一つだけ存在する共有の変数となります。そして、新しい従業員インスタンスがコンストラクタで生成されるたびに、この共有カウンターを1ずつ加算していきます。

さらに、このクラス全体で共有している「従業員の総数」を出力するためのstaticなクラスメソッドprintEmployeeCountを実装します。

staticメソッドは、クラス名.メソッド名()という形式で、インスタンスを生成することなく直接呼び出すことができます。 これは、Javaプログラムを実行する際のエントリーポイントであるmainメソッドが、なぜpublic static voidと宣言されているのか、という根源的な問いに答える鍵となります。

staticなコンテキストとインスタンスのコンテキストの違いを意識することが、オブジェクト指向プログラミングをマスターする上で極めて重要です。

キーワード ① static修飾子 ② クラス変数 (static変数) ③ クラスメソッド (staticメソッド)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第30回の授業では、インスタンスメンバーやstaticメンバーの観点からクラスメソッドとクラスフィールドについて学修した。復習課題として、業務システムで扱う「商品(Product)」クラスを想定してみてください。このクラスには、個々の商品の情報(商品ID、商品名、価格など)と、全ての்商品に共通の情報(現在の消費税率など)が必要です。

このシナリオに基づき、以下の2つの違いについて、それぞれの具体的な利用シーンをコード例で示しながら説明できるように準備してください。
① インスタンス変数とクラス変数(static変数)の違い: 「価格(price)」と「消費税率(taxRate)」は、それぞれどちらで定義すべきか。その理由は何か。
② インスタンスメソッドとクラスメソッド(staticメソッド)の違い: 「税込価格を計算する機能」と「消費税率を変更する機能」は、それぞれどちらで実装すべきか。その理由は何か。

◆次回授業の予習
第31回の授業「クラスの特殊な初期化処理(初期化子)」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

31 クラスの特殊な初期化処理(初期化子) 科目の中での位置付け static初期化子とインスタンス初期化子の役割を理解する。コンストラクターでは補えない初期化処理の方法と実行順序を学ぶ。コードの重複を防ぎ、システムのライフサイクルを制御するための基礎を身につける。
コマ主題細目 ① static初期化子 ② インスタンス初期化子
細目レベル ①  システムでは、インスタンス生成時のコンストラクタによる初期化に加え、より特殊なタイミングで実行される初期化処理が求められることがあります。そのために「初期化子(イニシャライザ)」が存在します。

一つは「static初期化子」で、static { ... }というブロックで記述します。 これは、そのクラスがJVM(Java仮想マシン)に初めてロードされた時に一度だけ実行される処理です。 実務では、システム起動時に外部の設定ファイル(例: config.properties)から、データベース接続情報や、アプリケーション全体の動作モード、あるいは全社共通の定数(会社名など)を読み込み、static変数に設定する、といった用途で頻繁に利用されます。

②  初期化子にはもう一種類あり、「インスタンス初期化子」で、{ ... }というブロックで記述します。 これは、インスタンスが生成されるたびに、コンストラクタが実行される直前に必ず実行されます。 複数のコンストラクタ(オーバーロードされたコンストラクタ)で共通して行いたい初期化処理、例えば、インスタンス生成のログを記録したり、共通のデフォルト値を設定したりする処理をまとめることで、コードの重複を避け、保守性を高めるために活用されます。

これらの初期化子が実行される厳密な順序(static初期化子 → インスタンス初期化子 → コンストラクタ)を正確に把握することは、システムのライフサイクルを制御し、潜在的なバグを防ぐために不可欠な知識です。

キーワード ① static修飾子 ② クラス変数 (static変数) ③ クラスメソッド (staticメソッド) ④ static初期化子 ⑤ インスタンス初期化子
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第31回の授業では、インスタンスの生成時の挙動の制御に重要な初期化子について学修した。演習で作成したプログラムを振り返り、static初期化子とインスタンス初期化子がどのタイミングで実行されるかを出力結果から再度確認してください。また、なぜこれらを使うとコードの重複やバグを防げるのか、自分の言葉で整理してみましょう。

◆次回授業の予習
第32回の授業「引数の様々な記法」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

32 引数の様々な記法 科目の中での位置付け 参照型引数と可変長引数の特徴と注意点を学ぶ。引数の挙動を理解し、設計上の安全性や柔軟性を考慮できるようにすることで、API設計や実務での引数設計に役立つ基礎知識を獲得する。
コマ主題細目 ① 参照型引数とその注意点 ② 可変長引数
細目レベル ①  Javaでは、メソッドに引数を渡すときはすべて「値渡し」ですが、参照型の引数では「オブジェクトの参照」が渡されます。そのため、メソッド内で引数を使ってオブジェクトのフィールドを変更すると、呼び出し元のオブジェクトにも影響が及びます。一方で、引数の参照変数に新しいオブジェクトを代入しても呼び出し元には反映されません。これが参照型引数の特徴であり、誤ってオブジェクトの状態を意図せず変更してしまう危険性もあるため注意が必要です。安全に利用するためには、値を直接変更せずコピーを使う、あるいは設計段階でフィールドを保護する(private化+setter制御など)工夫が求められることを確認します。
②  可変長引数は、メソッドに渡す引数の数が呼び出し時点で可変であることを可能にする記法です。宣言は 型... 変数名 と書き、呼び出し側は引数を1つでも複数でも自由に指定できます。内部的には配列として扱われるため、メソッドの中では通常の配列と同じように要素へアクセスできます。たとえば 『printNames(String... names)』とすれば、『printNames("Alice")』や『printNames("Alice","Bob","Carol")』の両方が可能になります。可変長引数の注意点として、呼び出し元から既存の配列を渡した場合はその内容が変更されると呼び出し元にも影響する一方、リテラルで渡した場合は新しい配列が生成されるため副作用は起きません。可変長引数は、柔軟なAPI設計を実現する便利な仕組みであることを、理解するのが目標です。
キーワード ① メソッド ② 参照型引数 ③ 可変長引数 ④ オーバーロード
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第32回の授業では、可変長引数のような新しい引数の記法について学修した。可変長引数は 「型... 変数名」 で宣言でき、引数の数を自由に指定できる便利な仕組みです。内部的には配列として扱われ、呼び出し側から既存の配列を渡した場合は中身の変更が呼び出し元に影響するという点が重要でした。参照型変数の場合も、同様の注意点がありました。演習プログラムをあらためて実行し、参照型引数と可変長引数がどのように動作しているか、再確認しましょう。

◆次回授業の予習
第33回の授業「クラス設計と実装1」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

33 クラス設計と実装1(演習) 科目の中での位置付け ここまでで学んできたオブジェクト指向の知識をもとに、具体的な仕様に基づいてクラスを設計・実装する演習を行う。実務的なプログラム開発の流れを体験することで、クラスの構造を意識した設計力を養い、オブジェクト指向の基本を理解する。
コマ主題細目 ① クラス設計と実装1
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「カフェの注文管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 名前・サイズ・価格の情報をもつ Drink クラスを定義し、コンストラクタや情報を表示するメソッドを作成する。」「2. 小計の計算、割引や税込金額の計算を行う OrderUtil クラスを定義し、必要なメソッドを実装する。」「3. ユーザからドリンク名とサイズを2つ分入力させ、割引率と税率も指定させる処理をもつ CafeApp クラスを定義する。」「4. プログラムを実行すると、CafeApp クラスが OrderUtil クラスのメソッドを呼び出し、入力に応じた合計金額やレシートを画面に表示する。」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。
キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第33回の授業では、クラスの設計を意識したカフェの注文管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第34回の授業「クラス設計と実装2」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

34 クラス設計と実装2(演習) 科目の中での位置付け ここまでで学んできたオブジェクト指向の知識をもとに、具体的な仕様に基づいてクラスを設計・実装する演習を行う。複数のメソッドを持つクラスを実装し、インスタンスの挙動を通じてオブジェクトの動作をモデル化する方法を学ぶ。実践的な設計演習を通じて、より高度なオブジェクト指向設計を身につける。
コマ主題細目 ① クラス設計と実装2
細目レベル ① プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「RPGゲームの戦闘時のキャラクター管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 名前・HP・攻撃力の情報をもつ GameCharacter クラスを定義し、コンストラクタや攻撃・回復・ステータス表示の各メソッドを作成する」「2. Main クラスを定義し、2体の GameCharacter インスタンスを生成して初期ステータスを表示する処理を用意する」「3. プログラムを実行すると、Main クラスが GameCharacter の攻撃・回復メソッドをターンごとに呼び出し、HPの増減や撃破(HPが0以下)の判定を行う」「4. 各ターンの行動結果と最終的な勝敗(または終了時点のステータス)が画面に表示される」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。
キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第34回の授業では、RPGゲームの戦闘時のキャラクター管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第35回の授業「機能実装1」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

35 機能実装1(演習) 科目の中での位置付け オブジェクト指向設計に基づき、クラスの定義と基本的な機能実装を行う力を養う。演習を通してデータと振る舞いを結びつけて表現する方法を理解することで、プログラムの拡張性や再利用性を高める基礎を習得する。
コマ主題細目 ① 機能実装1
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「学生の成績管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 学生を表すStudentクラスを作成し、名前・学籍番号・点数をフィールドとして定義する」「2. Studentクラスに合計点や平均点を計算するメソッドと、成績を整形して表示するメソッドを実装する」「3. 複数のStudentインスタンスを生成し、配列に格納して管理できるようにする」「4. 学籍番号などを指定して特定のStudentを検索し、その成績を表示する処理を作成する」「5. 配列に格納された全てのStudentの成績を一覧表示する処理を作成する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。

本コマでは、このプログラムの完成のための、モデル設計とStudentクラスの作成を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。

キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第35回の授業では、学生の成績管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第36回の授業「機能実装2」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

36 機能実装2(演習) 科目の中での位置付け 複数のオブジェクトを効率的に管理し、連携させるための設計方法を学ぶ。配列やコレクションを用いたオブジェクト管理の考え方を理解することで、システム全体を見通したプログラムの設計力を養う。
コマ主題細目 ① 機能実装2
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「学生の成績管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 学生を表すStudentクラスを作成し、名前・学籍番号・点数をフィールドとして定義する」「2. Studentクラスに合計点や平均点を計算するメソッドと、成績を整形して表示するメソッドを実装する」「3. 複数のStudentインスタンスを生成し、配列に格納して管理できるようにする」「4. 学籍番号などを指定して特定のStudentを検索し、その成績を表示する処理を作成する」「5. 配列に格納された全てのStudentの成績を一覧表示する処理を作成する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。

本コマでは、このプログラムの完成のための、StudentManagerクラスを作成し、学生情報の配列管理と入出力の機能実装を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。

キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第36回の授業では、学生の成績管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第37回の授業「機能実装3」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

37 機能実装3(演習) 科目の中での位置付け 集約されたデータから有益な情報を導き出す処理を設計する方法を学ぶ。演習を通して統計的な計算や情報の抽出を通じて、データ処理をオブジェクト指向の設計に統合する力を理解する。これにより、より高度な機能を備えたプログラムを設計できる力を身につける。
コマ主題細目 ① 機能実装3
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「学生の成績管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 学生を表すStudentクラスを作成し、名前・学籍番号・点数をフィールドとして定義する」「2. Studentクラスに合計点や平均点を計算するメソッドと、成績を整形して表示するメソッドを実装する」「3. 複数のStudentインスタンスを生成し、配列に格納して管理できるようにする」「4. 学籍番号などを指定して特定のStudentを検索し、その成績を表示する処理を作成する」「5. 配列に格納された全てのStudentの成績を一覧表示する処理を作成する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。

本コマでは、このプログラムの完成のための、StudentManagerクラスに登録された学生全体の平均・最高合計点・科目平均を出力する機能を実装する。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。

キーワード ① クラス ② フィールド ③ メソッド ④ インスタンス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第37回の授業では、学生の成績管理プログラムの作成演習を行った。復習として、今回の授業内に作成したプログラム演習課題を再度、演習を行うとよい。同じようなプログラムを再度作ることで、プログラムを作る際の差分を理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第38回の授業「機能テスト1」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

38 機能テスト1(演習) 科目の中での位置付け 第35〜37回の演習で作成したプログラムを対象に、設計書に基づいた仕様検証を行う。レビューやデバッグを通じて、開発工程における検証の基本を学ぶ。これにより、実務での品質保証活動の流れを理解する。
コマ主題細目 ① 機能テスト1
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「学生の成績管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 学生を表すStudentクラスを作成し、名前・学籍番号・点数をフィールドとして定義する」「2. Studentクラスに合計点や平均点を計算するメソッドと、成績を整形して表示するメソッドを実装する」「3. 複数のStudentインスタンスを生成し、配列に格納して管理できるようにする」「4. 学籍番号などを指定して特定のStudentを検索し、その成績を表示する処理を作成する」「5. 配列に格納された全てのStudentの成績を一覧表示する処理を作成する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。

本コマでは、第37回までの機能実装演習で作成した「学生の成績管理」プログラムについて、詳細設計書にもとづき、必要な機能が実装されているかの検証を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。

キーワード ① レビュー ② テスト ③ デバッグ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第38回の授業では、これまでの演習で作成したプログラムに対して、設計書に基づく仕様の検証を行った。復習として、今回の授業内でおこなった検証内容を、再度自分自身で再現してみるとよい。同じ手順を繰り返すことで、実務における開発の流れを理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第39回の授業「機能テスト2」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

39 機能テスト2(演習) 科目の中での位置付け 第38回に引き続き、演習で作成したプログラムに対して、テスト仕様書に沿ってテストケースを実行する。プログラムの動作が仕様通りであるかを体系的に検証する方法を学ぶことで、テスト工程の重要性を理解し、信頼性の高いソフトウェア開発に必要な姿勢を養う。
コマ主題細目 ① 機能テスト2
細目レベル ①  プログラム演習では実際に指定されたテーマとその詳細な仕様に沿って、プログラムの作成をする。例えば演習問題のテーマとして「学生の成績管理」のプログラムを作成するとする。その際にテーマとともに、仕様(問題文章として扱うこともできる)が表示される。具体的には「1. 学生を表すStudentクラスを作成し、名前・学籍番号・点数をフィールドとして定義する」「2. Studentクラスに合計点や平均点を計算するメソッドと、成績を整形して表示するメソッドを実装する」「3. 複数のStudentインスタンスを生成し、配列に格納して管理できるようにする」「4. 学籍番号などを指定して特定のStudentを検索し、その成績を表示する処理を作成する」「5. 配列に格納された全てのStudentの成績を一覧表示する処理を作成する」となる。このような具体的な仕様(問題文章)に沿っていくつかのプログラムの作成を行う。

本コマでは、第37回までの機能実装演習で作成した「学生の成績管理」プログラムについて、テスト仕様書にもとづき、テストケースの実行を行う。このプログラム演習ではあくまで仕様に沿ったプログラムを作ることを最低限の目標とし、早く終わった場合は、各プログラムをより発展的な内容へと工夫する。

キーワード ① レビュー ② テスト ③ デバッグ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第39回の授業では、これまでの演習で作成したプログラムに対して、テスト仕様書に基づくテストケースの実行を行った。復習として、今回の授業内でおこなった検証内容を、再度自分自身で再現してみるとよい。同じ手順を繰り返すことで、実務における開発の流れを理解することができる。それよってより効率の良いプログラムの作成につながる。また類似課題の演習を行い、さらなる定着を図る。

◆次回授業の予習
第40回の授業「カプセル化の必要性」のコマシラバスに目を通し、その基本的な理解を深めておくこと。なお、その際に、読んでも理解しきれなかった部分について下線を引いて把握し、その予習を踏まえた上で授業に臨むこと。

40 カプセル化の必要性 科目の中での位置付け 本講義では、誤りが起きにくいソフトウェアを作成することを目的として提案/実用されているカプセル化のあり方について述べ、その実現法について学習する。
コマ主題細目 ① カプセル化の理解 ② privateを用いた変数の可視性の制限 ③ ゲッター(getter)/セッター(setter)を用いた変数へのアクセス
細目レベル ① カプセル化とは、「ある変数について、利用と関係しないものは見せないようにすること」を意味する。逆から見れば、クラスにおいて用意されている機能の内、利用する際に、知らなくても差し支えないものを隠してしまうとも言える。この機能を、Javaのプログラムにおいてどのように実現すべきかについて述べる。
② 細目①を実現するためには、この細目②と細目③を使うこととなる。細目②では、クラス構造の中で、特定のメンバー変数を見せるかどうかの管理をする必要がある。これのために、public/protected/なし/privateの4種類のアクセス修飾子が用意されており、カプセル化を実現するためには、private修飾子を使うべきであり、もし、使わないとどのようになるかについて理解する。
③ 細目②で述べたprivate修飾子を用いることを前提にした時に、オブジェクトの内部状態(フィールド)を取得したり、変更したりするために、アクセサーメソッド(accessor method)を用いる。前者は一般にゲッターメソッド、後者は一般にセッターメソッドと呼ばれる。
キーワード ① カプセル化 ② private ③ アクセサーメソッド(accessor method) ④ ゲッター(getter)/セッター(setter)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
フィールドとして、姓名と年齢をもつクラスを定義し、その各々のゲッター/セッターメソッドを作成し、メインメソッドから呼び出し、各フィールドの値を変更できるようにする。

◆次回授業の予習
第41回講義の主題である、より高度なフィールドのアクセス権限とアクセサーメソッドに関する予備的調査を行うこと。

41 フィールドのアクセス権限とアクセサーメソッド 科目の中での位置付け 本講義では、誤りが起きにくいソフトウェアを作成することを目的として提案/実用されているカプセル化のあり方について述べ、その実現法についてより詳細に学習する。
コマ主題細目 ① public/protected/なし/privateの4種類のアクセス修飾子の特質と用法 ② ゲッター(getter)/セッター(setter)を用いた変数へのアクセスのための命名法
細目レベル ① カプセル化においては、クラス構造の中で、特定のメンバー変数をそのクラス外に見せるかどうかの管理をする必要がある。これのために、public/protected/なし/privateの4種類のアクセス修飾子が用意されている。この4種類のアクセス修飾子の詳細について理解する。
② オブジェクトの内部状態(フィールド)を取得したり、変更したりするために、アクセサ-メソッド(accessor method)を用いる。前者は一般にゲッターメソッド、後者は一般にセッターメソッドと呼ばれる。この講義では、そのメソッドの命名の仕方について理解する。
キーワード ① カプセル化 ② private ③ アクセサーメソッド(accessor method) ④ ゲッター(getter)/セッター(setter)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第41回講義のように、フィールドとして、姓名と年齢をもつクラスを定義し、その各々のゲッター/セッターメソッドを作成し、メインメソッドから呼び出し、各フィールドの値を変更できるようにするプログラムの復習をすること。

◆次回授業の予習
第42回講義の主題である継承の理解に向けて、より高度なフィールドのアクセス権限に関する予備的調査を行うこと。

42 カプセル化されたクラスとされていないクラス 科目の中での位置付け 本講義では、誤りが起きにくいソフトウェアを作成することを目的として提案/実用されているカプセル化のあり方について述べ、もしされていないとどのようになるのかについてより詳細に学習する。
コマ主題細目 ① public/protected/なし/privateの4種類のアクセス修飾子の特質と用法 ② ゲッター(getter)/セッター(setter)を用いた変数へのアクセスのための命名法
細目レベル ① カプセル化においては、クラス構造の中で、特定のメンバー変数をそのクラス外に見せるかどうかの管理をする必要がある。これのために、public/protected/なし/privateの4種類のアクセス修飾子が用意されている。この4種類のアクセス修飾子の詳細いて理解する。
② オブジェクトの内部状態(フィールド)を取得したり、変更したりするために、アクセサーメソッド(accessor method)を用いる。前者は一般にゲッターメソッド、後者は一般にセッターメソッドと呼ばれる。この講義では、そのメソッドの命名の仕方について理解する。
キーワード ① カプセル化 ② private ③ アクセサーメソッド(accessor method) ④ ゲッター(getter)/セッター(setter)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、フィールドとして、姓名と年齢をもつクラスを定義し、その各々のゲッター/セッターメソッドを作成し、メインメソッドから呼び出し、各フィールドの値を変更できるようにするプログラムをさまざまに変形させ、どのように動きが変わるのかについての復習をすること。

◆次回授業の予習
第43回講義の主題である継承の理解に向けて、より高度なフィールドのアクセス権限に関する予備的調査を行うこと。

43 継承とその効果 科目の中での位置付け 本講義では、効率的なプログラム開発を実現するために用意されているクラスの継承構造について理解し、それを用いた時の効果について学習する。
コマ主題細目 ① 継承における基本的概念の理解 ② Javaにおける継承の記述法の理解
細目レベル ① 継承とは、元となるクラスのメンバーを引き継ぎながら、新たな機能を加えたり、もとの機能の上書きをしたりする仕組みを意味する。この時、継承元となるクラスのことを基本クラス(または、スーパークラス、親クラス)、継承して作成したクラスのことを派生クラス(または、サブクラス、子クラス)と呼ぶことを理解する。
② 継承を利用するときに記述するキーワードextendsの使用法を理解する。これに伴って、クラス名の命名法、単一継承と多重継承の違い、継承の仕組みついて理解する。
キーワード ① 継承 ② 基底クラス(スーパークラス、親クラス) ③ 派生クラス(サブクラス、子クラス) ④ 単一継承/多重継承
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、さまざまな概念・用語などについて理解を深めることの復習。

◆次回授業の予習
第44回講義の主題である継承のより詳細な理解に向けて、単純な継承についての理解の深化を行うこと。

44 基底クラスと派生クラスの定義 科目の中での位置付け 本講義では、効率的なプログラム開発を実現するために用意されている継承について理解し、どのように基底クラス/派生クラスを記述するのかについて学習する。
コマ主題細目 ① 基底クラス/派生クラスを記述の理解 ② Javaにおける継承の記述法の理解
細目レベル ① 継承とは、元となるクラスのメンバーを引き継ぎながら、新たな機能を加えたり、もとの機能の上書きをしたりする仕組みを意味する。この時、継承元となるクラスのことを基本クラス(または、スーパークラス、親クラス)、継承して作成したクラスのことを派生クラス(または、サブクラス、子クラス)と呼ぶ。この基底クラス/派生クラスを記述するにはどのようにすればよいかについて理解する。
② 継承を利用するときに記述するキーワードextendsの使用法を理解する。これに伴て、クラス名の命名法、単一継承と多重継承の違い、継承の仕組みついて理解する。
キーワード ① 継承 ② 基底クラス(スーパークラス、親クラス) ③ 派生クラス(サブクラス、子クラス)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、さまざまな概念・用語などについて理解に基づいて、その記述法についての理解を深めることの復習をすること。

◆次回授業の予習
第45回講義の主題である継承のより詳細な理解に向けて、単純な継承についての理解の深化を行うこと。

45 継承を用いたプログラミング 科目の中での位置付け 本講義は、第40回目~第44回目の講義で学んだ、カプセル化および継承を中心とする内容についての知識の定着をはかるためのいわゆる「踊り場コマ」である。
コマ主題細目 ① カプセル化の利点とその記述法 ② 継承の利点とその記述法
細目レベル ① カプセル化の利点について復習し、実際にカプセル化を用いたプログラムを作成することにより、知識の定着をはかる。
② 継承の利点について復習し、実際に継承を用いたプログラムを作成することにより、知識の定着をはかる。
キーワード ① カプセル化 ② 継承
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
第40回目~第44回目の講義で学んだ、カプセル化および継承を中心とする内容についての復習をしておくこと。

◆次回授業の予習
第46回以降の講義の主題であるメソッドのオーバーライドやキーワードsuperの効果を理解にむけて、フィールドの隠蔽についての理解の深化を行っておくこと。

46 メソッドのオーバーライド 科目の中での位置付け 本講義では、効率的なプログラム開発を実現するために用意されている継承について理解を深め、基底クラスと派生クラス内で同じ名前のメソッドを用いた場合のフィールドの隠蔽について学習する。
コマ主題細目 ① メソッドのオーバーライドの条件 ② @Overrideアノテーション
細目レベル ① ソッドのオーバーライドのためには、メソッド名、仮引数、戻り値、アクセス修飾子、throws句について、さまざまな条件がある、これらを理解し、オーバーライドが起きているかどうかの判定ができるようにする。この条件とは、具体的には、メソッド名が完全に一致していること、仮引数のデータ型および個数が一致していること(名前は一致していなくても構わない)、戻り値の型が一致しているか、その派生型であること、アクセス修飾子が一致しているか、基底型のそれよりも緩いこと、throws句が一致しているか、派生型であることである。
② 上記の細目レベル①について神経質にならなくても良いようにするために、Javaでは、@Overrideアノテーションが用意されているこれは、注釈の一部で、このメソッドが、基底クラスのメソッドをオーバーライドしていることを宣言することができる。
キーワード ① オーバーライド ② @Overrideアノテーション
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、どのような場合にオーバーライドが起きるのかの詳細についての知識の定着をはかるための復習。

◆次回授業の予習
第48回の講義の主題であるキーワードsuperの効果を理解にむけて、フィールドの隠蔽についての理解の深化を行っておくこと。

47 オーバーライドを用いたプログラミング 科目の中での位置付け 本講義では、効率的なプログラム開発を実現するために用意されている継承について理解を深め、基底クラスと派生クラス内で同じ名前のメソッドを用いた場合のフィールドの隠蔽(メソッドのオーバーライド)について、プログラミングをしながら学習する。
コマ主題細目 ① メソッドのオーバーライドの条件 ② @Overrideアノテーション
細目レベル ① メソッドのオーバーライドのためには、メソッド名、仮引数、戻り値、アクセス修飾子、throws句について、さまざまな条件がある、これらを理解し、オーバーライドが起きているかどうかの判定ができるようにする。この条件とは、具体的には、メソッド名が完全に一致していること、仮引数のデータ型および個数が一致していること(名前は一致していなくても構わない)、戻り値の型が一致しているか、その派生型であること、アクセス修飾子が一致しているか、基底型のそれよりも緩いこと、throws句が一致しているか、派生型であることである。
② 上記の細目レベル①について神経質にならなくても良いようにするために、Javaでは、@Overrideアノテーションが用意されているこれは、注釈の一部で、このメソッドが、基底クラスのメソッドをオーバーライドしていることを宣言することができる。
キーワード ① オーバーライド ② @Overrideアノテーション
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、どのような場合にオーバーライドが起きるのかの詳細についての知識の定着をはかるための復習。

◆次回授業の予習
第48回の講義の主題であるキーワードsuperの効果を理解にむけて、フィールドの隠蔽についての理解の深化を行っておくこと。

48 superによる基底クラスの参照とコンストラクタ 科目の中での位置付け 本講義では、第46回目の講義で学んだ、基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽に対して、キーワードsuperを用いることにより、同じ名前であっても、派生クラスから基底クラスのメソッドを呼び出すことについて学習する。

コマ主題細目 ① superによる基底クラスの参照 ② 派生クラスのコンストラクタ
細目レベル ① 基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽に対して、キーワードsuperを用いることにより、同じ名前であっても、派生クラスから基底クラスのメソッドを呼び出すことについて学習する。
② クラスが継承された場合のコンストラクタの挙動は、メソッドとは異なる。注意すべきことは、コンストラクタは通常のメソッドのように、派生クラスには引き継がれないことである。
キーワード ① キーワードsuper ② 基底クラス/派生クラス ③ コンストラクタ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、継承における基底クラスと派生クラスについての知識の定着をはかるための復習。

◆次回授業の予習
第49回の講義の主題であるコンストラクタを用いたインスタンス化について、まず、インスタンス化の基礎についての予習を期待しています。

49 コンストラクタ連鎖 科目の中での位置付け Javaでは、コンストラクタ(Constructor)の呼出しが連鎖して実行される仕組みがあります。これを「コンストラクタ連鎖(コンストラクタチェーン)」と呼ぶ。一言で表現すれば、コンストラクタが別のコンストラクタを呼び出すっていうだけである。しかし、深堀すると、2つのパターンのコンストラクタチェーンに分けることができる。各々のコンストラクタ連鎖の長所/短所をきっちりと理解してほしい。
コマ主題細目 ① 基底クラスから派生クラスを呼び出すコンストラクタ連鎖 ② 同じクラス内のthis呼び出しによるコンストラクタ連鎖 ③ super()とthis()の優先順位
細目レベル ① 最も基本的なコンストラクタ連鎖、継承でつながったクラス階層におけるコンストラクタ連鎖である。派生クラスのコンストラクタが呼ばれるときは、基底クラスのコンストラクタが先に呼ばれるというルールによって繋がるコンストラクタの連鎖である。この連鎖は、キーワードsuperを用いた連鎖と考えることができる。しかし、Javaでは、派生クラスのコンストラクタの先頭に super() を明示的に書いていない場合、コンパイラが自動で super(); を補ってくれるという仕様があるので、省略時の連鎖と考えることもできる。
② 同じクラス内での別コンストラクタを呼びたいときに使うのが、キーワードthisである。これを使うことで、コンストラクタの中から別のコンストラクタを呼び出し、処理を再利用できる。
③ Javaのコンストラクタでは、コンストラクタの最初の行で this(...) か super(...) のいずれかのみを呼び出せるというルールがある。どちらも書かない場合は super() が暗黙的に挿入されるということとなっている。つまり、this() と super() を同時に書くことはできないし、もし this() を書いたら、そこに明示的に書かない限り super() はこのあと別の場所で呼ばれる(か、暗黙に入る)。this() を使えば、自クラス内の別のコンストラクタを経由して super() にたどり着く構造になるため、直感とは異なる実行順になることもあり、設計やデバッグ時には、「どこで親クラスの初期化が走るか?」を正確に把握することが重要である。
キーワード ① コンストラクタ ② super ③ this
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
コンストラクタの処理順はバグの原因になりやすいポイントである。「コンストラクタを呼ぶと、どこからどこへ飛んで、どのタイミングで基底クラスが初期化されるのか」を、一度紙に書いて整理してみると理解が深まる。もし、「あれ、なんでこのメッセージが先に出るんだろう?」と思ったら、コンストラクタ連鎖を疑ってログ出力を確認するのが良い。

◆次回授業の予習
次回の第50回目の講義は、ここまでのクラスい関する知識を利用したプログラミングの実践である。ここまでの内容を正確に利用しておきたい。

50 superを用いたプログラミング 科目の中での位置付け 本講義では、第46回目の講義で学んだ、基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽に対して、第48回目の講義で学んだキーワードsuperを用いることにより、同じ名前であっても、派生クラスから基底クラスのメソッドを呼び出すことについて、より深い学習を行う。
コマ主題細目 ① フィールドの隠蔽 ② superによる基底クラスの参照
細目レベル ① 基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽により、派生クラスから基底クラスのメソッドを呼び出すことができなくなることを応用について学習する。
② 細目レベル①に対して、キーワードsuperを用いることにより、派生クラスから基底クラスのメソッドを呼び出すことが可能となる。細目レベル①と②が混合して用いられた場合の意味の違いについて深く理解する。
キーワード ① キーワードsuper ② フィールドの隠蔽
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、継承における基底クラスと派生クラスについての知識の定着をはかるための復習。

◆次回授業の予習
第51回の講義の主題である抽象クラス/具象クラスの理解にむけて、クラスとそのインスタンスの数についての理解を行っておくこと。

51 継承/オーバーライドの禁止や制限 科目の中での位置付け 本講義では、これまで学んできた継承が自由に使えてきたのに対して、これによって、クラスの実装がむずかしくなるという欠点を引き起こす可能性を含んでいる。そこで、安全な継承を実現するために、継承やオーバーライドを禁止したり、制限したりして使用することが可能となっている。継承やオーバーライドを禁止するために用意されているのがfinal修飾子である。また、シールクラスを利用することにより、継承できるクラスを予め許可したクラスに限定をするころも可能である。これをについて学ぶのが、この授業の位置づけである。
コマ主題細目 ① final修飾子を用いた継承/オーバーライドの禁止 ② シールクラスを用いた継承先の制限
細目レベル ① 継承やオーバーライドを禁止するために用意されているのがfinal修飾子である。クラス定義のなかで、どこにどのように宣言することにより、final修飾子をかつようできるのかについて理解する。
② 細目レベル①のfinal修飾子を用いると、継承を制限することができるものの、すべての継承が禁止されてしまう。これに対して、継承できるのは予め許可したクラスまたはインターフェースに限定したい場合に使用するのがシールクラスである。なお、シールクラスと対応する派生クラスは、同一のモジュールない(非モジュール環境では、同一のパッケージ)に存在しなければならないことにも注意が必要である。
キーワード ① final修飾子 ② シールクラス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
安全な継承を実現するために、継承やオーバーライドを禁止したり、制限したりして使用する際にどのようにすべきかについての復習。

◆次回授業の予習
第52回の講義の主題である抽象クラス/具象クラスの理解にむけて、クラスとそのインスタンスの数についての理解を行っておくこと。

52 抽象クラスと具象クラス 科目の中での位置付け これまでの講義では、クラスを定義し、そのクラスからインスタンス(オブジェクト)を生成し、メッセージを送ることによって、処理を進めてきた。つまり、メソッドの中身を記述し、インスタンス化して使用してきた。このようなクラスを具象クラスと呼ぶ。一方、処理の記述がないメソッド(抽象メソッド)が1つ以上持つクラスのことを抽象クラスと呼ぶ。
コマ主題細目 ① 抽象クラスと具象クラスの違い ② 抽象クラスの必要性 ③ 抽象メソッドの定義法
細目レベル ① 具象クラスとは、具象という単語が意味する通り「具象メソッド(処理を記述したメソッド)の集まり」である。一方、抽象クラスとはインターフェースと通常のクラスの中間のようなクラスで、抽象メソッド(処理の記述がないメソッド)を1つ以上持つクラスを指す。
② 抽象クラスの特徴
抽象クラスの特徴は以下の通りである。
・処理の中身を記述しない
・多重継承はできない
・直接インスタンス化して使用できない
・インスタンス化するには、抽象クラスを継承した具象クラスで全ての抽象メソッドをオーバーライドする必要がある
・サブクラスでコンストラクタを記述しなければならない
・抽象クラスの抽象メソッドは宣言のみ自身だけでは意味をもたず、サブクラスに継承されることで初めて機能する
一見不便な点が目立つ抽象クラスであるが、抽象クラスには、以下のメリットがある。これらをまとめると、保守性がとても優れているとまとめることができる。
・コンパイラのチェック機構により、コーディングミスの早期発見が可能
・オーバーライドすべきメソッドが一目で分かるため、ソースの可読性が向上
・階層化により、プログラムの保守性が高くなる
・メソッド名の統一とロジックを共通化によって処理を把握しやすい
・共通の処理を全てのクラスに書き込む必要がなくなる
・複数人で開発を行う場合に実装レベルのルールを作ることができる

③ クラス名、メソッド名の前にabstractキーワードを記述することによって、抽象クラス、抽象メソッドであることを宣言する。
キーワード ① 具象クラス ② 抽象クラス ③ 抽象メソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
抽象クラスと具象クラスの違い、抽象クラスの必要性、抽象メソッドの定義法について理解し、具象クラス/抽象クラスのいずれも記述できるしょうな素養を身につけるように復習をする。

◆次回授業の予習
第53回講義の主題である、具象クラス/抽象クラスからなるプログラムの理解に対して、一通り目を通しておくことを予習として勧める。

53 抽象クラスの定義と特徴 科目の中での位置付け これまでの講義では、クラスを定義し、そのクラスからインスタンス(オブジェクト)を生成し、メッセージを送ることによって、処理を進めてきた。つまり、メソッドの中身を記述し、インスタンス化して使用してきた。このようなクラスを具象クラスと呼ぶ。一方、処理の記述がないメソッド(抽象メソッド)が1つ以上持つクラスのことを抽象クラスと呼ぶ。本講義では、このようなプログラムを解読することができるようにする
コマ主題細目 ① 抽象クラスと具象クラスの違い ② 抽象クラスの必要性 ③ 抽象メソッドの定義法
細目レベル ① 具象クラスとは、具象という単語が意味する通り「具象メソッド(処理を記述したメソッド)の集まり」である。一方、抽象クラスとはインターフェースと通常のクラスの中間のようなクラスで、抽象メソッド(処理の記述がないメソッド)を1つ以上持つクラスを指す。
② 抽象クラスの特徴は以下の通りである。
・処理の中身を記述しない
・多重継承はできない
・直接インスタンス化して使用できない
・インスタンス化するには、抽象クラスを継承した具象クラスで全ての抽象メソッドをオーバーライドする必要がある
・サブクラスでコンストラクタを記述しなければならない
・抽象クラスの抽象メソッドは宣言のみ自身だけでは意味をもたず、サブクラスに継承されることで初めて機能する
一見不便な点が目立つ抽象クラスであるが、抽象クラスには、以下のメリットがある。これらをまとめると、保守性がとても優れているとまとめることができる。
・コンパイラのチェック機構により、コーディングミスの早期発見が可能
・オーバーライドすべきメソッドが一目で分かるため、ソースの可読性が向上
・階層化により、プログラムの保守性が高くなる
・メソッド名の統一とロジックを共通化によって処理を把握しやすい
・共通の処理を全てのクラスに書き込む必要がなくなる
・複数人で開発を行う場合に実装レベルのルールを作ることができる

③ クラス名、メソッド名の前にabstractキーワードを記述することによって、抽象クラス、抽象メソッドであることを宣言するが、実際にこのように作成されたプログラムの利点について、実プログラムを参照しながら、理解をしていく。
キーワード ① 具象クラス ② 抽象クラス ③ 抽象メソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
 抽象クラスと具象クラスを含むさまざまなクラスからなるプログラムを調査し、その利点について自らの中にまとめる。

◆次回授業の予習
第54回講義の主題である、具象クラス/抽象クラスからなるプログラムの作成について予習をしておくことを勧める。

54 抽象クラスを用いたプログラミング 科目の中での位置付け これまでの講義では、クラスを定義し、そのクラスからインスタンス(オブジェクト)を生成し、メッセージを送ることによって、処理を進めてきた。つまり、メソッドの中身を記述し、インスタンス化して使用してきた。このようなクラスを具象クラスと呼ぶ。一方、処理の記述がないメソッド(抽象メソッド)が1つ以上持つクラスのことを抽象クラスと呼ぶ。本講義では、このようなプログラムを開発できるようにする。
コマ主題細目 ① 抽象クラスと具象クラスの違い ② 抽象クラスの必要性 ③ 抽象メソッドの定義法
細目レベル ① 具象クラスとは、具象という単語が意味する通り「具象メソッド(処理を記述したメソッド)の集まり」である。一方、抽象クラスとはインターフェースと通常のクラスの中間のようなクラスで、抽象メソッド(処理の記述がないメソッド)を1つ以上持つクラスを指す。
② 抽象クラスの特徴は以下の通りである。
・処理の中身を記述しない
・多重継承はできない
・直接インスタンス化して使用できない
・インスタンス化するには、抽象クラスを継承した具象クラスで全ての抽象メソッドをオーバーライドする必要がある
・サブクラスでコンストラクタを記述しなければならない
・抽象クラスの抽象メソッドは宣言のみ自身だけでは意味をもたず、サブクラスに継承されることで初めて機能する
一見不便な点が目立つ抽象クラスであるが、抽象クラスには、以下のメリットがある。これらをまとめると、保守性がとても優れているとまとめることができる。
・コンパイラのチェック機構により、コーディングミスの早期発見が可能
・オーバーライドすべきメソッドが一目で分かるため、ソースの可読性が向上
・階層化により、プログラムの保守性が高くなる
・メソッド名の統一とロジックを共通化によって処理を把握しやすい
・共通の処理を全てのクラスに書き込む必要がなくなる
・複数人で開発を行う場合に実装レベルのルールを作ることができる

③ クラス名、メソッド名の前にabstractキーワードを記述することによって、抽象クラス、抽象メソッドであることを宣言するが、実際にこのように作成されたプログラムの利点について、実プログラムを参照しながら、理解をしていく。
キーワード ① 抽象クラス ② 具象クラス ③ 抽象メソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
 抽象クラスと具象クラスを含むさまざまなクラスからなるプログラムを調査し、その利点について自らの中にまとめる。

◆次回授業の予習
第55回講義の主題である、参照型について予習をしておくことを勧める。

55 参照型の型変換 科目の中での位置付け 参照型の型変換は、基本型と同じで、型同士が継承/実装の関係にあることが条件となる。派生クラスから基底クラスへの変換をアップキャストと呼ぶ。一方、基底クラスから派生クラスへの変換をダウンキャストと呼ぶ。本講義では、効率的なプログラム開発を実現するために用意されている継承について理解し、それを用いた時の効果についてより詳細に学習する。
コマ主題細目 ① アップキャストの詳細 ② ダウンキャストの詳細 ③ 拡張を見据えたクラス設計 ④ 変数の型とオブジェクトの型 ⑤ 委譲
細目レベル ① 派生クラスでは、基底クラスのすべてのメンバーを含んでいる。よって、派生クラスのインスタンスは、基底クラスのインスタンスとして利用できるし、それが推奨されている。このために、派生クラスから基底クラスへの型変換は、特別な宣言を必要とせず、暗黙的に実施できる。
② 派生クラスは、基底クラスのメンバーに加えて、独自のメンバーを追加していることが多い。よって、ダウンキャストが常に可能とは限らない。つまり、基底クラスが常に派生クラスとして振る舞えるわけではない。
③ これまでは、X型の変数には、X型のオブジェクトだけを格納できると理解してきており、それでよかった。しかし、参照型を学ぶと、変数の型とオブジェクトの型を区別する必要が出てくる。
 たとえば、基底クラスをPerson、その派生クラスをStudentとした時に、
  Person p = new Student();
は正しい。この場合、変数pの型はPersonであり、オブジェクトの型はStudentとみなされる。

④ 型の判定
 ダウンキャストは失敗する可能性もあるので、安全でないキャスト(Unsafe Cast)とも呼ばれる。この安全性を確保するために、ダウンキャストをする時には、予めオブジェクトの型をチェックしておく必要がある。このために、instanceof演算子が用意されている。instanceof演算子は、変数に格納されたオブジェクトの型が、指定されている型に変換できる場合に真(true)を返す。

⑤ 継承は、コードの再利用において大変有用な手段である。しかし、継承がもつ基底クラスと派生クラスの結合性が、場合によっては、災いをもたらすこともある。そこで、継承を利用するのは、基底クラスと派生クラスがis-a関係となっており、かつ、パッケージをまたがって継承するのであれば、このことが、拡張を前提としており、その旨を文書化している場合に限定することによって、分かりやすいプログラムにすることができる。
キーワード ① アップキャスト ② ダウンキャスト ③ 安全でないキャスト(Unsafe Cast) ④ instanceof演算子 ⑤ 委譲
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、さまざまな概念・用語などについて理解を深めることの復習。

◆次回授業の予習
第56回講義の主題であるプログラミングによる継承のより詳細な理解に向けて、単純な継承についての理解の深化を行うこと。

56 抽象クラス定義(演習) 科目の中での位置付け これまで、特に51コマ目から55コマ目までは、具象クラスと抽象クラスの概念およびその利用法について述べてきた。この56コマ目では、実際のプログラムを用いて、これまでの理解を深める。 いわゆる「踊り場コマ」に該当する。
コマ主題細目 ① 具象クラス ② 抽象クラス
細目レベル ① 具象クラスとは、具象という単語が意味する通り「具象メソッド(処理を記述したメソッド)の集まり」である。一方、抽象クラスとはインターフェースと通常のクラスの中間のようなクラスで、抽象メソッド(処理の記述がないメソッド)を1つ以上持つクラスを指す。
② 抽象クラスの特徴は以下の通りである。
・処理の中身を記述しない
・多重継承はできない
・直接インスタンス化して使用できない
・インスタンス化するには、抽象クラスを継承した具象クラスで全ての抽象メソッドをオーバーライドする必要がある
・サブクラスでコンストラクタを記述しなければならない
・抽象クラスの抽象メソッドは宣言のみ自身だけでは意味をもたず、サブクラスに継承されることで初めて機能する
 一見不便な点が目立つ抽象クラスであるが、抽象クラスには、以下のメリットがある。これらをまとめると、保守性がとても優れているとまとめることができる。
・コンパイラのチェック機構により、コーディングミスの早期発見が可能
・オーバーライドすべきメソッドが一目で分かるため、ソースの可読性が向上
・階層化により、プログラムの保守性が高くなる
・メソッド名の統一とロジックを共通化によって処理を把握しやすい
・共通の処理を全てのクラスに書き込む必要がなくなる
・複数人で開発を行う場合に実装レベルのルールを作ることができる

キーワード ① 具象クラス ② 抽象クラス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
 抽象クラスと具象クラスを含むさまざまなクラスからなるプログラムを調査し、その利点について自らの中にまとめる。

◆次回授業の予習
第57回講義に向けて、今回の授業で学んだことのキーポイントを予習をしておくことを勧める。

57 ポリモーフィズムの定義とその利点 科目の中での位置付け 本講義では、ポリモーフィズムの定義とその利点、すなわち、同じ名前のメソッドを用いて、異なる挙動を実現することを扱う。ある目的を表す最適な名前は、1種類であることが多く、この最適な名前を使う手段を提供するというのが、ポリモーフィズムの利点である。
コマ主題細目 ① ポリモーフィズムの基礎 ② 抽象メソッド
細目レベル ① たとえば、さまざまな図形の面積を求めるプログラムを考える。高校時代の知識から、三角形の面積は底辺×高さ÷2、長方形の面積は長辺×短辺、菱形の面積は対角線1×対角線2÷2で求めることができる。この場合に、面積を求めるメソッドの名前としては、面積の英語がareaであることから、getAreaというのが最適である。そこで、図形の形が何であれ、getAreaという名前のメソッドで面積を求めたい。これを実現する仕掛けがポリモーフィズムである。
② ポリモーフィズムでは、基底クラスのメソッドが派生クラスで定義されることを期待している。このことを、コメント文などを用いて、制約がない形で指定することも可能である。しかし、派生クラスでオーバーライドされることを強制するために、抽象メソッドを使用する。抽象メソッドは、実体を持たない「空のメソッド」を意味する。実体がないので、その実態は、必ず派生クラスで与える必要がある。抽象メソッドをもつクラスは、自動的に抽象クラスとして扱われる。
キーワード ① ポリモーフィズム ② 抽象メソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
ポリモーフィズムを用いて、円の面積、半円の面積、四分の一円の面積を求めるプログラムを作成してみましょう。

◆次回授業の予習
第58回の講義の主題であるポリモーフィズムを用いたプログラミングに向けて、自分でポリモーフィズムが適したプログラムを考えてみたら面白いように思います。

58 ポリモーフィズムを用いたプログラミング 科目の中での位置付け 本講義では、ポリモーフィズムの定義とその利点、すなわち、同じ名前のメソッドを用いて、異なる挙動を実現することを扱う。ある目的を表す最適な名前は、1種類であることが多く、この最適な名前を使う手段を提供するというのが、ポリモーフィズムの利点である。本講義では、RPGゲームにおけるさまざまな攻撃、さまざまな動物の鳴き声などについて扱うことによってポリモーフィズムについての理解を深める。
コマ主題細目 ① ポリモーフィズムの基礎 ② 抽象メソッド
細目レベル ① たとえば、さまざまな図形の面積を求めるプログラムを考える。高校時代の知識から、三角形の面積は底辺×高さ÷2、長方形の面積は長辺×短辺、菱形の面積は対角線1×対角線2÷2で求めることができる。この場合に、面積を求めるメソッドの名前としては、面積の英語がareaであることから、getAreaというのが最適である。そこで、図形の形が何であれ、getAreaという名前のメソッドで面積を求めたい。これを実現する仕掛けがポリモーフィズムである。
② ポリモーフィズムでは、基底クラスのメソッドが派生クラスで定義されることを期待している。このことを、コメント文などを用いて、制約がない形で指定することも可能である。しかし、派生クラスでオーバーライドされることを強制するために、抽象メソッドを使用する。抽象メソッドは、実体を持たない「空のメソッド」を意味する。実体がないので、その実態は、必ず派生クラスで与える必要がある。抽象メソッドをもつクラスは、自動的に抽象クラスとして扱われる。
キーワード ① ポリモーフィズム ② 抽象メソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
お金の支払いをすることを考えてみましょう。この時、現金での支払い、PayPaydeno支払い、クレジットカードでの支払いを行うプログラムを作成してみましょう。実際の支払いは、「現金での支払い」はどと表示することで表すこととしてみましょう

◆次回授業の予習
第59回の講義の主題であるインターフェースを用いたプログラミングに向けて、これまで話をしてきた継承の限界を考えてみたら面白いように思います。

59 インターフェースの定義と特徴 科目の中での位置付け 我々は、父親と母親からの遺伝を受けている。つまり、我々は、父親を継承するとともに、母親を継承している。つまり、我々を派生クラスと考えた時に、基底クラスが二つあることとなる。このような継承を多重継承を呼ぶ。いくつかのプログラミング言語では、多重継承を許しているが、Javaでは、多重継承が許されていない。二つ以上の基底クラスに、同じ名前で内容が異なるメソッドがあった場合に、どちらを引き継ぐべきであるかなどが明確ではないからである。Javaでは、その代わりにインターフェースと呼ばれる機能が用意されている。本講義では、このインターフェースの定義とその利用法について述べる。
コマ主題細目 ① インターフェースとは ② インターフェースの定義 ③ インターフェースの実装
細目レベル ① インターフェースとは、配下のメソッドがすべて抽象メソッドであるようなクラスを意味する。これまで述べてきた抽象クラスと異なり、多重継承が可能となっている。インターフェース中のすべてのメソッドは、意味的なかたまりに振り分け、派生クラスでは、各々の用途に応じて、必要なインターフェースだけを選択するようにする。
② インターフェースを定義するには、interface命令を使う。クラスの時には、class命令を使うのとの相違である。interface命令で利用できる修飾子は、public、abstract、sealed、non-sealed、strictfpだけである。ただし、インターフェースの場合には、配下に含まれるのは抽象メソッドしかありえないので、abstract修飾子は付けても/付けなくても同じである。
③ インターフェースで定義できるメンバーは、その性質上、クラスよりも限定されており、抽象メソッド、defaultメソッド、クラスメソッド、定数フィールド、入れ子のstaticクラス/インターフェースだけである。インターフェースは、クラスと異なり、インスタンス化できないので、コンストラクタやインスタンスフィールドなどをもつことはできない。
キーワード ① インターフェース ② interface命令 ③ abstract修飾子
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱ったインターフェースをより深く理解するために、これまで学んできたクラスとの違いを自分なりに整理しておくことが、今回の復習となる。

◆次回授業の予習
第60回の講義では、インターフェースに含まれるメンバーについて学ぶので、これまで学んできたクラスのメンバーが、インターフェースのメンバーになりえるかどうかを、インターフェースの性質を考慮しながら考えてみよう。

60 インターフェースのメンバー 科目の中での位置付け インターフェースに含まれるものは、クラスに含まれるものに比べれば、大幅に制限されている。抽象メソッドが含まれるのはこれまでに延べてきたが、それ以外に、定数フィールド、staticメソッド、privateメソッド、defaultメソッドを含めることができる。しかし、多重継承を実現するには、本質的な問題点もあるので、インターフェースを用いた多重継承の実現には注意を要する。
コマ主題細目 ① 定数フィールド ② staticメソッド ③ privateメソッド ④ defaultメソッド
細目レベル ① インターフェースはインスタンス化できないので、インスタンスフィールドは定義できない。フィールド定義は、インターフェースの性質から、public static finalとみなされる。定数だけをまとめることを目的としてインターフェースを使用することもあるが、本来、インターフェースは振舞いの定義をすることを目的と考えると、望ましい使用法ではない。
② staticメソッドは、Java8以降新しく付加された機能である。既存のインターフェースに対して、なんらかの機能をまとめておきたいという場合の使用に限定すべきである。
③ privateメソッドは、Java9以降新たに付加された機能である。インターフェース内部で共通して利用するメソッドである。
④ defaultメソッドは、Java8以降新しく付加された機能である。実装クラスの側で毎時的で宣言されない場合に利用する実装である。
キーワード ① 定数フィールド ② staticメソッド ③ privateメソッド ④ defaultメソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った機能は、Javaの新しいバージョンで新たに付加されたものが多い。このように、新しく付加された機能にどのようなものがあるのかをまとめておこう。

◆次回授業の予習
第61回の講義では、インターフェースと抽象クラスの使い分けについて述べるので、これまで学習した抽象クラスとインターフェースの各々の特徴についてまとめておこう。

61 インターフェースと抽象クラスの使い分け 科目の中での位置付け オブジェクト指向プログラムの最大の特徴は、クラスの継承を用いた体系的な型階層である。型階層を実現しているのが、具象クラスと抽象クラスからなる継承関係であり、インターフェースは、型階層からは独立している。たとえば、自動車クラスとライオンクラスは、いずれも「走る」という機能をもつので、「run」というメソッドをもつことになる。しかし、このために、「runner」という抽象クラスを作ることは得策ではない。というのも、各々は、乗り物クラス、動物クラスというクラスの派生クラスとするのが自然だからである。もし作成するのであれば、「runnable」とかという名称のインターフェースを利用すべきである。
コマ主題細目 ① インターフェースを利用すべき場合 ② 抽象クラスを利用すべき場合
細目レベル ① インターフェースは型階層から独立しているので、特定の機能を自由に割り込ませることができる。【科目の中での位置づけ】で述べたライオンクラスがどのような基底クラスをもつにせよ、新たに「runnable」インターフェースを実装することの妨げにはならない。要求されるクラスが複数ある場合にも、インターフェースであれば、気軽に多重継承を利用できる。
② 抽象クラスを利用するのは、振舞い(つまり、そのクラスがどのようなメソッドを持つのか)以上に、実装そのものに関心がある場合である。派生クラスで共通的な処理をまとめたり、実装すべき処理の骨格をあたえるのに適している。
キーワード ① インターフェース ② 抽象クラス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、インターフェースを利用すべき場合と 抽象クラスを利用すべき場合の整理をしておきましょう。

◆次回授業の予習
第62回の講義の主題であるインターフェースと抽象クラスを使い分けたプログラムを作成できるようになっていてほしい。

62 インターフェースと抽象クラスを用いたプログラミング 科目の中での位置付け HashMapを用いたキーと値の管理で、連想配列としての高速アクセス手法を習得する。
コマ主題細目 ① インターフェースを利用すべき場合 ② 抽象クラスを利用すべき場合
細目レベル ① インターフェースは型階層から独立しているので、特定の機能を自由に割り込ませることができる。【科目の中での位置づけ】で述べたライオンクラスがどのような基底クラスをもつにせよ、新たに「runnable」インターフェースを実装することの妨げにはならない。要求されるクラスが複数ある場合にも、インターフェースであれば、気軽に多重継承を利用できる。
② 抽象クラスを利用するのは、振舞い(つまり、そのクラスがどのようなメソッドを持つのか)以上に、実装そのものに関心がある場合である。派生クラスで共通的な処理をまとめたり、実装すべき処理の骨格をあたえるのに適している。
キーワード ① インターフェース ② 抽象クラス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、インターフェースを利用すべき場合と 抽象クラスを利用すべき場合の整理をしておきましょう。

◆次回授業の予習
第63回の講義の主題であるインターフェースと抽象クラスを使い分けたプログラムを作成できるようになっていてほしい。

63 インターフェース定義(演習) 科目の中での位置付け 本講義では、第46回目の講義で学んだ、基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽に対して、キーワードsuperを用いることにより、同じ名前であっても、派生クラスから基底クラスのメソッドを呼び出すことについて、実際のプログラミングを行いながら学習する。
コマ主題細目 ① superによる基底クラスの参照 ② 派生クラスのコンストラクタ
細目レベル ① ベル】
① 基底クラスと派生クラス内で同じ名前のメソッドを用いた場合に起きるフィールドの隠蔽に対して、キーワードsuperを用いることにより、同じ名前であっても、派生クラスから基底クラスのメソッドを呼び出すことについて学習する。

② クラスが継承された場合のコンストラクタの挙動は、メソッドとは異なる。注意すべきことは、コンストラクタは通常のメソッドのように、派生クラスには引き継がれないことである。
キーワード ① フィールドの隠蔽 ② キーワードsuper ③ コンストラクタ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
今回の講義で扱った、継承における基底クラスと派生クラスについての知識の定着をはかるための復習は必須である。

◆次回授業の予習
次回の第64回は、深澤担当の講義の最終回である。これまでに教えた内容について自分なりに振返ってみましょう。

64 オブジェクト指向構文のまとめ 科目の中での位置付け これまで、40コマ目から63コマ目までは、クラスやオブジェクトに関する基本的な知識に基づき、実際の大規模なプログラムにおいて必要となるようなさまざまな技術についてまなんできた。
コマ主題細目 ① 継承 ② オーバーライドとキーワードsuper ③ 例外ハンドラ内での再スロー ④ 抽象クラスと具象クラス ⑤ インターフェース
細目レベル ① 継承(inheritance)とは、オブジェクト指向プログラミングにおける重要な概念の一つで、既存のクラス(基底クラス/親クラス/スーパークラス)の性質(フィールドやメソッド)を新しいクラス(派生クラス/子クラス/サブクラス)が受け継ぐ仕組み のことを意味する。継承のポイントは、以下の三つである。
・コードの再利用:基底クラスで定義した変数やメソッドを派生クラスがそのまま利用できる。これにより、共通の機能をまとめておき、重複を避けられる。
・拡張性:派生クラスは基底クラスの機能を、追加したり、変更(オーバーライド)したりすることができる。これにより柔軟に機能を拡張できる。
・階層的な構造:「動物 → 犬 → 柴犬」といったように、一般的な性質から具体的な性質へと階層構造を作れる。

② オーバーライドは基底クラスのメソッドを、派生クラスで上書きすることを意味し、superは、親クラスのメソッドやコンストラクタを呼ぶためのキーワードであり、利用法が異なる。
③ 通の性質や機能をまとめるけれど、完全には実装しないクラス
・abstract キーワードを付けて定義する。
・抽象メソッド(処理を持たないメソッド)を含むことができる。
・直接インスタンス化できない(new でオブジェクトを作れない)。
・子クラス(具象クラス)が継承して具体的に実装する必要がある。
一方、具象クラスは、以下のようにまとめることができる。
・実際にインスタンスを生成できるクラス。
・抽象クラスやインターフェースから継承した抽象メソッドを すべて実装しているクラス。

④ ポリモーフィズム(メソッドオーバーライド)とは、基底クラス型の変数に、派生クラスのオブジェクトを代入できるという性質を利用して、実際に呼ばれるメソッドは、変数の型ではなく、中身のオブジェクトの型によって決めることを意味する。動的バインディングとも呼ばれる。
⑤ インターフェース(interface)とは、クラスに共通の機能の“契約(仕様)”を定める仕組みのことを指す。実装は持たず、このメソッドを必ず実装しなさいというルールだけを示し、クラスは implements を使ってインターフェースを実装する。
 インターフェースのメソッドはデフォルトで public abstractであり、クラスがインターフェースを実装すると、すべてのメソッドをオーバーライドをすることが必須である、このため、インターフェースは契約書のような存在と言える。
 インターフェースを使用することにより、Javaのクラスは 単一継承(1つの基底クラスしか持てない)のに対して、多重継承が可能となる。特に、インターフェース型の変数でオブジェクトを扱うと、実装クラスに応じて挙動が変わるということで、ポリモーフィズムと相性が良いし、これにより柔軟なプログラミングが可能になる。

キーワード ① 継承 ② オーバーライドとキーワードsuper ③ 抽象クラスと具象クラス ④ ポリモーフィズム ⑤ インターフェース
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
 コマ主題細目で述べた6点を中心に、オブジェクト指向構文のまとめをしてほしい。

◆次回授業の予習
次回65回からは、ここまでに学んだことをベースに、その応用に話題が変わる。次回かたは、コレクションフレームワークについて学ぶので、さまざまなデータ構造について学んでほしい。

65 基本型(プリミティブ型)とラッパーオブジェクトの変換 科目の中での位置付け throwによる独自例外スローを習得し、エラー状態をわかりやすく報告するコードを設計する。
コマ主題細目 ① 基本データ型の限界とラッパークラスの役割 ② ラッパークラスを用いたデータ操作と型変換 ③ Autoboxing/Unboxingによる効率的なコーディング
細目レベル ① Javaにおけるデータ型には、数値を扱うint型や文字を扱うchar型などの「基本データ型」と、Stringクラスのように様々な機能を持つ「参照型」の2種類が存在します。皆さんがこれまで学んできた基本データ型は、値をメモリ上に直接保持するシンプルな仕組みのため、高速に動作するというメリットがあります。しかしその反面、値を保持することしかできず、データに対する便利な操作メソッドを持っていないという限界があります 。

例えば、int型の数値をdouble型の数値に変換したい場合、基本データ型だけでは直接的な操作は困難です。このような、基本データ型だけでは手が届かない細やかな処理を実現するためにJavaに用意されているのが「ラッパークラス」です 。ラッパークラスは、8種類ある基本データ型それぞれに対応するクラス(intにはInteger、charにはCharacterなど)が用意されており 、基本データ型の値をオブジェクトとして「包み込む(ラッピングする)」ことで、オブジェクト指向の恩恵を受けられるようにする、まさに「強力な助っ人」なのです 。ITエンジニアとして、単にデータを格納するだけでなく、そのデータを様々に加工・活用する場面は頻繁に訪れます。その際に、なぜラッパークラスが必要なのか、その根本的な役割を理解しておくことが、より高度なプログラミングへの第一歩となります。

② ラッパークラスの具体的な利用方法を見ていきましょう。伝統的な方法では、newキーワードを使ってラッパークラスのインスタンス(オブジェクト)を生成します。例えば、int型の変数numがあった場合、Integer integerNum = new Integer(num); のように記述することで、numの値を内包したIntegerオブジェクトが作成されます 。このように、基本データ型の値をオブジェクトとして扱うことで、そのオブジェクトが持つ便利なメソッドを利用できるようになります。

doubleValue()メソッドは、その代表例です 。このメソッドは、Integerオブジェクトが内部に保持しているint型の値を、double型の値に変換して返してくれます 。これにより、3という整数が3.0という浮動小数点数へと、明確なメソッド呼び出しによって安全に変換されます 。プログラミングの世界では、こうした「型変換」は頻繁に必要とされます。ラッパークラスが提供するメソッド群を使いこなすことで、データの型を自在に、かつ意図が明確な形で変換できるようになります。これは、コードの可読性や保守性を高める上で非常に重要なスキルであり、チーム開発など実務の現場で必ず役立つ知識です。

③ Javaは進化を続けており、プログラマがより快適にコーディングできるよう、便利な機能が追加されてきました。その一つが、Java SE 5から導入された「Autoboxing(オートボクシング)」と「Unboxing(アンボクシング)」です 。

「Autoboxing」とは、基本データ型の値を、対応するラッパークラス型の変数へ直接代入できる機能です 。従来であればInteger integer = new Integer(10);と記述する必要があったところを、Integer integer = 10;と書くだけで、コンパイラが自動的に変換を行ってくれます 。これにより、コードが非常にシンプルで直感的になります。

一方、「Unboxing」はその逆の操作です 。ラッパークラスのオブジェクトを、基本データ型の変数に直接代入できます 。これにより、値を取り出すために.intValue()のようなメソッドを明示的に呼び出す手間が省けます。
このAutoboxing/Unboxingは、現代のJavaプログラミングでは当たり前に使われる必須の知識です。特に、後の授業で学ぶArrayListのようなコレクションフレームワークでは、オブジェクトしか格納できないため、基本データ型を扱う際にはこの仕組みが裏側で常に動いています。これらの機能を正しく理解し、意識せずに使いこなせるようになることが、効率的で読みやすいコードを書くための鍵となります。

キーワード ① ラッパークラス ② 基本データ型 ③ AutoboxingとUnboxing ④ 型変換
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト
復習・予習課題 int型の変数に123という値を代入し、それをIntegerクラスのオブジェクトに変換(Autoboxingを利用)、さらにそのオブジェクトが持つ値をString型(文字列)とdouble型に変換してコンソールに出力するプログラムを作成してください。
66 コレクションの基本構文 科目の中での位置付け Listは「伸び縮みする配列」で、Genericsで型を決め、安全に追加・削除・変更・並べ替えできる便利な仕組みについて学修する。
コマ主題細目 ① コレクションの基礎 ② Listの基本操作 ③ Listの活用
細目レベル ① プログラミングでは、複数のデータをまとめて扱いたい場面が頻繁に発生します。これまでは「配列」を使ってきましたが、配列には「一度作成するとサイズを変更できない」という大きな制約があります。 そこで登場するのが、より柔軟なデータ構造である「コレクション」、その中でも基本となるのがList(リスト)です。

Listは、配列のようにインデックス(要素番号)でデータにアクセスできる利便性を持ちながら、要素の数に応じて自動的にサイズが拡張される、非常に便利な仕組みです。

Listという「機能の規格(インターフェース)」と、それを具体的に実現する2つの代表的なクラス、ArrayListとLinkedListに焦点を当てます。

ArrayListは内部的に配列を利用してデータを管理しており、特定の要素をインデックスで読み書きする「ランダムアクセス」が非常に高速です。 一方、LinkedListは各要素が前後の要素への参照(リンク)を持つ「連結リスト」という構造で、リストの先頭や途中への要素の挿入・削除処理を効率的に行えるという特長があります。 どちらのクラスを選ぶべきか、それは「これから行う処理が何か」によって決まります。この「状況に応じた最適な技術を選択する」という視点は、プロのエンジニアにとって不可欠な思考法です。多くの場合ArrayListが使われますが、両者の違いを理解し、使い分けることが重要です。

② Listを実際に利用するには、まず「どのような型のデータを格納するか」を明示する必要があります。ここで登場するのがGenerics(ジェネリクス)という概念です。ListやListのように山括弧< >で型を指定することで、そのリストが特定の型のデータしか受け付けないようになり、プログラムの安全性が飛躍的に向上します。 これにより、意図しない型が混入するミスをコンパイル時点で防ぐことができます。なお、intのようなプリミティブ型は直接指定できず、Integerのような「ラッパークラス」を用いるルールがあることも覚えておきましょう。

リストのインスタンスをnew ArrayList<>()のように生成したら、次はいよいよ要素の操作です。 最も基本的な操作はadd()メソッドによるリスト末尾への要素追加です。 しかしListの真価は、その柔軟な変更能力にあります。add(インデックス, 値)を使えばリストの好きな位置に要素を「挿入」でき、remove(インデックス)で要素を「削除」、set(インデックス, 値)で要素を「変更(上書き)」することが可能です。 これらの操作を行う際、要素の挿入・削除によって後続要素のインデックスが自動的にずれる点には注意が必要です。 データを自在に操るこれらの基本操作は、あらゆるアプリケーション開発の基礎となります。

③ リストに格納されたデータ全体に対して、何らかの処理を加えたい場合も少なくありません。そのための最も基本的な手法が「繰り返し処理」です。Javaには、リスト内の全要素を簡潔に一つずつ取り出すことができる「拡張for文」が用意されています。 これはリスト内の全要素を順番に参照したい場合に非常に便利です。一方で、処理中に要素のインデックス番号が必要な場合は、従来のfor文とget(インデックス)メソッドを組み合わせることで対応できます。 目的応じて2つのfor文を使い分けるのが良いプログラマの習慣です。

さらに、リストの要素を特定の順序で並べ替える「ソート」も、データ処理における必須のテクニックです。Listにはsort()メソッドが用意されており、これに「ラムダ式」を渡すことで、並べ替えのルールを驚くほど簡潔に記述できます。 ラムダ式は、(a, b) -> a.compareTo(b)のような形式で「2つの要素をどのように比較するか」というロジックをその場で定義する仕組みです。 このラムダ式の記述を少し変えるだけで、昇順・降順を自在に切り替えられます。 ラムダ式は、現代的なJavaプログラミングを象徴する強力な機能であり、今後の学習においても様々な場面で活用することになるでしょう。

キーワード ① Listインターフェース ② ArrayList ③ LinkedList ④ ジェネリクス (Generics) ⑤ ラムダ式
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: ArrayListとLinkedListについて、それぞれの得意な処理(例:ランダムアクセス、リストの先頭への要素挿入)と苦手な処理を挙げてください。そして、なぜそのような性能差が生まれるのか、各クラスの内部的なデータ構造(ArrayListは配列、LinkedListは要素同士の連結)と関連付けて説明できるように準備してください。
67 オブジェクト型とジェネリクス 科目の中での位置付け ラッパークラスと自動変換を理解し、自作クラスのオブジェクトをリストで扱えるようになることが、実用的なJavaプログラミングの基礎であり、その点を学修する。
コマ主題細目 ① オブジェクトとラッパークラス ② 整数のリスト操作 ③ オブジェクトのリスト操作
細目レベル ① Javaプログラミングにおいて、intやdoubleといった「プリミティブ型」は、基本的な数値を扱うための高速で効率的な仕組みです。しかし、これらはオブジェクトではないため、ArrayListをはじめとする「コレクションフレームワーク」に直接格納することができません。 コレクションは、オブジェクトを効率的に管理するための強力なライブラリであり、現代的なアプリケーション開発に不可欠です。

この制約を乗り越えるためにJavaが用意しているのが「ラッパークラス」(Integer, Doubleなど)です。 本セクションでは、なぜラッパークラスが必要なのかという根本的な理由から解説します。さらに、プリミティブ型とラッパークラスの型を自動で相互変換する「ボクシング(Autoboxing)」と「アンボクシング(Unboxing)」という非常に便利な機能について学びます。 この仕組みは、本来であれば手間のかかる型変換をJavaコンパイラが裏で自動的に行ってくれるものであり、プログラマは変換を意識することなく、あたかもプリミティブ型を直接コレクションに格納しているかのように、直感的で簡潔なコードを記述できます。 この「橋渡し」の概念を理解することは、Javaのコレクションを自在に使いこなすための第一歩となります。

② 前のセクションで学んだラッパークラスと自動変換の仕組みが、実際のコードでどのように機能するのかをArrayList、すなわち整数のリストを例に取って具体的に学びます。

Listを宣言し、forループを使ってリストに整数を追加していくシンプルな処理を考えます。 このとき、addメソッドに渡している値はプリミティブ型のintですが、リストに格納される瞬間に「ボクシング」が働き、自動的にIntegerオブジェクトへと変換されています。 逆に、拡張for文などを使ってリストから要素を取り出し、プリミティブ型のint変数に代入する際には「アンボクシング」が働き、Integerオブジェクトからintへと自動で変換されます。

このように、ボクシングとアンボクシングは、コレクションを扱う上で舞台裏の立役者として機能しています。この挙動をソースコードレベルで確認し、その恩恵を実感することで、Javaのコレクションフレームワークがいかに洗練され、プログラマの負担を軽減するように設計されているかを深く理解することができるでしょう。

③ 実用的なアプリケーション開発では、IntegerやStringといった既存のクラスだけでなく、業務内容に合わせて自分で設計したクラスのオブジェクトを管理することがほとんどです。ここでは、レシピの材料(名前、分量など)を管理するIngredientクラスを自ら作成し、そのインスタンスをArrayListに格納する方法を学びます 。これにより、単なるデータの集まりではなく、意味のある情報(オブジェクト)を構造化して管理するという、オブジェクト指向プログラミングの真髄に触れます。

リストにオブジェクトを格納した後は、そのデータを取り出して活用する必要があります。この授業では、拡張for文を使ってリストの全要素を一つずつ順番に処理する方法(走査)を実践します。例えば、リストに格納されたIngredientオブジェクトを一つずつ取り出し、ゲッターメソッド(getName()やgetAmount()など)を使ってオブジェクト内部の個別の情報(材料名や分量)にアクセスします 。これにより、「リスト内の全材料の名前だけを一覧表示する」「分量が特定の量以上の材料だけをif文で判定して表示する」といった、より実践的なデータ操作が可能になります。コレクションに格納した自作オブジェクトの一つひとつにアクセスし、その中身を自由に扱うこのスキルは、あらゆるJavaアプリケーション開発の基礎となる重要なテクニックです。

キーワード ① ラッパークラス ② Autoboxing ③ Unboxing ④ オブジェクトのリスト ⑤ 拡張forループによる要素へのアクセス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: 授業で作成したIngredientクラスのリスト(recipe)について、拡張for文とゲッターメソッドを用いて、以下の処理を行うコードを記述し、その処理の流れを説明できるように準備してください。
(1) リストに含まれる全ての材料について、getName()メソッドを使い、材料名だけを一行ずつ出力する。
(2) リストに含まれる材料のうち、getAmount()で取得した分量が「100以上」のものだけを抽出し、その材料名と分量を「[材料名]は[分量]gです。」という形式で出力する。

68 リストの種類とArrayList 科目の中での位置付け ArrayListはサイズが自由な配列のようなものであり、Genericsで型を決めて安全に使い、add/get/sizeで操作するのが基本であることを学修する。
コマ主題細目 ① コレクションフレームワークとListインターフェイス ② ArrayListの基本と型安全のためのジェネリクス ③ 基本的な要素の追加と取得
細目レベル ① プログラミングにおいて、複数のデータをまとめて扱う場面は非常に多くあります。これまでは「配列」を利用してきましたが、配列には「一度作成するとサイズを変更できない(固定長)」という大きな制約がありました 。例えば、ユーザーの入力に応じてデータを追加していくようなアプリケーションでは、あらかじめ配列のサイズを正確に予測することは困難であり、サイズが不足するたびに新しい大きな配列を作成し、古い配列からデータをコピーするという煩雑な処理が必要になります 。

この問題を解決するためにJavaが標準で提供しているのが、コレクションフレームワークです 。これは、java.utilパッケージに含まれる、複数のデータを効率的に扱うためのクラス・インターフェイス群の総称です 。コレクションフレームワークには、データの特性に応じて主に4つの種類が存在します。順序を保持し重複を許す「List」、順序を問わず重複しない値の集合である「Set」 、要素を追加した順に取り出すFIFO(先入れ先出し)などのルールを持つ「Queue」 、そしてキーと値のペアでデータを管理する「Map」です 。本講義では、この中で最も利用頻度が高く、配列の直接的な上位互換として考えられるListインターフェイスから学習を始めます。

② Listインターフェイスを実装した代表的なクラスがArrayListです。ArrayListは内部的に配列を利用しながら、要素の追加に応じて自動的にサイズを拡張してくれるため、「動的配列」とも呼ばれます 。これにより、プログラマはサイズの管理を意識することなく、柔軟に要素の追加・削除を行えます 。

ArrayListを安全に利用する上で絶対に欠かせないのがジェネリクス(Generics)という仕組みです 。ArrayList list = new ArrayList(); のように、リストが扱うデータの型を山括弧< >で指定します 。もしジェネリクスを指定せずにArrayList list = new ArrayList(); といった「生の型(raw type)」で利用すると、StringやIntegerなど、あらゆる型のオブジェクトを混在して追加できてしまいます 。一見便利に思えますが、リストからデータを取り出す際に (String)list.get(i) のようなキャスト(型変換)が必須となり、もし異なる型の要素をキャストしようとすると、プログラムの実行時にClassCastExceptionという致命的なエラーが発生する原因となります 。

ジェネリクスは、この問題をコンパイル時点で解決します 。ArrayListと宣言すれば、String型以外のデータを追加しようとするコードはコンパイルエラーとなり 、実行時エラーのリスクを未然に防ぎます。また、getメソッドで要素を取得する際も、コンパイラが型を保証してくれるため、キャストが不要になり、コードの可読性と安全性が大幅に向上します 。

③ ArrayListの最も基本的な操作は、要素の追加と取得です。要素の追加にはaddメソッドを使用します 。list.add("東京"); のようにaddメソッドで追加された要素は、リストの末尾に順番に格納されていきます 。要素の取得にはgetメソッドを使用し、配列と同様に0から始まるインデックス(添字)を指定します 。

list.get(0)であれば最初の要素、list.get(1)であれば2番目の要素を取得できます 。リストに含まれる要素の総数はsize()メソッドで取得でき 、これは繰り返し処理などでループの終了条件として頻繁に利用されます 。これらのメソッドを使いこなし、リストにデータを格納し、特定のデータを取り出す基本操作を確実に身につけることが、コレクションを使いこなす第一歩となります。

キーワード ① コレクションフレームワーク ② Listインターフェイス ③ 動的配列 ④ ジェネリクス ⑤ ClassCastException
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: 従来の配列と比較して、ArrayListを使用するメリットは何ですか。また、ArrayListを宣言する際にジェネリクス(例: )を指定しない場合、どのようなリスクが考えられるか、ClassCastExceptionという用語を用いて具体的に説明してください。
69 リストの検索とエラー処理 科目の中での位置付け 拡張for文は便利だが削除には注意であり、インデックス範囲や固定長リストとの違いを理解して安全に使うことが必要である。この点をプログラムを通して学修する。
コマ主題細目 ① リストの繰り返し処理と拡張for文 ② 繰り返し処理中のリスト変更とConcurrentModificationException ③ インデックス範囲外エラーと固定長リストの罠
細目レベル ① リストに格納された全ての要素に対して、順番に同じ処理を行うことは頻繁に発生します。この繰り返し処理(走査)には、拡張for文(for (String item : list)のような形式)を使うと、従来のforループよりもコードを簡潔かつ安全に記述できます 。インデックス変数を管理する必要がなく、getメソッドを呼び出す手間も省けるため、リストや配列の全要素にアクセスする際の第一選択肢となります 。特に、リスト内の何番目の要素であるかを意識する必要がない場合は、積極的に拡張for文を利用すべきです 。
② 拡張for文は非常に便利ですが、一つ重大な禁則事項があります。それは、拡張for文による繰り返し処理の実行中に、そのリストの構造を変更する操作(特にremoveメソッドによる要素削除)を直接呼び出してはならないということです 。もし拡張for文のブロック内でlist.remove()を呼び出してしまうと、多くの場合java.util.ConcurrentModificationExceptionという例外がスローされ、プログラムは強制終了します 。これは、リストが「繰り返し処理中に予期せぬ変更が加えられた」と検知し、データの不整合や予期せぬ動作を防ぐために意図的に処理を中断させるためのフェイルファストと呼ばれる安全機能です。

この問題を回避し、安全に繰り返し処理中の要素を削除するためには、イテレータ (Iterator) を明示的に使用する必要があります。まずlist.iterator()でイテレータを取得し、while (it.hasNext())ループで次の要素の有無を確認します。ループ内ではit.next()で要素を取得し、削除条件に一致した場合、イテレータ自身のit.remove()メソッドを呼び出します。この方法であれば、イテレータがリストの状態を正しく管理するため、ConcurrentModificationExceptionを発生させずに安全に要素を削除することが可能です。

③ ArrayListの操作で頻発するもう一つの代表的な実行時エラーが java.lang.IndexOutOfBoundsException です。これは、リストの有効なインデックスの範囲外にアクセスしようとしたときに発生します 。例えば、要素数が3(インデックスは0, 1, 2)のリストに対してget(3)を実行したり、add(5, "data")のようにリストのサイズを飛び越えた位置に要素を挿入しようとしたりすると、この例外に遭遇します 。

add(index, element)で挿入する場合、indexは0からlist.size()までの範囲でなければなりません。

また、ArrayListとよく似たリストを生成する方法としてArrays.asList()やList.of()がありますが、これらには注意が必要です。これらのメソッドで作成されるリストは、通常のArrayListとは異なり、サイズを変更できない固定長リストです 。そのため、これらのリストに対してaddやremoveメソッドを呼び出すと、コンパイルエラーにはなりませんが、実行時に java.lang.UnsupportedOperationException という例外がスローされます 。

ArrayListのような可変長のリストとの性質の違いを理解し、用途に応じて適切に使い分けることが重要です。

キーワード ① 拡張for文 ② ConcuentModificationException ③ イテレータ (Iterator) ④ IndexOutOfBoundsException ⑤ 固定長リスト
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: ArrayListに1から10までの整数を追加した後、イテレータ(Iterator)を用いてリストを走査し、「偶数」の要素だけを安全に削除するプログラムを作成してください。なぜ拡張for文の中でlist.remove()を使うと問題が起きるのか、その理由も併せて説明してください。
70 リストの操作(演習)) 科目の中での位置付け setとaddの違い・equalsを使った削除・Comparatorによる並べ替えを理解すると、リストを自在に操作できる。この点についてプログラム演習を通して学修する。
コマ主題細目 ① 要素の更新と置換 (setメソッド)  ② オブジェクトの削除とequalsメソッドの重要性 ③ Comparatorによるカスタムオブジェクトのソート(並べ替え)
細目レベル ① リスト内の特定の要素を新しい要素に置き換える(更新する)場合は、setメソッドを使用します 。set(index, newElement)のように、第1引数に置き換えたい要素のインデックスを、第2引数に新しい要素を指定します 。これにより、指定したインデックスに元々あった要素は破棄され、新しい要素で上書きされます 。重要なのは、setメソッドはリストのサイズを変更しないという点です。一方でadd(index, newElement)メソッドは、指定したインデックスに新しい要素を「挿入」し、後続の要素は一つずつ後ろにずれるため、リストのサイズが1つ増えます。この「置換」と「挿入」の違いを明確に理解し、目的に応じて正しく使い分けることが、意図した通りのデータ操作を行う上で不可欠です。
② 要素を削除するremoveメソッドには、インデックスを指定する方法 (remove(index)) の他に、削除したいオブジェクトそのものを指定する方法 (remove(Object)) があります 。remove(Object)を呼び出すと、リストは内部で先頭から順に各要素を探索し、引数で渡されたオブジェクトと「同じ」であると判断された最初の要素を1つだけ削除します 。

ここで極めて重要になるのが、「同じ」であることの判定基準です。この判定には、Javaのすべてのオブジェクトが持つ
equalsメソッドが内部的に使用されます 。自作クラス(例:Studentクラス)のオブジェクトをリストに格納し、removeメソッドで意図通りに削除したい場合、その自作クラスでequalsメソッドを適切にオーバーライドしておく必要があります 。例えば、「学籍番号が一致すれば同じ学生とみなす」といった独自の同値性ルールをequalsメソッドに実装することで、new Student("123")を引数にして、リスト内の学籍番号が"123"である学生オブジェクトを正確に削除できるようになります。

③ リストに格納された要素を、特定のルールに従って並べ替える(ソートする)操作は、実務アプリケーション開発において非常に頻繁に必要とされます。Listインターフェイスのsortメソッドを利用しますが、IntegerやStringのような標準クラスは自然な順序(昇順、辞書順)でソートできます。しかし、自作クラスのオブジェクト(例:学生オブジェクト)を「成績順」や「名前の逆順」といった独自のルールでソートするには、その並べ替えのルールをプログラムに教える必要があります。

そのための仕組みが java.util.Comparator インターフェイスです 。まず、Comparatorを実装した専用のクラス(例:StudentScoreComparator)を作成します。そして、そのクラスのcompare(o1, o2)メソッド内に、二つのオブジェクトo1とo2を比較するロジックを記述します 。このメソッドは、o1がo2より前に来るべきなら負の整数、後ろに来るべきなら正の整数、順序が同じなら0を返すように実装します 。このComparatorオブジェクトをlist.sort()メソッドに渡すことで、リストは定義されたルールに従って美しく整列されます。本日は、これらの高度なリスト操作を演習を通じて実践的にマスターしていきます。

キーワード ① setメソッド(置換) ② remove(Object) ③ equalsメソッド(同値性判定) ④ Comparatorインターフェイス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: 「商品名(String)」と「価格(int)」をフィールドに持つProductクラスを作成してください。mainメソッドで、任意のProductオブジェクトを5つ作成してArrayListに追加します。その後、「価格が安い順」にリストをソートするためのComparatorを実装し、ソート後のリストの全商品名と価格をコンソールに表示するプログラムを作成してください。
71 HashSetの定義と使用 科目の中での位置付け PrintWriterを使った整形出力で、ログ・帳票などのフォーマット制御を行いやすくする。
コマ主題細目 ① コレクション「Set」の概念と役割 ② HashSetとTreeSetの内部構造と特性 ③ Setインターフェースの基本的な操作
細目レベル ① プログラミングにおいて、複数のデータをまとめて扱うための仕組みを「コレクションフレームワーク」と呼びます。これまでに学習したListもその一つですが、今回学ぶSetインターフェースは、「重複した値の格納を許さない」という極めて重要な特性を持つコレクションです。

配列やListでは同じ値を複数格納できますが、Setに同じ値を追加しようとすると、その操作は無視され、要素は常に一意(ユニーク)な状態に保たれます。 この特性は、例えばWebサイトのアクセスユーザーIDを管理したり、アンケートの回答項目を重複なく集計したりと、実務において「一意なデータの集合」を扱いたい場面で絶大な効果を発揮します。

また、Setのもう一つの重要な役割は、特定のデータがその集合内に「含まれているかどうか」を非常に高速に判定できる点です。 大量のデータの中から特定の要素を探す際、Listでは先頭から順に探すためデータ量に比例して時間がかかりますが、Set(特にHashSet)は、データ量の影響を受けにくい効率的な検索メカニズムを備えています。この授業では、まずSetがどのような場面で有効なデータ構造なのかを理解することを最初の目標とします。

② Setは機能の仕様を定めたインターフェースであり、その仕様を具体的に実現したのがHashSetやTreeSetといった「実装クラス」です。 どちらもSetの仲間ですが、データを管理する内部的な仕組みが異なり、それによって得意なことと不得意なことが分かれます。

HashSetは、「ハッシュ値」という数値を使ってデータを管理します。 これは、各データから一意の数値を算出し、その数値を基に格納場所を直接決定する方式です。 これにより、要素の追加や検索を極めて高速に行うことができ、一般的な用途では
Setの第一選択肢となります。 ただし、格納場所はハッシュ値に依存するため、要素が追加された順序は保持されません。

一方、TreeSetは、「木構造(Tree Structure)」という形式でデータを管理します。 これは、データを大小関係に基づいて整理しながら格納する方法で、その結果、TreeSet内の要素は常に自動的にソートされた状態に保たれるという大きな特長があります。 ただし、常に順序を維持するための処理が必要なため、単純な追加や検索の速度ではHashSetに劣ります。エンジニアとしては、これらの特性の違いを理解し、「速度が最優先か」「順序が必要か」といった要件に応じて適切なクラスを選択する判断力が求められます。

③ Setをプログラム上で実際に扱うための基本的なメソッドを学びます。まず、Set colors = new HashSet<>(); のように、Setインターフェース型の変数を宣言し、HashSetクラスでインスタンスを生成します。

要素を追加するにはadd()メソッドを、 特定の要素が含まれているかを確認するにはcontains()メソッドを使用します。 特にcontains()メソッドはSetの利点を最も体現する機能であり、その高速性を活用することがSetを使いこなす鍵となります。

また、Setには順序の概念がないため、Listのようにインデックス番号を指定して特定の要素を取り出すことはできません。 Setに含まれる全ての要素にアクセスしたい場合は、「拡張for文」を用います。 for (String s : colors) のように記述することで、Set内の各要素を順番に取り出して処理できます。 これらの基本的な操作をマスターし、Setというデータ構造を自在に扱えるスキルを身につけます。

キーワード ① Setインターフェース ② HashSet ③ ハッシュ値 ④ 木構造
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習: HashSetとTreeSetについて、どのような場合にどちらを選択すべきか、その理由を「速度」と「順序性」の観点から説明できるように準備してください。また、HashSetが高速に要素を検索できる仕組みを、「ハッシュ値」というキーワードを用いて説明してください。
72 HashMapの定義と使用 科目の中での位置付け Mapは「キーで探せる辞書」のことである。put/getで追加・取得し、keySet+forで全データ処理できるため、非常に有用であり、その学修を行う。
コマ主題細目 ① Mapの概念と有用性 ② Mapの基本的な操作(生成・追加・取得) ③ Mapの要素の反復処理と応用
細目レベル ① プログラミングにおいて、複数のデータをまとめて管理する方法として、これまでListなどを学んできました。今回の授業で学ぶMapは、それらとは少し異なる特徴を持つ、非常に強力で実用的なデータ構造です。Mapの最大の特徴は、「キー(Key)」と「値(Value)」をペアにしてデータを格納する点にあります。 これは、現実世界の「辞書」で単語(キー)を引くと意味(値)がわかるように、あるいは商品カタログで商品名(キー)を調べると価格(値)がわかるように、ある情報とそれに対応する情報を関連付けて管理したい場合に非常に役立ちます。

Mapはインターフェースとして定義されており、その実装クラスとしてHashMapやTreeMapなどが提供されています。

HashMapは、内部的に「ハッシュ」という仕組みを利用することで、キーを指定して値を非常に高速に取り出すことを得意とします。 一方、TreeMapはキーを自動的にソート(整列)して保持するという特徴があります。 どちらも重要ですが、実務においては、その高速性からHashMapが使われる場面が非常に多いです。 この授業では、まずこのHashMapを中心に、Mapの基本的な考え方と使い方をマスターしていきます。ITエンジニアとしては、単にデータを格納するだけでなく、データ間の「関連性」をいかに効率よくプログラムで表現し、高速にアクセスできるかを考えることが重要であり、Mapはそのための第一歩となる重要な知識です。

② Mapを利用するには、まずインスタンスを生成する必要があります。Map<キーの型, 値の型> 変数名 = new HashMap<>(); のように記述し、キーと値にどのようなデータ型を使うかをジェネリクス(<>)で明示します。 例えば、商品名をキー(String型)、価格を値(Integer型)とする場合は Map となります。注意点として、ジェネリクスにはintのようなプリミティブ型は指定できず、Integerのようなラッパークラスを指定する必要があります。

Mapにデータを追加するにはput()メソッドを使用します。 put(キー, 値)と記述することで、キーと値のペアをMapに格納できます。もし同じキーで再度put()を実行した場合、新しい値で上書きされるという点も重要な特徴です。そして、Mapの真価を発揮するのがget()メソッドです。

get(キー)と記述することで、指定したキーに対応する値を瞬時に取得できます。 これはListがインデックス(番号)で要素を特定するのとは対照的で、より直感的かつ高速なデータアクセスを可能にします。このput()とget()はMapを扱う上で最も基本となる操作であり、あらゆる場面で利用するため、確実に理解し使いこなせるようになることが求められます。

③ Mapに格納されている全てのデータに対して、順番に何らかの処理を行いたい場合も多くあります。しかしMapはListと異なり、要素に順序の概念がなく、インデックス番号で要素を一つずつ取り出すことはできません。 そこで用いるのが、keySet()メソッドと拡張for文を組み合わせた方法です。

まずkeySet()メソッドを呼び出すと、Mapに格納されている全てのキーがSetとして返されます。 Setはキーの集合なので、これに対して拡張for文を使えば、キーを一つずつ取り出すことができます。そして、ループの中で取り出したキーをget()メソッドに渡すことで、対応する値を取得できます。 この「keySet()でキーループを回し、get()で値を取得する」という一連の流れは、Map内の全データを処理する際の定石パターンです。実務では、設定ファイルの内容をMapで管理したり、データベースから取得したユーザー情報をIDをキーにしてMapに格納したりと、このパターンは頻繁に登場します。この手法をマスターすることで、単にデータを格納するだけでなく、格納したデータを自在に活用する応用力が身につきます。

キーワード ① Mapインターフェース ② HashMapクラス ③ putメソッド ④ keySetメソッド
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において該当コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 復習
授業で作成した商品メニューのMap(変数名menu)に対して、以下の操作を行うプログラムを作成してください。

putメソッドを使い、新商品「coffee」(価格: 180円)を追加する。
putメソッドを使い、既存商品「potato」の価格を「160円」に更新する。
keySetメソッドと拡張for文、printfメソッドを使い、最終的な全商品のメニューを以下の形式でコンソールに出力する。

出力形式例
burger : 100 yen
potato : 160 yen
(他の商品も同様に表示)

73 例外とは何か、例外クラスの階層構造 科目の中での位置付け 本講義では、プログラム実行時における非決定的な異常事態に対処するための基本的な枠組みとして、Javaにおける例外処理機構の基礎理論を体系的に学習する。
コマ主題細目 ① 例外と例外クラスの階層構造 ② 基本的な例外処理(try-catch構文) ③ 複数の例外への対処と注意点
細目レベル ① どんなに優れたプログラマが書いたコードでも、予期せぬ事態は起こり得ます。例えば、ユーザーが数値を入力すべきところに文字を入力したり、ネットワークが突然切断されたり、あるいは単純なプログラムのバグで配列の範囲外にアクセスしてしまったり。こうしたプログラム実行時の「予期せぬエラー」を、Javaでは例外(Exception)と呼びます。
優れたプログラムとは、ただ正しく動くだけでなく、こうした例外が発生した際に、強制終了せずに適切に対処できる「堅牢性」を兼ね備えたものです。そのために不可欠なのが「例外処理」の知識です。
Javaの例外は、Throwableクラスを頂点とする階層構造になっています。 まず、大きく2つに分かれることを理解しましょう。
 Errorクラス: メモリ不足など、システムレベルで発生する回復不可能な致命的なエラーです。 これらはプログラマがコードで対処すべきものではありません。
 Exceptionクラス: これが、私たちがプログラムで対処すべき例外の親玉です。
さらにExceptionクラスは、その性質から2種類に分類されます。この区別はJavaエンジニアとして非常に重要です。
 検査例外 (Checked Exception): IOExceptionなど、コンパイラが「例外処理を記述したか?」をチェックする例外です。 ファイルの読み書きなど、プログラムの外部環境に依存する処理で発生しやすく、処理を書かないとコンパイルエラーになります。つまり、Javaが「この処理はエラーになる可能性が高いから、備えておきなさい」と教えてくれているのです。
 非検査例外 (Unchecked Exception / RuntimeException): ArrayIndexOutOfBoundsExceptionやNullPointerExceptionなど、主にプログラマの論理的なミス(バグ)が原因で発生する例外です。 これらは処理を強制されませんが、発生させないコーディングを心がけるべきものです。

② 例外が発生した場合にプログラムを強制終了させず、適切な対応を行うための仕組みがtry-catch構文です。 これは例外処理の最も基本的な形で、使い方を必ずマスターする必要があります。
tryブロック: 例外が発生する可能性のある「危険なコード」をこのブロックで囲みます。 Javaはまずこの中の処理を実行しようと試みます(Try)。
catchブロック: tryブロック内で例外が発生した場合、その瞬間に処理が中断され、対応するcatchブロックに処理が移ります。 ここに、例外発生時の代替処理や、ユーザーへの通知、エラーログの記録などを行います。
もしtry-catchがなければ、例外が発生した時点でプログラムは即座に停止してしまいます。 しかし、catchブロックで例外を捕捉(キャッチ)することで、プログラムの異常終了を防ぎ、処理を継続させることが可能になります。
catchブロックで特に重要なのが、受け取った例外オブジェクトが持つprintStackTrace()メソッドです。 このメソッドを実行すると、「どのクラスの、どのメソッドの、何行目で」例外が発生したかという詳細な履歴(スタックトレース)が表示されます。エラーの原因を突き止める「デバッグ作業」において、この情報は犯人特定の最も強力な手がかりとなります。プロの開発現場では、エラーログにこの情報を記録しておくのが定石です。

③ 一つのtryブロックの中で、複数の異なる種類の例外が発生する可能性は十分にあります。その場合、catchブロックを複数連結させることで、例外の種類に応じた個別の対応ができます。
try {
// 複数の例外が発生しうる処理
} catch (FileNotFoundException e) {
// ファイルが見つからなかった場合の処理
} catch (IOException e) {
// その他の入出力エラーの処理
}
ここで、絶対に守らなければならない非常に重要なルールがあります。それは、catchブロックの記述順序です。複数のcatchブロックを定義する場合、必ずサブクラス(より具体的・詳細な例外)を先に、スーパークラス(より包括的な例外)を後に記述しなければなりません。

もしExceptionのようなスーパークラスを先に書いてしまうと、そのサブクラスであるRuntimeExceptionなどもすべてそのcatchブロックで捕捉されてしまいます。その結果、後続のサブクラス専用のcatchブロックには決して処理が到達しないため、コンパイラが「到達不可能なコード」としてエラーを出すのです。

このルールを理解した上で、あらゆる想定外の例外を捕捉するための「セーフティネット」として、最後にcatch (Exception e)を記述するのは非常に有効なテクニックです。 これにより、個別に想定した例外以外でプログラムが停止してしまうリスクを大幅に減らすことができます。

キーワード ① 例外処理 ② try-catch構文 ③ 検査例外 (Checked Exception) ④ printStackTrace() ⑤ catchブロックの順序
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
Integer.parseInt("abc"); を実行することでNumberFormatExceptionを意図的に発生させ、catchブロックでこれを捕捉し、適切なエラーメッセージを出力するプログラムを実装し、その挙動を検証すること。

◆次回授業の予習
第74回講義の主題である、より高度な例外処理(マルチキャッチ、finallyブロック)に関する予備的調査を行うこと。

74 例外のマルチキャッチ 科目の中での位置付け 基本的な例外捕捉の概念を基に、複数の例外を効率的に扱う構文、リソース管理に不可欠な処理保証の機構、そして例外発生時における詳細なプログラムフローの制御について理解を深める。
コマ主題細目 ① 高度な例外処理:例外のマルチキャッチ ② 処理の保証:finallyブロックの役割 ③ 例外処理とプログラムフローの完全理解
細目レベル ① 高度な例外処理:例外のマルチキャッチ
プログラムを開発する上で、予期せぬエラー、すなわち例外への対処は、システムの安定性を保つために不可欠なスキルです。通常、発生しうる例外の種類ごとに対処法(catchブロック)を記述しますが、時には複数の異なる例外に対して、まったく同じエラー処理を行いたいケースがあります。例えば、ユーザーの入力ミスが原因で発生する「数値を期待した箇所に文字が入力された( NumberFormatException )」場合と、「そもそも何も入力されなかった( NullPointerException )」場合は、原因は異なれど「入力データが不正です」という同じメッセージを返したい、といった状況です。

Java SE 7から導入された例外のマルチキャッチは、このような場合に絶大な効果を発揮します。 catchブロックにおいて、パイプ記号(|)を使って複数の例外クラスを並べることで、コードを重複させることなく、一つの処理ブロックにまとめられます。 これにより、ソースコードはより簡潔で読みやすくなり、メンテナンス性も向上します。ITエンジニアとしては、単に例外を捕捉するだけでなく、「どのようなエラーを同じグループとして扱うか」という設計思想を持つことが、高品質なコードを書く上で極めて重要になります。このセクションでは、マルチキャッチの具体的な記述方法とその有効性を学びます。

② 例外処理において、catchブロックと並んで重要なのが finallyブロックです。finallyブロックに記述された処理は、tryブロック内で例外が発生したかどうかに関わらず、必ず実行されるという極めて重要な特性を持ちます。

この「必ず実行される」という特性がなぜ重要なのでしょうか。実務では、プログラムがファイルを開いたり、データベースに接続したりと、外部の「リソース」を利用する場面が頻繁にあります。これらのリソースは、利用が終わったら必ず「閉じる(解放する)」処理を行わないと、システム全体に深刻な問題(リソースリーク)を引き起こす可能性があります。もし、リソースを利用している途中で予期せぬ例外が発生し、閉じる処理がスキップされてしまったら大変です。

そこでfinallyブロックの出番です。リソースを閉じる処理をfinallyブロックに記述しておくことで、処理が正常に終わっても、途中で例外が発生しても、確実にリソースを解放できます。try文にはcatchブロックかfinallyブロックのどちらか(または両方)が必須であり 、特にリソースを扱う際にはfinallyブロックによる後処理の保証が、プログラムの堅牢性を支える根幹技術となります。

③ try-catch-finally構文は、単なるエラー処理の仕組みではなく、プログラムの複雑な実行フローを制御するための強力なツールです。この三者の連携によってプログラムがどのように動作するのか、その流れを正確に理解することが必須です。

具体的には、以下の3つのパターンを明確に区別できなければなりません。

例外が発生しない場合: tryブロックの処理が最後まで実行され、その後finallyブロックが実行されます。

catchで捕捉できる例外が発生した場合: tryブロックの処理は中断され、対応するcatchブロックが実行され、その後finallyブロックが実行されます。

catchで捕捉できない例外が発生した場合: tryブロックは中断されます。対応するcatchブロックがないため、finallyブロックが実行された直後にプログラムは強制終了します。

本授業で扱うFinallyTest.javaのサンプルコードは、まさにこの3番目のパターンを学ぶためのものです。 catchで捕捉できないArrayIndexOutOfBoundsException が発生しても、finallyブロックの処理("y"の出力)は実行され、その後の処理("z"の出力)は行われずにプログラムが停止する様子を確認します。 この一連のフローを正確に把握することは、デバッグ作業や、意図した通りに動作する安定したアプリケーションを構築するための基礎体力となります。

キーワード ① 例外のマルチキャッチ ② finallyブロック ③ ArrayIndexOutOfBoundsException ④ プログラムフロー制御 ⑤ リソース解放
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
複数の例外が発生しうるコードを実装し、複数のcatchブロックを用いて、発生した例外に応じて処理が正しく分岐することを検証すること。

◆次回授業の予習
第75回講義の主題であるthrowおよびthrowsキーワードを用いた、能動的な例外生成と責務の委譲に関する予備的調査を行うこと。

75 例外のスロー 科目の中での位置付け 受動的な例外捕捉に加え、設計者が意図した条件で例外を能動的に発生させる手法と、例外処理の責務を呼び出し元へ転嫁する機構について学習し、より高度なエラーハンドリング設計を可能にする。
コマ主題細目 ① 例外処理の課題と新たな手法 ② 例外の意図的な生成(throw)と可能性の宣言(throws) ③ 呼び出し元への例外処理の委譲と集約
細目レベル ① プログラムを作成する上で、「例外(Exception)」、つまり予期せぬエラーへの対処は避けて通れません。皆さんもこれまでに、プログラムが異常終了する場面に遭遇したことがあるでしょう。Javaには、こうした例外を捕捉し、プログラムが停止することなく処理を続けるための仕組みとして try-catch ブロックが用意されています。

しかし、プログラムの規模が大きくなり、構造が複雑化してくると、例外が発生しうる全ての箇所にtry-catchを記述するのは現実的ではありません。 なぜなら、同じような例外処理のコードがプログラムのあちこちに散在してしまい、コードの可読性が下がるだけでなく、後から修正が必要になった場合のメンテナンスが非常に困難になるためです。

この授業では、この課題を克服するための、より洗練された例外処理のテクニックを学びます。それが throw と throws という2つのキーワードです。 これらを使いこなすことで、堅牢で保守性の高いプログラムを設計するスキルを身につけます。

② throwとthrowsは名前が似ていますが、その役割は明確に異なります。

まず throw は、開発者が意図的に例外インスタンスを生成し、それを「投げる(スローする)」ために使用します。 例えば、メソッドに不正な値が引数として渡された場合など、プログラムの仕様として「これは異常事態である」と判断した際に、throwを使って能動的に例外を発生させることができます。 これにより、エラーの発生をより明確にシステムに通知することが可能になります。

一方 throws は、メソッドの定義部分(シグネチャ)に記述し、「このメソッドは、処理の過程で特定の例外を投げる可能性があります」ということを、このメソッドを呼び出す側に宣言(通知)するためのものです。

throwsが宣言されたメソッドを呼び出す側は、その例外をtry-catchで処理するか、あるいはさらにthrowsを使って呼び出し元に処理を委譲する責任を負います。これは、メソッドを利用する上での「契約」と考えることができ、安全なプログラム連携を実現するための重要な仕組みです。

③ throwsキーワードの最も重要な役割は、例外処理の責任を呼び出し元に「委譲(または転嫁)」できる点にあります。 メソッド内で発生した例外をその場で処理せず、throwsを使って呼び出し元に投げることで、実際の例外処理を別の場所に集約させることが可能になります。

例えば、メソッドCがメソッドBから、メソッドBがメソッドAから呼び出されるような多層構造を考えてみましょう。 メソッドCで発生した例外は、メソッドCとBにthrowsが宣言されていれば、次々と呼び出し元へ伝播していき、最終的にメソッドAのtry-catchブロックで一括して捕捉・処理することができます。

この仕組みにより、エラーハンドリングのロジックを1箇所にまとめることができ、プログラム全体の構造がシンプルになります。 どこでエラーが発生しても、対処する場所が決まっているため、コードの可読性や保守性が劇的に向上します。これは特にチームでの大規模開発において不可欠な設計思想であり、皆さんが将来ITエンジニアとして活躍するために必ず習得すべき重要なスキルと言えるでしょう。

キーワード ① throw ② throws ③ 例外の委譲 ④ 例外処理の集約 ⑤ 呼び出し元
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
メソッド引数の妥当性検証を行い、不正な値が検出された場合にIllegalArgumentExceptionをthrowするメソッドを実装し、呼び出し元でこれをcatchする一連の処理を完成させること。
◆次回授業の予習
第76回講義で実施する演習課題の仕様を精読し、これまで学修した例外処理技術をどのように適用すべきか、その設計プランを考察すること。

76 例外処理(演習) 科目の中での位置付け これまでに学んだ例外処理に関する全ての知識を統合し、具体的な仕様に基づいたプログラムを設計・実装することを通じて、実践的な問題解決能力と堅牢なコードを構築する技術を涵養する。
コマ主題細目 ① 例外処理の応用演習:try-catch-finallyとフロー追跡 ② 例外の生成と伝播:throwとthrowsによるメソッド設計 ③ 実践的エラーハンドリング:例外処理の一元管理と堅牢性の確保
細目レベル ① 本演習では、まず例外処理の基本であるtry-catch-finally構文について、より実践的なコーディングを通して理解を深めます。最初に、複数の異なる例外を一つのcatchブロックで効率的に処理するマルチキャッチを実装します。NullPointerExceptionとNumberFormatExceptionを|(パイプ)記号でまとめて捕捉することで、コードの簡潔性と可読性が向上します。

次に、例外の有無にかかわらず必ず実行されるfinallyブロックの重要性を学びます。リソースの解放など、処理の最後に必須となる手続きをfinallyに記述する習慣を身につけます。さらに、デバッガを使い、catchで捕捉できない例外(ArrayIndexOutOfBoundsExceptionなど)が発生した際のプログラムの挙動を一行ずつ追跡します。tryからfinallyへ処理が移り、その後プログラムが強制終了する流れを正確に把握することで、複雑なエラー発生時の問題解決能力を養います。

② try-catchが例外を「捕まえる」技術なら、throwとthrowsは例外を「生成し、伝播させる」ための技術です。このセクションでは、メソッド開発者の視点に立ち、意図的に例外を発生させる方法を学びます。

まず、if文などでメソッドの引数が不正であるといった特定の条件を検知し、throwキーワードを用いて能動的に例外を投げます。これは、メソッドが不正な状態で使用されることを防ぎ、問題の発生を即座に知らせるための重要な設計技術です。次に、例外を投げる可能性のあるメソッドにはthrowsキーワードを宣言します。これにより、そのメソッドを呼び出す側にtry-catchによる例外処理をコンパイラレベルで強制できます。このthrowsの宣言は、メソッドを利用する上での「契約」となり、チーム開発における安全性と信頼性を確保する上で不可欠です。

③ 最後に、これまで学んだ知識を総動員し、実践的なエラーハンドリングの設計を完成させます。複数のメソッドがそれぞれthrowsで例外の発生を宣言している状況を想定し、それらを呼び出すメインの処理側で、一か所のtry-catchブロックで例外をまとめて処理する演習を行います。

この演習の目的は、例外処理ロジックの一元管理がもたらすメリットを実感することです。エラー処理がプログラムのあちこちに分散することを防ぎ、コード全体の可読性と保守性を飛躍的に向上させる設計パターンを習得します。throwで問題を通知し、throwsで処理を促し、呼び出し元で一括対応する。この一連の流れを自身で実装することで、堅牢で質の高いアプリケーションを構築するためのエラーハンドリング設計思想を確立します。

キーワード ① try-catch-finally ② 例外のマルチキャッチ ③ throw / throws ④ メソッドの契約 ⑤ 例外処理の一元管理
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
演習で実装したコードをレビューし、例外処理の網羅性、およびエラー通知の適切性について批判的に評価すること。

◆次回授業の予習
第77回講義の主題である「独自例外クラス」について、標準APIの例外では表現できない業務ドメイン固有のエラーを定義する必要性とその方法論について、予備的調査を行うこと。

77 独自例外の作成 科目の中での位置付け Java標準の例外クラスでは表現できない、アプリケーションの業務ドメインに特化したエラー状態を定義するための独自例外クラスの設計・実装手法を学ぶ。
コマ主題細目 ① 独自の例外クラスの必要性 ② 独自の例外クラスの定義方法 ③ 独自の例外の発生と例外処理
細目レベル ① これまでの学習で、プログラム実行中に発生する予期せぬ事態、すなわち「例外」を処理するために try-catch 文を用いることを学びました。Javaには NullPointerException や ArrayIndexOutOfBoundsException など、あらかじめ多くの例外クラスが用意されています。これらは、プログラムの文法的な誤りや、実行時のシステムレベルでの問題を捉えるのに非常に有効です。

しかし、実際のアプリケーション開発では、これらの標準的な例外だけでは表現しきれない、より具体的で業務に特化したエラー状況に対応する必要があります。例えば、銀行システムの「残高不足」、ECサイトの「在庫切れ」、あるいは会員登録における「無効な年齢入力」といったケースです。これらはプログラムの文法的な間違いではなく、「業務上のルール(ビジネスロジック)に反する」というエラーです。

このような状況を、Java標準の例外クラスで代用しようとすると、エラーの原因が何であるかが曖昧になり、プログラムが読みにくく、保守しにくいものになってしまいます。そこで、開発者自身がエラーの状況に合わせて独自の例外クラスを定義する必要が出てきます。独自の例外クラスを作成することで、エラーの種類を明確に識別し、プログラムの可読性と堅牢性を大幅に向上させることが、この授業の重要な目的です。

② 独自の例外クラスを作成するのは、決して難しいことではありません。基本的なルールは、JavaのException クラス、またはそのサブクラスを「継承」して新しいクラスを定義することです。Exception クラスを継承することにより、私たちが作るクラスはJavaの例外処理メカニズムの一部として正式に認識され、try-catch 文などで扱えるようになります。

クラスを定義する際には、通常2つのコンストラクタを用意します。 一つは引数を持たないデフォルトコンストラクタです。 もう一つは、例外が発生した具体的な原因を示す文字列メッセージを引数として受け取るコンストラクタです。 このメッセージ付きコンストラクタ内では、super(message) というコードを記述します。 これは、受け取ったメッセージを親クラスである Exception クラスのコンストラクタに渡すための決まり文句であり、これによりエラーメッセージが例外オブジェクト内に正しく保持されます。

重要な点として、このようにException クラスを直接継承して作成した例外は「検査例外(Checked Exception)」として扱われます。 検査例外は、コンパイル時にチェックされるため、プログラマに例外処理を強制する性質を持ちます。これにより、エラー処理の記述漏れを防ぎ、より安全なプログラムを作成することが可能になります。

③ 定義した独自の例外クラスをプログラム中で使用するには、特定の条件が満たされたときに、その例外を意図的に「発生」させる必要があります。この操作には throw キーワードを使用します。 具体的には、throw new MyException("具体的なエラー内容"); のように、作成した例外クラスのインスタンスを生成し、それを throw します。 これにより、プログラムの通常の実行フローは中断され、例外処理のフェーズへと移行します。

先述の通り、私たちが作成した例外は「検査例外」です。したがって、この例外を throw する可能性があるメソッドでは、必ず以下のいずれかの対応がコンパイラによって強制されます。

(1)try-catch 文を使って、その場で例外を捕捉し、対処する。
(2)メソッドの定義に throws 句を追加し、このメソッドの呼び出し元に例外処理の責任を委譲(転送)する。

どちらの方法を選択するかは、プログラムの設計によりますが、エラーが発生した状況を最もよく知る場所で処理を行うのが基本です。サンプルコード では、throw した MyException を直後の catch ブロックで捕捉し、例外オブジェクト e を出力しています。 このように、独自の例外を適切に定義し、throw と try-catch を組み合わせて活用することで、業務ロジックに沿った、きめ細やかで分かりやすいエラーハンドリングを実現できるのです。

キーワード ① オーバーライド (Override) ② 例外処理 (Exception Handling) ③ throws句 (throws clause) ④ 検査例外 (Checked Exception) ⑤ ポリモーフィズム (Polymorphism)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
作成した独自例外クラスに対し、エラーコードや発生時刻といった付加情報を保持するフィールドを追加実装し、catchブロックでその情報にアクセスできることを確認すること。

◆次回授業の予習
第78回講義の主題である「継承における例外処理の制約」について、メソッドオーバーライドの際にthrows句に課されるルールを調査すること。

78 例外とオーバーライド 科目の中での位置付け オブジェクト指向における重要な二つの概念、すなわちメソッドのオーバーライドとポリモーフィズムが、Javaの例外処理機構、特にthrows宣言とどのように相互作用し、どのような制約を生むのかを理論的に解明する。
コマ主題細目 ① 継承と例外処理の基礎 ② メソッドオーバーライドにおける例外の制約 ③ ポリモーフィズムと例外のルールがもたらす堅牢性
細目レベル ① オブジェクト指向プログラミングにおいて、継承(Inheritance)は既存のクラス(スーパークラス)の機能を引き継ぎ、新たなクラス(サブクラス)を作成するための強力な仕組みです。サブクラスでは、スーパークラスのメソッドをそのまま利用したり、あるいは独自の振る舞いを再定義するオーバーライド(Override)を行ったりすることで、プログラムの拡張性と保守性を高めることができます。

一方、プログラムの安定性を確保するために不可欠なのが**例外処理(Exception Handling)です。ファイルの読み書きやネットワーク通信など、プログラムの実行中に予期せぬエラーが発生する可能性のある処理では、「検査例外(Checked Exception)」と呼ばれる例外への対処がJavaコンパイラによって強制されます。メソッド内で発生した検査例外を処理せず、そのメソッドの呼び出し元に処理を委ねる場合に用いるのがthrows句です。このthrows句は、メソッドのシグネチャ(名前、引数リスト)の一部と見なされ、そのメソッドを利用する上での「契約」として機能します。

この「オーバーライド」と「throws句で宣言される例外」という2つの概念が交差する領域に焦点を当てます。これらは個別に理解するだけでなく、両者の関係性を正確に把握することが、信頼性の高いクラス設計を行う上で極めて重要となります。

② スーパークラスのメソッドをサブクラスでオーバーライドする際、そのメソッドが投げる例外には厳格なルールが課せられます。なぜなら、オーバーライドは単なるメソッドの上書きではなく、スーパークラスで定義された「契約」を引き継ぐ行為だからです。スーパークラスのメソッドがthrows句で宣言した例外は、その契約の一部です。したがって、サブクラスは、その契約を逸脱しない範囲でしかメソッドを再定義できません。

具体的には、サブクラスのオーバーライドメソッドがthrows句に記述できる例外は、以下の3つのパターンのいずれかに限定されます。

(1) スーパークラスのメソッドが宣言している例外と全く同じ例外
(2) スーパークラスのメソッドが宣言している例外のサブクラス(より具体的・詳細な例外)
(3) 例外を宣言しない(throws句を記述しない)

逆に、スーパークラスが宣言していない新たな種類の検査例外や、スーパークラスが宣言する例外よりも広範な例外(親クラスの例外)をthrows句で宣言しようとすると、コンパイルエラーとなります。 これは、サブクラスがスーパークラスの「契約」を一方的に破っていると見なされるためです。

③ この一見複雑に見えるルールは、Javaの重要な特徴であるポリモーフィズム(Polymorphism / 多態性)の安全性を担保するために存在します。ポリモーフィズムとは、スーパークラス型の変数に、そのサブクラスのインスタンスを代入できる性質を指します。

例えば、ExOverrideSuper obj = new ExOverrideSub();のように、スーパークラスの型でサブクラスのインスタンスを扱った場合を考えてみましょう。この時、obj.method()を呼び出すコードを書くプログラマは、ExOverrideSuperクラスのmethod()の仕様(契約)を見て、どのような例外が発生しうるかを判断し、それに応じた例外処理を記述します。

もし、サブクラスがスーパークラスの契約を無視して、全く予期しない例外を投げることが許されてしまうとどうなるでしょうか。呼び出し側のプログラマが記述した例外処理では捕捉できず、プログラムは予期せぬ形で異常終了してしまうでしょう。

オーバーライドにおける例外の制約は、このような事態を防ぎ、「スーパークラスの型として扱っている限り、そのインスタンスが実際にどのサブクラスのものであっても、宣言されている範囲の例外しか発生しない」ことを保証してくれるのです。このルールを理解し遵守することは、APIの設計やライブラリの開発といった、他者に使われることを前提としたコードを書く際に、極めて重要なエンジニアとしての責務となります。

キーワード ① オーバーライド (Override) ② 例外処理 (Exception Handling) ③ throws句 (throws clause) ④ 検査例外 (Checked Exception) ⑤ ポリモーフィズム (Polymorphism)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
スーパークラスのメソッドが送出する例外よりも、より特異的な(サブクラスの)例外を送出するようにオーバーライドが可能であることを、具体的なコードを実装して実証すること。

◆次回授業の予習
第79回講義で実施する独自例外に関する演習課題の仕様を精読し、どのような業務ルール違反に対して、どのような独自例外を設計・送出すべきかの計画を立案すること。

79 独自例外(演習) 科目の中での位置付け 独自例外の概念を具体的な業務ドメイン(銀行口座管理)に適用し、ビジネスロジックとエラーハンドリングを密接に連携させる設計・実装スキルを実践的に習得する。
コマ主題細目 ① 演習課題の概要と例外処理設計 ② 演習課題の実装:独自の例外を用いたプログラミング ③ コードレビューと応用的な考察
細目レベル ① この演習では、前回学んだ「独自の例外」の知識を使い、より実践的な例外処理のプログラミングに取り組みます。目的は、単にtry-catch文法を覚えることではなく、「どのような状況で」「どのような例外を」「どのように処理すべきか」を自ら考えて設計し、実装するスキルを養うことです。

今回の演習課題は、「銀行口座の残高管理」という身近なテーマを扱います。具体的には、口座クラスを作成し、入金・出金・残高照会の機能を持たせます。この中で重要なのが出金処理です。「出金額が現在の残高を超えている」という状況は、プログラムの文法的なエラーではありませんが、業務上のルール(ビジネスロジック)として明確に禁止すべき事態です。

このような状況に対応するため、まずはJava標準の例外では表現しきれない「残高不足」というエラーを表現するための独自の例外クラス(例:InsufficientBalanceException)を設計します。どのようなメッセージをエラー発生時に伝えるべきか、どのような情報を例外に含めるべきかを考えることが、適切な例外処理設計の第一歩となります。この設計フェーズを通じて、堅牢で分かりやすいプログラムの土台を築きます。

② 設計が完了したら、実際にコーディングに移ります。このフェーズでは、一連の例外処理の流れを自分の手で作り上げることで、知識を確実なスキルへと昇華させます。

実装は以下のステップで進めます。

独自の例外クラスの作成: まず、設計に基づき InsufficientBalanceException クラスを Exception クラスを継承して作成します。エラーメッセージを受け取るコンストラクタを忘れずに定義しましょう。

ビジネスロジックと例外の送出: 次に、銀行口座クラスに withdraw(出金)メソッドを実装します。このメソッド内で、引数として受け取った出金額と現在の残高を比較し、もし残高が不足していれば throw new InsufficientBalanceException("残高が不足しています。"); のようにして、作成した独自の例外インスタンスをスロー(送出)します。

例外の捕捉とハンドリング: 最後に、この withdraw メソッドを呼び出す側の処理(例えば main メソッド)を記述します。withdraw メソッドは検査例外をスローする可能性があるため、呼び出しは try-catch ブロックで囲む必要があります。catch ブロックでは、捕捉した例外からメッセージを取り出し、「出金に失敗しました:残高不足」といったユーザーフレンドリーなメッセージを表示する処理を実装します。

この一連の実装を通じて、例外を「定義」し、「発生」させ、「捕捉して対処する」という例外処理の王道パターンを体得します。

③ プログラムが完成したら、それで終わりではありません。書いたコードを客観的に見直し、より良いものへと改善していくプロセスは、エンジニアにとって非常に重要です。このセクションでは、ペアやグループで互いのコードをレビュー(相互確認)し、フィードバックを与え合います。他者のコードを読むことで、自分では思いつかなかった例外処理のアプローチや、より良い設計のヒントを得ることができます。

また、自身のコードを振り返り、「なぜこの場所で例外をスローしたのか」「catch した後の処理は本当に適切か」「finally ブロックを追加して、必ず実行すべき処理を記述する必要はないか」といった問いを通じて、設計の意図を深く考察します。

さらに、「もしこの例外を RuntimeException を継承して非検査例外として定義したら、プログラムはどう変わるか?」といった応用的なテーマについても議論します。この演習で身につけた例外処理設計と実装のスキルは、あらゆるJavaアプリケーション開発において、エラーに強く、信頼性の高いコードを書くための基礎となります。

キーワード ① 例外処理設計 ② ビジネスロジック ③ throwによる例外送出 ④ try-catch-finally ⑤ コードの堅牢性
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
演習で実装したプログラムに対し、独自例外が仕様通りに送出され、呼び出し元で適切に捕捉されることを検証するためのテストケースを作成し、実行すること。

◆次回授業の予習
第80回講義の主題であるファイルI/Oについて、特にリソース管理を安全に行うためのtry-with-resources構文の役割とメカニズムを調査すること。

80 ファイルの読み込みと書き込み(1) 科目の中での位置付け プログラムが扱うデータを永続化するための基本的なI/O操作として、テキストファイルへのデータ書き込みに関するクラス群と、その効率的な利用法を学ぶ。
コマ主題細目 ① java.io パッケージとファイル・ディレクトリの管理 ② ファイルへのデータ書き込みとFileWriterクラス  ③ BufferedWriterクラスと効率的な書き込み処理
細目レベル ① この授業では、Javaにおけるファイル入出力の基本を学びます。まず、コンピュータの日常的な操作である「ファイルの保存」や「ファイルの読み込み」といった処理をJavaのプログラムで行うための仕組みを理解します。ファイルやディレクトリ(フォルダ)の操作は、java.ioパッケージにあるFileクラスが担います。このクラスは、ファイルの実体を操作するのではなく、あくまでファイルやディレクトリのパス名(場所を示す文字列)を管理するためのクラスです。ファイル自体の新規作成、検索、削除、ディレクトリの作成などに利用されます。プログラミングにおいて、ファイルへのアクセスは欠かせない土台となります。
② 次に、実際にファイルへデータを書き込む方法を学びます。テキストファイルに文字を書き出す際には、FileWriterクラスを使用します。このクラスは、Fileクラスで管理されているパス情報を使って、ファイルへの書き込み専用の「ストリーム」を生成します。ストリームとは、Javaがデータの入出力を扱うための概念で、データの「流れ」を意味します。FileWriterクラスのwrite()メソッドで書き込む文字列を指定し、flush()メソッドで実際にファイルへ書き込みを行います。複数行書き込みたい場合は、文字列に改行コード\nを含める必要があります。
③ 最後に、より効率的なファイル書き込みの方法として、BufferedWriterクラスを学びます。FileWriterクラスは、文字を書き込むたびにディスクへの書き込みが発生する可能性がありますが、BufferedWriterクラスは「バッファリング」という仕組みによって、一時的にデータをメモリに溜め込み、まとめて書き込むことで処理を効率化します。また、FileWriterでは手動で\nを記述する必要がありましたが、BufferedWriterにはnewLine()メソッドが用意されており、これを利用することで簡単に改行を挿入できます。このように、FileWriterクラス単独よりもBufferedWriterクラスと組み合わせて使用することで、より効率的で扱いやすいファイル書き込み処理が可能になります。これらのクラスを利用する際は、IOExceptionという例外が発生する可能性があるため、try-catch文やthrowsキーワードによる例外処理が必須となります。
キーワード ① java.ioパッケージ ② ストリーム ③ ファイル書き込み ④ BufferedWriter ⑤ IOException
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
FileReaderおよびBufferedReaderを用いて、任意のテキストファイルを作成し、その内容を一行ずつ標準出力に表示するプログラムを実装すること。
◆次回授業の予習
第81回講義の主題であるファイルからのデータ読み込み、およびI/O処理全般に共通する例外処理とリソース管理の重要性について考察すること。

81 ファイルの読み込みと書き込み(2) 科目の中での位置付け ファイルへの書き込みと対になる操作として、テキストファイルからデータを読み込むためのクラス群と、大規模なデータを効率的かつ安全に処理するための定石を学ぶ。
コマ主題細目 ① ファイルからのデータ読み込みとFileReaderクラス ② BufferedReaderクラスと効率的な読み込み処理 ③ ファイル入出力における例外処理とストリームのクローズ
細目レベル ① この授業では、前回のファイル書き込みに引き続き、ファイルからデータを読み込む方法を学びます。テキストファイルからデータを読み取る際には、java.ioパッケージのFileReaderクラスを使用します。FileReaderクラスは、Fileクラスで管理されたファイルパスを参照し、ファイルからデータを読み込むための「入力ストリーム」を生成します。FileReaderのread()メソッドは、ファイルの内容を1文字ずつ読み取り、指定されたchar型配列に格納します。また、読み取った文字数をint型の戻り値で返してくれるため、データのサイズを把握することができます。この方法では、読み込むデータ量に合わせて配列の要素数を適切に設定する必要があるため、少し手間がかかる面もあります。
② そこで、より効率的な読み込み方法として、BufferedReaderクラスを学びます。BufferedWriterと同様に、BufferedReaderもFileReaderと組み合わせて使う「連結ストリーム」です。このクラスは、バッファリングによって効率的な読み込み処理を実現します。特に重要なのがreadLine()メソッドです。このメソッドは、ファイルの内容を1行単位で読み取り、String型として返します。ファイルの末尾に達するとnullを返すため、これをwhile文の条件として利用することで、ファイル全体を簡単に読み込むことができます。BufferedReaderを使用することで、1文字ずつの処理ではなく、行単位での処理が可能となり、テキストファイルの読み込みが非常に効率的になります。実務では、この方法が一般的に使われるので、しっかりと習得することが重要です。
③ 最後に、ファイル入出力において不可欠な例外処理とクローズ処理について詳しく学びます。ファイルの読み書きを行うクラスは、すべてjava.io.IOExceptionを発生させる可能性があるため、try-catch文で例外を捕捉するか、メソッドの定義にthrows IOExceptionを記述して呼び出し元に処理を委ねる必要があります。また、ファイルに接続したストリームは、処理が終わった後に必ず閉じる(クローズ)必要があります。これは、ストリームを閉じないとPCのメモリ領域を無駄に確保し続けてしまうためです。クローズ処理は、例外が発生した場合でも必ず実行されるように、finallyブロックに記述するのが一般的です。これにより、予期せぬエラーが発生しても確実にストリームを閉じ、メモリを解放することができます。
キーワード ① java.ioパッケージ ② ストリーム ③ try-catch-finally ④ バッファリング ⑤ ファイル入出力
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
PrintWriterのprintlnメソッドを用いて、複数行の文字列をファイルに書き出し、そのファイルが正しく生成されることを確認するプログラムを実装すること。

◆次回授業の予習
第82回講義の主題であるPrintWriterおよびScannerクラスについて、その応用的な使用法、特に書式指定出力やトークン分割の機能について調査すること。"

82 java.io.PrintWriterクラス 科目の中での位置付け 低水準なストリーム操作を抽象化し、より直感的で高機能なテキストデータの入出力を実現するユーティリティクラスであるPrintWriterとScannerの機能と利用法を学ぶ。
コマ主題細目 ① ファイルへのテキストデータ出力 ② 特定の区切り文字による文字列の分割 ③ キーボードからのデータ入力と対話的アプリケーション
細目レベル ① アプリケーションが扱うデータや処理結果を、PC上にファイルとして保存する技術は、プログラミングの基本的ながら非常に重要なスキルです。例えば、アプリケーションの動作記録(ログ)を残したり、ユーザーが作成したデータを保存したり、設定情報をファイルに書き出したりと、その用途は多岐にわたります。このセクションでは、Javaでテキストファイルへの書き込みを簡単に行うためのjava.io.PrintWriterクラスを学びます。

PrintWriterクラスの強みは、println()メソッドを使って、普段コンソールに出力するのと同じ感覚でファイルに書き込みができる点です。 しかし、ファイルという「外部リソース」を扱う際には、重要な作法があります。それは、使用後のリソースを必ず解放するということです。ファイルを開いたままプログラムを終了してしまうと、ファイルが破損したり、他のプログラムがそのファイルにアクセスできなくなったりする原因となります。これを防ぐために、Javaではtry-catch-finally構文を用いて、例外が発生しても必ずfinallyブロックでclose()メソッドを呼び出し、ファイルを閉じる処理を徹底します。 また、データをすぐにファイルに書き込むためにflush()メソッドの役割も理解します。 このリソース管理の考え方は、ファイルI/O(入出力)に限らず、データベース接続など、あらゆる外部リソースを扱う際の基本となるため、ここで確実に習得してください。

② 実世界のデータは、カンマ区切りのCSVファイルや、スペース区切りの設定ファイルのように、特定のデリミタ(区切り文字)によって複数のトークン(意味を持つ文字のグループ)に分けられていることがよくあります。 このような構造化されたテキストデータを効率的に処理するために、Javaではjava.util.Scannerクラスが提供されています。

Scannerを使えば、複雑な文字列処理を自分で実装することなく、指定した文字列をデリミタで自動的に分割し、トークンを一つずつ取り出すことができます。

この処理の定石は、whileループとScannerのメソッドを組み合わせる方法です。hasNext()メソッドで「次に読み取るべきトークンが存在するか」を判定し、存在する間(true)はループを続け、next()メソッドでそのトークンを取得します。 このパターンをマスターすることで、ログファイルの解析や、特定のフォーマットを持つデータの読み込みなど、実務で頻出する様々なタスクに柔軟に対応できるようになります。このセクションでは、まず単純な文字列を対象に、この基本的な処理の流れを理解することを目標とします。

③ プログラミングの面白さの一つは、ユーザーと「対話」するアプリケーションを作成できることです。 これまで作成してきたプログラムは、決められた処理を一方的に実行するだけでしたが、このセクションではユーザーからの入力を受け取り、その内容に応じて動作を変える方法を学びます。その中核を担うのが、前セクションで登場したScannerクラスと、キーボードからの標準入力を表すSystem.inです。

ScannerにSystem.inを渡してオブジェクトを生成すると、next()メソッドを呼び出した時点でプログラムは一時停止し、ユーザーがコンソールに何かを入力してEnterキーを押すのを待つ「入力待機状態」になります。 これにより、ユーザーに名前や数値を入力してもらい、それを使って処理を行う対話的なプログラムが実現できます。ここで極めて重要なのが、入力されたデータはすべて文字列(String)として扱われるという点です。もし入力された値を数値として計算に使いたい場合は、Integer.parseInt()のようなメソッドを使って、文字列を適切な数値型に「型変換」する必要があります。 この型変換の概念は、外部からデータを受け取る際に必ず意識すべきポイントです。この技術を習得することで、簡単な電卓や質問に答えるプログラムなど、アプリケーション開発の幅が大きく広がります。

キーワード ① PrintWriter ② Scanner ③ 入出力ストリーム ④ リソース管理 (try-catch-finally) ⑤ デリミタとトークン
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
複数のデータ型(文字列、整数、小数)を、PrintWriterのprintfメソッドを用いてフォーマットを整えながら単一のファイルに書き込むプログラムを実装すること。

◆次回授業の予習
第83回講義で実施するファイルI/Oに関する総合演習の仕様を精読し、要件定義を満たすために、これまで学んだどのクラスの組み合わせが最適であるかを設計・考察すること。"

83 ファイルの読み込みと書き込み(演習) 科目の中での位置付け これまで学修したファイル入出力に関する知識を総動員し、データの書き込みから読み込み、そして安全なリソース管理に至るまでの一連のプロセスを、仕様に基づいて一貫して設計・実装する能力を養う。
コマ主題細目 ① Javaによるファイル操作とデータ書き込みの基礎 ② ファイルからの効率的なデータ読み込み手法 ③ 安全なファイル入出力を実現するための例外処理とリソース管理
細目レベル ① このセクションでは、Javaプログラムがコンピュータ上のファイルとどのように連携するのか、その基本的な仕組みを学びます。アプリケーション開発において、設定情報やログ、ユーザーが作成したデータなどをファイルとして永続化するスキルは不可欠です。まず、java.ioパッケージに含まれるFileクラスの役割を理解します。このクラスは、ファイルそのものではなく、ファイルやディレクトリの「パス(場所を示す情報)」をオブジェクトとして抽象的に扱うためのものです。これを用いることで、プログラム内からファイルの存在確認、新規作成、削除といったOSレベルの操作が可能になります。次に、ファイルに実際に文字データを書き込む方法を学びます。その中心となるのがFileWriterクラスです。FileWriterは、指定されたファイルへの「ストリーム(データの通り道)」を開き、文字情報を送り込む役割を担います。ただし、FileWriterを単独で使うと、少しのデータを書き込むたびにディスクへのアクセスが発生し、パフォーマンスが低下する可能性があります。そこで、BufferedWriterクラスを組み合わせて使います。これは「バッファリング」という仕組みを利用し、データをある程度メモリ上に溜めてからまとめて書き出すことで、ディスクアクセスの回数を減らし、処理を大幅に高速化します。実務ではこの組み合わせが基本となるため、両者の役割の違いを明確に理解することが重要です。
② ここでは、ファイル書き込みと対になる、ファイルからのデータ読み込み処理を習得します。書き込まれたデータをプログラムで利用するためには、正しく読み込む技術が必須です。基本的な読み込みにはFileReaderクラスを用います。これは、ファイルから文字データを読み込むための入力ストリームを生成します。read()メソッドを使うと、ファイルから1文字ずつデータを読み取ることができますが、大きなファイルを扱うには効率的ではありません。そこで、書き込み時と同様にBufferedReaderクラスが活躍します。FileReaderとBufferedReaderを連結させることで、バッファリングによる効率的な読み込みが可能になります。特にBufferedReaderが提供するreadLine()メソッドは極めて重要です。このメソッドは、ファイルの内容を1行単位でまとめて文字列(String型)として取得できるため、プログラムの可読性と処理効率が劇的に向上します。ファイルの終端に達するとnullを返すという特性を利用し、while文と組み合わせることで、ファイル全体を数行のコードで読み込む定型的なパターンは、あらゆるJava開発現場で頻繁に利用されます。この「一行ずつ読み込み、終端まで繰り返す」というロジックは、必ずマスターすべき実践的テクニックです。
③ ファイル操作は、プログラムの外部にあるリソース(ファイルシステム)にアクセスするため、予期せぬトラブルが発生しやすい処理です。「対象のファイルが存在しない」「書き込み権限がない」といった状況は日常的に起こり得ます。このようなエラーが発生した際にプログラムが異常終了するのを防ぐのが例外処理です。Javaのファイル入出力関連のクラスは、IOExceptionという検査例外をスローする可能性があるため、try-catchブロックで処理を囲むか、throwsキーワードで呼び出し元に処理を委譲することが文法的に必須となります。安全なプログラムを記述するためには、どのような例外が発生しうるかを想定し、適切に対処する能力が求められます。また、それと同じくらい重要なのがリソース管理、特にストリームのクローズ(閉じる)処理です。ファイルへのストリームを開いたまま放置すると、メモリなどのシステムリソースを占有し続け、最悪の場合、他のアプリケーションの動作に影響を与えたり、システムを不安定にしたりする原因となります。このクローズ処理は、処理が正常に終わったときはもちろん、例外が発生した場合でも必ず実行されなければなりません。そのために、finallyブロック内にクローズ処理を記述するのが定石です。リソースを確実に解放する作法は、プロフェッショナルなエンジニアとして必須の責務です。
キーワード ① ファイル入出力 ② ストリーム ③ バッファリング ④ IOException (例外処理) ⑤ リソース管理 (クローズ処理)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
演習で実装したコードにおいて、リソース解放がtry-with-resources構文によって正しく、かつ簡潔に実現されているかを再検証すること。

◆次回授業の予習
第84回講義の主題であるバイナリファイルの取り扱いについて、テキストファイルとの本質的な差異と、バイト単位のストリーム操作の基本を調査すること。

84 バイナリファイル取り扱い方 科目の中での位置付け テキストデータに留まらず、画像や実行ファイルといった非テキストデータ(バイナリファイル)をJavaで直接操作するための、バイト単位のI/Oストリームの概念と、その効率的な利用法を学ぶ。
コマ主題細目 ① バイナリファイルとストリームの概念 ② バイト単位でのファイル入出力 ③ プリミティブデータ型のバイナリ操作と実践
細目レベル ① まず、コンピュータが扱うファイルには大きく分けて「テキストファイル」と「バイナリファイル」の2種類があることを理解することが重要です。テキストファイルが人間が読むための「文字」の集まりであるのに対し、バイナリファイルはコンピュータが直接解釈するための「バイトデータ」の集まりです。画像、音声、動画、実行ファイル(.exe)、そしてJavaのコンパイル済みコード(.class)など、特定のアプリケーションやシステムが独自の形式で利用するデータのほとんどがバイナリファイルに該当します。ITエンジニアとして、テキストデータだけでなく、これらのバイナリデータを直接操作するスキルは、システム間のデータ連携やパフォーマンスが求められる場面で不可欠です。

Javaでは、こうしたバイトデータを扱うために「ストリーム (Stream)」という概念を用います。ストリームとは、データの流れを抽象化したもので、プログラムはデータの送信元(ファイル、ネットワークなど)や送信先を意識することなく、統一的な方法でデータを読み書きできます。この授業で主に扱うのは、バイト単位のデータを扱うためのバイトストリームであり、その基本となるのがInputStream(入力)とOutputStream(出力)という抽象クラスです。これらのクラスが、Javaにおけるバイナリファイル操作の根幹をなすことをまず理解しましょう。

② Javaで実際にバイナリファイルを読み書きするには、InputStreamとOutputStreamを継承した具象クラスを利用します。ファイル操作で最も基本的なのが、FileInputStreamとFileOutputStreamです。これらのクラスを使うことで、指定したファイルをバイトの連続として開き、read()メソッドで1バイトずつ読み込んだり、write()メソッドで1バイトずつ書き込んだりできます。

しかし、1バイトずつディスクにアクセスするのは非常に効率が悪いため、実務ではバッファリングという手法が必須となります。これは、ある程度のデータ量をメモリ上に一時的に溜め込み(バッファ)、まとめて読み書きすることで、ディスクへのアクセス回数を劇的に減らす技術です。JavaではBufferedInputStreamとBufferedOutputStreamクラスがこの機能を提供します。これらは既存のストリームを包み込む(ラップする)ようにして使い、プログラムのコードをほとんど変更することなくパフォーマンスを向上させることができます。

さらに、ファイルの読み書きが終わった後は、必ずストリームを「閉じる(close)」必要があります。これを怠ると、ファイルが破損したり、システムのリソースを無駄に消費し続ける「リソースリーク」の原因となります。現代のJavaプログラミングでは、try-with-resources文を用いることで、このクローズ処理を安全かつ簡潔に記述するのが定石です。この構文を使いこなすことは、堅牢なプログラムを書く上で極めて重要です。

③ FileInputStreamなどを使った基本的な操作は、あくまでバイトデータをそのまま扱うものです。しかし、プログラムで扱うデータはint型(4バイト)、double型(8バイト)といった数値データ(プリミティブデータ型)であることが多いでしょう。これらのデータをバイナリファイルとして効率よく保存・復元するために、JavaはDataInputStreamとDataOutputStreamという非常に便利なクラスを提供しています。

これらのクラスは、writeInt()やwriteDouble()といったメソッドでJavaのプリミティブデータ型を直接バイナリ形式で書き込むことができ、対応するreadInt()やreadDouble()メソッドで元のデータ型として正確に復元できます。これにより、オブジェクトの状態をファイルに保存したり、異なるプログラム間で厳密なデータ交換を行ったりする処理が容易になります。

この授業の最後では、ここまでに学んだ知識を総動員し、あるファイルをコピーするプログラムを作成します。入力ストリームで元ファイルを読み込み、出力ストリームで別ファイルに書き出すという単純な処理ですが、バッファリングの有無で処理速度がどれだけ変わるかを体感することで、バイナリ操作におけるパフォーマンス意識の重要性を深く理解することを目指します。

キーワード ① InputStream / OutputStream ② FileInputStream / FileOutputStream ③ BufferedInputStream / BufferedOutputStream ④ DataInputStream / DataOutputStream ⑤ try-with-resources
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
任意のバイナリファイル(例:画像ファイル)を対象とし、バイト単位で読み込み、別のファイルに書き出すことでファイルを完全に複製するプログラムを実装すること。

◆次回授業の予習
第85回講義で実施するバイナリファイルに関する総合演習の仕様を精読し、ファイルコピーのパフォーマンス計測や、構造化データのバイナリ永続化の処理フローを整理すること。

85 ファイルの読み込みと書き込み(演習) 科目の中での位置付け バイトストリームに関する理論的知識を基に、ファイルコピーの実装、パフォーマンス計測と比較、そして構造化データのバイナリ永続化という一連の実践的課題を通じて、バイナリデータ操作のスキルを深化させる。
コマ主題細目 ① 基本的なファイルコピーの実装  ② バッファリングによるパフォーマンス改善の体感 ③ 構造化データのバイナリファイル保存と復元
細目レベル ① この演習の最初のステップは、講義で学んだ最も基本的なクラスである FileInputStream と FileOutputStream を使って、ファイルコピープログラムを自力で実装することです。まず、コピー元となる適当なバイナリファイル(画像ファイルなどが最適です)を用意してください。

プログラムでは、入力用と出力用のストリームを try-with-resources 文で安全に開き、入力ストリームの read() メソッドを使って1バイトずつデータを読み込みます。read() メソッドは、ファイルの終端に達すると -1 を返すという仕様を正しく理解し、これをループの終了条件として利用することが重要です。そして、読み込んだ1バイトのデータをそのまま出力ストリームの write() メソッドで書き出していきます。

この一連の処理を通じて、JavaにおけるバイナリI/Oの最も基本的なサイクル(開く→読む→書く→閉じる)をコードレベルで理解します。また、ファイルが存在しない場合などに発生する IOException を try-catch ブロックで適切に処理する方法も学びます。この単純なプログラムが、あらゆるバイナリ操作の基礎となるため、まずはその仕組みを確実に身につけることが目標です。

② 次に、ステップ①で作成したプログラムのパフォーマンスを劇的に改善する演習を行います。ここでは2つのアプローチを試します。

一つ目は、バイト配列(byte[])をバッファとして自前で利用する方法です。例えば4096バイト(4KB)のバイト配列を用意し、read(byte[]) メソッドでファイルからデータをまとめて配列に読み込みます。そして、write(byte[], int, int) メソッドを使って、実際に読み込んだぶんのバイト数だけをファイルに書き出します。この「まとめて読み書き」が、ディスクへのアクセス回数を減らし、いかに効率的であるかを理解します。

二つ目は、Javaが提供するバッファリング機能を利用する方法です。ステップ①のコードを BufferedInputStream と BufferedOutputStream でラップするように修正します。驚くほどわずかなコード修正で、同様のパフォーマンス向上が得られることを確認します。

この演習の核心は、実際に大きなファイル(数MB〜数十MB)のコピー時間を計測し、バッファリングの有無による速度差を数値で比較することです。System.currentTimeMillis() などを使って処理の開始時刻と終了時刻の差を計測することで、「なぜバッファリングが実務において必須のテクニックなのか」を肌で感じることができます。エンジニアにとって、推測ではなく計測に基づいて改善策を講じる能力は非常に重要であり、この演習はその第一歩となります。

③ 最後の演習では、単なるバイト列のコピーから一歩進んで、意味のあるデータ構造をバイナリ形式で扱うことに挑戦します。ここでは DataOutputStream と DataInputStream を主役として使います。

課題として、例えば「学生ID(long型)」「氏名(String)」「成績(int)」といった複数の異なるデータ型の情報を一つのバイナリファイルに書き込むプログラムを作成します。DataOutputStream の writeLong()、writeUTF()、writeInt() といったメソッドを使えば、これを直感的に実装できます。

次に、書き込んだバイナリファイルを読み込み、元のデータをコンソールに正しく表示する復元プログラムを作成します。ここで重要なのは、書き込んだ時と全く同じデータ型、同じ順番で読み出す必要があるということです。DataInputStream の readLong()、readUTF()、readInt() を正しい順序で呼び出さなければ、データを破損させてしまいます。この経験を通じて、システム間でデータをやり取りする際の「データフォーマットの規約(プロトコル)」の重要性を学びます。この技術は、アプリケーションの設定保存や、独自のデータ形式を定義する際の基礎となります。

キーワード ① ファイルコピー ② パフォーマンス計測 ③ バイト配列 (byte[]) ④ IOException ⑤ データ構造
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
演習で実装したプログラムが、空のファイルなど、想定外の入力に対してもIOException等の例外を送出することなく、正常に終了するか(頑健性)を検証すること。

◆次回授業の予習
第86回講義の主題であるジェネリクスについて、それが導入される以前のObject型を用いたコレクション操作が内包していた型安全性の問題と、ジェネリクスがもたらす利点を調査すること。

86 ジェネリックス型の定義(1) 科目の中での位置付け Javaの静的型付けシステムを根幹から支えるジェネリクスの概念について、その導入背景、型安全性を向上させるメカニズム、そして開発者自身が汎用的なクラスを作成するための基礎を学ぶ。
コマ主題細目 ① ジェネリクス登場以前の課題:Object型コレクションと型キャスト ② ジェネリクスの基本概念とメリット:型安全性の飛躍的な向上 ③ ジェネリクスクラスの作成と利用:汎用性と命名規約
細目レベル ① ITエンジニアが開発現場で扱うデータは、単一のものではなく、複数のデータをリスト形式などでまとめて管理することがほとんどです。Javaでは、これらのデータ集合を効率的に扱うためにArrayListをはじめとする「コレクション」クラスが提供されています。しかし、ジェネリクスという仕組みが導入される以前のJavaでは、このコレクションに大きな課題がありました。それは、コレクションにあらゆる種類のオブジェクト(例えばInteger型、String型、Double型など)を格納する際、すべてが画一的にObject型という、Javaで最も基本的な型に変換されてしまっていた点です。

Object型は、言わば「何でも入る大きな箱」のようなもので、一見便利に思えます。しかし、問題はデータを取り出すときに発生します。箱から取り出したデータは、そのままでは元の型として扱えません。プログラマは、そのデータが「もともと何型であったか」を正確に記憶しておき、「このデータはString型のはずだ」というように、手動で元の型へ変換(明示的なキャスト)する必要がありました。

この手動キャストには、きわめて厄介なリスクが伴います。もしプログラマの勘違いで異なる型へキャストしようとすると、プログラムをコンパイルしている段階ではエラーが検知されません。問題が発覚するのはプログラムを実行した時であり、ClassCastExceptionという致命的な実行時エラーを引き起こします。 この種のエラーは、バグの原因として特定が難しく、システムの信頼性を著しく損なうため、エンジニアにとって長年の課題でした。この授業では、まずこの「なぜジェネリクスが必要とされたのか」という背景を深く理解することから始めます。

② 前述の課題を解決するために、Java SE 5.0から導入された画期的な機能が「ジェネリクス(Generics)」です。 ジェネリクスとは、クラスやインターフェースを定義する際に、そこで扱われるデータ型を固定せず、後からパラメータとして指定できるようにする仕組みです。 これにより、例えばArrayListを生成する際に ArrayList のように宣言することで、「このリストはString型のデータ専用です」と明確に指定できるようになりました。

ジェネリクスの導入がもたらした最大のメリットは、「型安全性(Type Safety)」の劇的な向上です。ArrayListと宣言されたリストに、誤ってInteger型のデータを追加しようとすると、プログラム実行時ではなく、コンパイルの段階でコンパイラがエラーとして即座に検出してくれます。 これにより、ClassCastExceptionのような実行時エラーを未然に防ぎ、プログラムの堅牢性を格段に高めることができるのです。

さらに、副次的なメリットとして、コードの可読性向上も挙げられます。データを取り出す際に、コンパイラが型を保証してくれるため、プログラマはキャストという冗長な記述をする必要がなくなります。 誰が読んでも「このコレクションは〇〇型を扱うものだ」と一目で理解できるため、コードはよりシンプルで、メンテナンスしやすいものになります。本セクションでは、ジェネリクスがもたらすこの強力な恩恵を、具体的なコードの違いを通して学びます。

③ ジェネリクスは、ArrayListのような既存のクラスを利用する場面だけでなく、開発者自身が「汎用的なクラス」を作成する際にも活用できます。class Boxのように、クラス名の後に山括弧< >で囲んだ「型変数」(通常はTypeを意味するTが使われる)を記述することで、ジェネリクスクラスを定義できます。 このTは、クラスがインスタンス化される際に与えられる具体的な型(例:String)に置き換わる、いわば「型のプレースホルダー」です。

クラス定義内では、この型変数Tをフィールドの型やメソッドの戻り値の型として自由に利用できます。 そして、このクラスを利用する側は Box stringBox = new Box<>(); のように、具体的な型を指定してオブジェクトを生成します。 これにより、一つのBoxクラスの定義だけで、String専用の箱、Integer専用の箱など、様々な型に対応したクラスとして振る舞わせることが可能になるのです。

最後に、プロフェッショナルなコーディング作法として、型変数の命名規約についても学びます。型変数には、T(Type)、コレクションの要素を表すE(Element)、マップのキーと値を表すK(Key)とV(Value)など、その用途に応じて慣例的に使われる一文字の大文字があります。 このような規約に従うことは、チーム開発においてコードの意図を明確に伝え、誰にとっても読みやすいコードを書くための重要なスキルです。

キーワード ① ジェネリクス (Generics) ② 型安全性 (Type Safety) ③ パラメータ化された型 (Parameterized Type) ④ 型変数 (Type Variable) ⑤ ClassCastException
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
型パラメータを持つ汎用クラスBoxを実装し、String型とInteger型をそれぞれ格納するインスタンスを生成し、その動作を確認すること。

◆次回授業の予習
第87回講義の主題であるコレクションフレームワークにおけるジェネリクスの役割と、型推論を補助するダイヤモンド演算子の構文について調査すること。

87 ジェネリックス型の定義(2) 科目の中での位置付け ジェネリクスの最も主要な応用先であるコレクションフレームワークに焦点を当て、ジェネリクスがもたらす具体的なメリットを再確認すると共に、その中核概念である型パラメータと、記述を簡略化する構文糖衣について理解を深める。
コマ主題細目 ① コレクションにおけるジェネリクスの必要性 ② ジェネリクスがもたらす「型安全性」とメリット ③ 型パラメータの概念とダイヤモンド演算子
細目レベル ① 現代のプログラミングでは、複数のデータを効率的に管理するためにコレクション・フレームワークが不可欠です。ArrayListに代表されるこれらのコレクションは、様々な種類のデータを格納できる柔軟性を持っています。しかし、その柔軟性が逆に問題を引き起こすこともあります。ジェネリクス導入前のコレクションでは、格納されたデータはすべて汎用的なObject型として扱われていました。そのため、コレクションからデータを取り出す際に、開発者が元のデータ型を正確に記憶し、「キャスト」と呼ばれる型変換の操作を明示的に行う必要がありました 。もし型を間違えてキャストすれば、プログラム実行時にエラーが発生するリスクを常に抱えていたのです。

この問題を解決するために、Java SE 5.0から導入されたのが「ジェネリクス(Generics)」です 。ジェネリクスは、ArrayListのように、コレクションが扱うデータ型を宣言時に指定する仕組みです 。これにより、コレクションに「この箱には文字列(String)しか入れない」という明確なルールを設けることができます。本セクションでは、ジェネリクスがなぜ必要とされ、従来のプログラミングのどのような課題を解決するのかを、具体的なコード例を通じて理解します。

② ジェネリクスを利用する最大のメリットは、プログラムの「型安全性(Type Safety)」が劇的に向上することです 。型安全性が高いとは、型の不一致に起因するエラーを未然に防げる状態を指します。ジェネリクスでArrayListと宣言したリストに、誤って数値(Integerなど)を追加しようとすると、プログラムを実行する前、つまりコンパイルの段階でエラーとして検出されます 。これにより、意図しないデータ型の混入を防ぎ、実行時エラーのリスクを大幅に削減できるのです。これは、バグの早期発見と修正に繋がり、堅牢で信頼性の高いアプリケーション開発の基礎となります。

もう一つの重要なメリットは、キャストが不要になることです 。ジェネリクスを用いたコレクションからデータを取り出す際、コンパイラは格納されているデータの型をすでに把握しているため、開発者がキャストを記述する必要がありません 。これにより、コードはよりシンプルで直感的になり、可読性が向上します。ITエンジニアにとって、読みやすくメンテナンスしやすいコードを書くことは非常に重要なスキルであり、ジェネリクスはその強力な武器となります。

③ ジェネリクスの仕組みをより深く理解するためには、「型パラメータ」の概念を知ることが重要です。Javaの公式APIドキュメントを見ると、ArrayListのように、クラス名の後にという記述があります 。このEが型パラメータであり、クラスを定義する時点では具体的な型を決めず、後から利用者が指定できるようにするための「仮の型」として機能します 。この仕組みがあるからこそ、

ArrayListはStringだけでなくIntegerや自作のクラスなど、様々な型のリストとして再利用できるのです。さらに、Java SE 7からは「ダイヤモンド演算子」という、ジェネリクスの記述を簡略化する機能が導入されました 。これは、new ArrayList<>()のように、インスタンス生成時の型指定を省略できる記法です 。左辺の変数宣言で型が明らかな場合、コンパイラが右辺の型を賢く「類推」してくれるため、冗長な記述を避けることができます 。実務の現場では広く使われているモダンな記法であり、効率的で洗練されたコードを書く上で必須の知識と言えるでしょう。

キーワード ① ジェネリクス (Generics) ② 型安全性 (Type Safety) ③ キャスト (Casting) ④ 型パラメータ (Type Parameter) ⑤ ダイヤモンド演算子 (Diamond Operator)
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
Numberクラスを継承する型のみを引数として受け入れるジェネリックメソッドを実装し、IntegerやDoubleは許容されるがStringはコンパイルエラーとなることを実証すること。

◆次回授業の予習
第88回講義の主題である「境界付き型パラメータ」について、のように型パラメータに制約を加えることの目的と構文を調査すること。

88 ジェネリックス型の活用(1) 科目の中での位置付け ジェネリクスの理論を基に、特定のデータ型に依存しない、再利用可能かつ型安全なデータ構造(コンポーネント)を自ら設計・実装するための技術を習得する。
コマ主題細目 ① ジェネリクス登場以前の課題:Object型による汎用プログラミングとその限界 ② 型安全性の実現:ジェネリクスの基本概念とクラス・メソッドへの適用 ③ ジェネリクスの実践的活用:汎用的なデータ構造の設計と実装
細目レベル ① Javaにおいて、あらゆるクラスの頂点に立つのがObjectクラスです。この特性を利用すると、Object型の変数やコレクションには、文字列(String)や数値(Integer)など、どのような型のデータでも格納できます。一見すると、これは非常に柔軟で便利な「汎用的な」プログラミングを可能にするように思えます。しかし、この手法にはエンジニアとして看過できない重大な欠点が存在します。それは、格納されたデータを取り出して利用する際に、本来の型へ戻すための「キャスト(型変換)」が必ず必要になる点です。さらに深刻なのは、もし開発者が誤って異なる型のデータを取り出そうとキャストしてしまった場合、その誤りはプログラムのコンパイル時には検知されず、実行時に初めてClassCastExceptionというエラーを引き起こします。これは、リリースされたアプリケーションがユーザーの操作中に突然クラッシュする原因となり、システムの信頼性を著しく損ないます。このセクションでは、まずこのObject型を用いたコーディングを体験し、その潜在的なリスクを理解することから始めます。
② 前述したObject型の問題を解決するためにJavaに導入されたのが「ジェネリクス(Generics)」です。ジェネリクスの最大の目的は、コンパイル時点で型の整合性をチェックし、「型安全性(Type Safety)」を保証することにあります。この授業では、ジェネリクスの基本的な構文である型パラメータ(Typeの意)を学びます。例えば、Boxのようにクラスを定義することで、そのクラスのインスタンスを生成する際にBoxやBoxのように、実際に扱うデータ型を明示的に指定できます。これにより、指定された型以外のデータは代入できなくなり、コンパイラが間違いを即座に指摘してくれます。その結果、不要なキャストがコードからなくなり、実行時エラーの恐怖から解放され、より安全で読みやすいプログラムを記述できます。また、クラス全体だけでなく、public static void printAll(List list)のようにメソッド単位で型をパラメータ化する「ジェネリックメソッド」についても学びます。これにより、特定の型に依存しない、再利用性の高いユーティリティ処理を効率的に作成する技術を習得します。
③ ジェネリクスの理論と文法を学んだ後は、演習を通じてその知識を実践的なスキルへと昇華させます。講義で提示される選択問題や穴埋め問題は、ジェネリクスの利点やObject型との違いといった核となる概念の理解度を確認するためのものです。しかし、ITエンジニアにとって本当に重要なのは、これらの知識を活用して「自分で汎用的なコンポーネントを設計・実装できる能力」です。そこで、本授業の総仕上げとして、「どんな型にも対応できる履歴記録クラス History」といった実装課題に取り組みます。この課題を通じて、ジェネリクスがいかにしてコードの再利用性を高め、同時に堅牢なプログラムの構築に貢献するのかを体感的に学びます。これは、将来フレームワークやライブラリを利用、あるいは開発する際に必須となる、抽象的かつ汎用的な思考を養うための重要なステップとなります。
キーワード ① ジェネリクス ② 型安全性 (Type Safety) ③ キャスト ④ コンパイルエラー ⑤ 型パラメータ
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
ArrayListを用いて、特定の型の要素を追加・取得する基本的なプログラムを再実装し、ジェネリクスによる型安全性とキャスト不要の恩恵を再確認すること。

◆次回授業の予習
第89回講義の主題である「型境界」について、ジェネリックな型パラメータTが持つメソッドを安全に呼び出すためのメカニズムを調査すること。

89 ジェネリックス型の活用(2) 科目の中での位置付け Javaにおける静的型付けシステムの高度な応用として、ジェネリクスの持つ潜在能力を最大限に引き出すための理論的枠組みを探求する。
コマ主題細目 ① ジェネリクスの限界と型境界の必要性 ② extendsを用いた型境界の実装と具体的な活用法 ③ 演習を通じた型境界の実践的理解と応用
細目レベル ① Javaプログラミングにおいて、ジェネリクス(Generics)は、クラスやメソッドが特定の型に縛られずに様々なデータ型を扱えるようにするための強力な機能です。これにより、コードの再利用性が高まり、コンパイル時に型の安全性をチェックできるという大きなメリットが生まれます。しかし、汎用性を追求するジェネリクスには限界もあります。例えば、ジェネリックな型パラメータ T を持つクラスを考えたとき、その T が具体的にどのようなメソッドを持っているのか、コンパイラは知ることができません。ご提示の Calculator の例のように、T 型の変数が数値に変換するための doubleValue() メソッドを持つ保証がないため、このメソッドを呼び出そうとするとコンパイルエラーが発生します。

この問題を解決するのが「型境界(Bounded Type Parameters)」という考え方です。型境界は、ジェネリクスの型パラメータ T に対して「特定のクラスを継承している」「特定のインターフェースを実装している」といった制約を設ける機能です。この制約により、プログラマは「この型パラメータ T は、少なくともこのメソッドは持っている」ということをコンパイラに伝え、保証させることができます。これにより、ジェネリクスが持つ「型の安全性」と「コードの再利用性」という二つの利点を両立させながら、より具体的で実用的な処理を記述することが可能になるのです。このセクションでは、なぜ型境界という仕組みが必要とされるのか、その根本的な理由と目的を理解します。

② 型境界は、 のように extends キーワードを使って指定します。ここで重要なのは、extends がクラスの継承だけでなく、インターフェースの実装も指定できる点です。

一つ目の典型的な例が、 です。Number クラスは、Integer、Double、Float といったJavaのすべての数値ラッパークラスのスーパークラスです。この型境界を指定することで、メソッドやクラスが扱う型を「数値」に限定できます。これにより、doubleValue() や intValue() といった Number クラスが保証するメソッドを安全に呼び出すことができ、汎用的な数値演算処理(合計値の計算や平均値の算出など)を効率的に実装できます。

二つ目の重要な例が、> です。Comparable は、オブジェクトの大小比較を可能にする compareTo() メソッドを定めたインターフェースです。この型境界を用いることで、メソッドに渡されるオブジェクトが「比較可能である」ことを保証できます。これにより、数値だけでなく、文字列(辞書順)や独自に定義したクラス(特定の基準で順序付け)など、様々な型のデータに対して最大値や最小値を求めたり、ソートしたりする汎用的なアルゴリズムを、型安全性を保ちながら実装することが可能になります。ここでは、これらの具体的な実装方法を通して、型境界がプロの現場でどのように活用されているかを学びます。

③ 型境界の概念と文法を学んだ後は、実際にコードを書きながらその知識を定着させることが不可欠です。このセクションでは、実践的な演習課題を通じて、型境界を使いこなすスキルを養います。

まず、穴埋め問題などを通じて、どのような場面で、どのような型境界 extends を指定すべきかを判断する基礎的な能力を身につけます。次に、提示された Util.max() のような汎用メソッドを実際に利用して、Integer 型のリストや String 型のリストから最大値を求めるコードを記述します。これにより、型境界を持つメソッドが呼び出し側でどのように機能するのかを体感的に理解します。

最終的には、応用課題として、数値リストの合計値を算出する sum() メソッドのような、型境界を利用した汎用的なメソッドを自ら設計・実装することに挑戦します。これらの演習は、単に文法を暗記するのではなく、「どうすればより柔軟で、安全で、再利用性の高いコードが書けるか」という、ソフトウェアエンジニアリングにおける重要な設計思想を学ぶ第一歩となります。このスキルは、将来的にJavaの標準ライブラリや外部フレームワークを深く理解し、効果的に活用するための強固な土台となるでしょう。

キーワード ① 型境界 (Bounded Type Parameters) ② ジェネリクス (Generics) ③ extends (型パラメータの制約) ④ Comparable インターフェース ⑤ Number クラス
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
Listを引数とするメソッドを定義し、当該リストからの要素取得は可能であるが、要素の追加(add操作)が型安全性の観点からなぜコンパイル時に禁止されるのか、その理論的背景を考察すること。

◆次回授業の予習
第90回講義で扱う非限定ワイルドカード、ならびに上限境界と下限境界の概念について、各種技術文書を参照し、それぞれの適用場面と意味論的差異に関する予備的調査を行うこと。

90 ジェネリックス(演習) 科目の中での位置付け ジェネリクスに関する全ての知識を統合し、型パラメータの設計から応用的なデータ構造の実装までを一貫して行うことで、汎用性と型安全性を両立させたコンポーネントを自ら設計・実装する能力を完成させる。
コマ主題細目 ① ジェネリクスの基本概念とメリット ② 型をパラメータ化する「ジェネリクスクラス」の作成演習 ③ 複数の型を扱う応用的なジェネリクスと、その設計思想
細目レベル ① プログラミングにおいて、同じロジックを異なるデータ型に対して適用したい場面は頻繁に発生します。例えば、文字列を格納する「箱」、数値を格納する「箱」、日付を格納する「箱」など、中身が違うだけで機能が同じクラスを型ごとに作成するのは非効率です。ジェネリクス(Generics)は、このような課題を解決するために導入されたJavaの重要な機能です。
ジェネリクスを用いることで、クラスやメソッドの定義時点では扱うデータ型を特定せず、利用する際に具体的な型を指定できるようになります。これにより、一つのクラス定義からBoxやBoxのように、様々な型に対応したクラスを安全に生成できます。最大のメリットは「型安全性」の向上です。ジェネリクスを使わない場合、どんな型でも格納できるObject型を利用することになりますが、取り出す際に意図しない型が混入していてもコンパイル時にはエラーにならず、実行時にエラー(ClassCastException)を引き起こす危険性がありました。ジェネリクスはコンパイラが型チェックを行ってくれるため、このようなバグを未然に防ぎ、より堅牢で信頼性の高いコードを書くことができます。このセクションでは、まずジェネリクスがなぜ必要なのか、そしてそれがもたらす「再利用性」と「型安全性」という二大メリットを深く理解します。

② このセクションでは、実際に手を動かしてジェネリクスクラスの作成を体験します。まず、class Boxという構文を用いて、任意の型の値を一つだけ保持できるシンプルなジェネリクスクラスを実装します。ここで登場するTは「型パラメータ(Type Parameter)」と呼ばれ、型のための「仮引数」のようなものです。Tは慣例的にTypeの頭文字が使われます。このBoxクラスを使って、String型やInteger型のインスタンスを生成し、値を格納・取得する演習を通して、ジェネリクスクラスの基本的な使い方を習得します。
さらに、単に機能するだけでなく、より実践的なクラスにするための拡張演習を行います。オブジェクトの内容を分かりやすく表示するためのtoString()メソッドのオーバーライドや、null値の格納を意図的に禁止する例外処理の実装などです。これらの演習は、クラスの「振る舞い」を設計し、不正なデータからオブジェクト内部を保護するという、オブジェクト指向プログラミングにおけるカプセル化の考え方を深めることにも繋がります。プロの現場では、このような「堅牢性」を考慮した設計が極めて重要となります。

③ ジェネリクスの応用として、のように複数の型パラメータを持つクラスの作成に挑戦します。具体的には、キー(Key)と値(Value)のペアを保持するPairクラスを実装します。これは、Mapコレクションの根幹をなす概念であり、2つの異なる型の情報をひとまとめにして扱いたい場合に非常に強力なパターンです。例えば、Pairとすれば「名前と点数」、Pairとすれば「社員番号と氏名」といったペアデータを安全に管理できます。
この演習を通して、ジェネリクスがもたらす柔軟性の高さを体感します。最後に、授業全体を振り返り、「なぜ型をパラメータ化するのか?」という問いに自身の言葉で答えられるようになることを目指します。ジェネリクスは、クラスの再利用性を高め、チーム開発におけるコードの品質と保守性を向上させるための重要な設計技術です。命名規約(T, E, K, Vなど)の存在理由にも触れ、他者が読みやすく、意図が伝わるコードを書くことの大切さを学びます。

キーワード ① ジェネリクスクラス ② 型パラメータ ③ 型安全性 ④ 再利用性 ⑤ Pair
コマの展開方法 社会人講師 AL ICT PowerPoint・Keynote 教科書
コマ用オリジナル配布資料 コマ用プリント配布資料 その他 該当なし
小テスト 「小テスト」については、毎回の授業時間内に、LMS上において当該コマの小テスト(難易度表示付き)を実施する。
復習・予習課題 ◆今回授業の復習
演習で実装したジェネリッククラスについて、ジェネリクスを用いなかった場合の実装と比較し、コードのどの部分が具体的に改善されたか(例:キャストの不要化)を論理的に説明できるように準備すること。

履修判定指標
履修指標履修指標の水準キーワード配点関連回
クラス設計の基礎とオブジェクト指向の導入 【★初級】
・クラスがオブジェクトの「設計図」であることを理解している。
・インスタンスが設計図から作られた「実体」であることを理解している。
・クラスを構成する主な要素としてフィールド(データ)とメソッド(処理)があることを知っている。
・newキーワードを用いてクラスからインスタンスを生成する基本的な構文を理解している。

【★★中級】
・フィールドが持つ既定値を理解している。
・ドット演算子(.)を使って参照・代入する方法を理解している。

【★★★上級】
・一つのクラスから、複数のインスタンスを作成できる。
・現実世界のモノや概念をモデリングできる。
クラス , オブジェクト , フィールド ,  メソッド , インスタンス, サブフォルダ構成 , 実行とクラスパス(-cp), クラス宣言 , フィールド宣言, ドット演算子, シグネチャ , 仮引数/実引数 , 戻り値型 , 再利用性, void , 副作用 , 初期化 , 凝集度 , 観測可能性 , スコープ  10 7, 8, 9, 10, 11, 12
メソッドの定義と適切な設計手法 【★初級】
・メソッドが、クラスの振る舞いや処理を定義したものであることを理解している。
・メソッドに渡す情報を引数(ひきすう)、メソッドから返される結果を戻り値(もどりち)と呼ぶことを知っている。
・thisキーワードが、自分自身のインスタンスを指す参照であることを理解している。
・変数が利用できる範囲をスコープと呼ぶことを知っている。

【★★中級】
・引数や戻り値の有無に応じた、基本的なメソッドの定義と呼び出しができる。
・オーバーロードを理解している。
・メソッド内で宣言されたローカル変数と、クラスのフィールドとのスコープの違いを理解している。

【★★★上級】
・フィールド名とローカル変数名が重複する場合に、thisキーワードを使ってフィールドを明示的に指し示すことができる。
・目的に応じて、適切にオーバーロードされたメソッドを設計・利用できる。
単一引数 , 値渡し , this , シャドーイング , バリデーション, 複数引数 , 引数順序 , 一括設定 , 反復呼び出し , マジックナンバー, return , 型の契約 , 計算系/判定系/生成系 , 副作用最小 , ドメイン , 情報隠蔽 , 責務分割 , バリデーション 10 13, 14, 15, 16, 16, 18, 19, 20, 21
コンストラクターの活用とアクセス制御 【★初級】
・クラスにおけるコンストラクターの役割を理解している
・デフォルトコンストラクトターの役割と挙動を理解している
・クラス管理のためのパッケージの仕組みについて理解している
・パッケージ宣言、インポート宣言の構文について理解している
・実務におけるパッケージの命名規則を知っている

【★★中級】
・コンストラクターのオーバーロードによって、インスタンスの初期化の処理を意図的に使い分けることができる
・アクセス修飾子を用いたアクセス制御の仕組みについて理解している
・ゲッタ・セッタのメソッドとしての役割について理解している

【★★★上級】
・パッケージ名とソースファイルのディレクトリ構造の対応関係について理解している
・アクセス修飾子とゲッタ・セッタを用いることで、フィールドやメソッドの堅牢性を高めるプログラムの設計ができる
コンストラクター、デフォルトコンストラクター、アクセス制御、アクセス修飾子、ゲッタ、セッタ、パッケージ、パッケージ宣言、インポート宣言、完全クラス名(FQCN) 10 22,23,24, 25,26,27,28,29
オブジェクト指向設計の実践と演 【★初級】
・インスタンスメンバーとクラスメンバーの違いを理解している
・クラス変数とクラスメソッドの特徴について理解している
・初期化子の役割について理解している
・可変長引数の特徴と構文について理解している

【★★中級】
・クラスメンバーを用いることで、クラス全体で情報を管理する方法を理解している
・static初期化子とインスタンス初期化子の役割と、それぞれの構文について理解している。
・参照型引数を利用する際の注意点について知っている

【★★★上級】
・クラスごとに役割と機能を明確に設計して定義することで、クラス間での連携した処理を実装することができる
・クラスメンバーを適切に扱うことで、同じクラスの複数のオブジェクトを効率的に管理する処理を実装することができる
インスタンスメンバー、クラスメンバー、クラス変数、クラスメソッド、初期化子、statci初期化子、インスタンス初期化子、参照型引数、可変長引数 10 30,31,32,33,34,35,36,37,38,39
クラスの継承とオーバーライドの理解 【★初級】
・カプセル化の意味が分かっている
・継承における基底クラスと派生クラスの関係が分かっている
・メソッドのオーバーライドとsuperの意味が分かっている
・抽象クラスと具象クラスの違いが分かっている

【★★中級】
・継承において何を基底クラスに書き、何を派生クラスに書くのかが理解できている
・基底クラスと派生クラス間でクラスの指定ができる
・抽象クラスと具象クラスの使い分けができる
【★★★上級】
・大規模なJavaプログラムにおいて、クラス分けができる
カプセル化、セッター、ゲッター、基底クラス、派生クラス、オーバーライド、super、this、コンストラクタ 10 40,41,42,43,44,45,46,47,48,49,50,51
抽象クラスとインタフェースの活用 【★初級】
・抽象クラスと具象クラスの違いが分かっている
・単一継承と多重継承の違いが分かっている
・インターフェースの使い方を知っている
【★★中級】
・抽象クラスと具象クラスとを使い分けることができる
・抽象クラスとインターフェースの使い分けができる
【★★★上級】
・大規模な型階層をもったプログラムを作成できる。
・上記のプログラムの中に、インターフェースをも組み込むことができる

抽象クラス、具象クラス、抽象メソッド、アップキャスト、ダウンキャスト、安全でないキャスト、委譲、インターフェース 10 52,53,54,55,56,59,60,61,62,63
ポリモーフィズムとデータ構造の基本 【★初級】
・ポリモーフィズムの意味が分かっている
・抽象クラスの使い方を知っている
・インターフェースが必要な意味を理解している
【★★中級】
・ポリモーフィズムを使って継承構造を定義できる
【★★★上級】
・どのような場合にポリモーフィズムを使うのが良いかが理解している。
型階層、ポリモーフィズム、抽象クラス、抽象メソッド、インターフェース 10 57,58,59,60,61,62,63,64
コレクションとデータ管理の実践 【★初級】
・ラッパークラスの役割を理解している。
・コレクションフレームワークの目的を理解している。
・ List, Set, Mapの基本的な特徴を説明できる。
・ ジェネリクスが、安全性を高める仕組みであることを理解している。

【★★中級】
・オートボクシング、アンボクシングを理解している。
・ArrayListの基本的な操作ができる。
・HashSetは重複したデータが格納されないことを理解している。
・HashMapにキーと値のペアでデータを格納し、キーを指定して値を取得できる。

【★★★上級】
・Listインタフェース型で変数を宣言し、実装クラスのインスタンスを代入する利点を説明できる。
・拡張for文を用いて、ListやSetの全要素を順番に取り出す処理を記述できる。
・Mapに格納された全てのキーや値を取り出すための繰り返し処理の方法を理解している。
コレクションフレームワーク , ラッパークラス , オートボクシング , ジェネリクス , List , Set , Map , ArrayList , HashSet , HashMap , 拡張for文 , キーと値のペア (Key-value pair) , equals()メソッド , hashCode()メソッド 10 65, 66, 67, 68, 69, 70, 71, 72
例外処理の概念と適用 【★初級】
・例外処理の必要性を理解している。
・try-catch構文の基本的な役割を理解している。
・ErrorとExceptionの基本的な違いを理解している。
・代表的な非検査例外がどのような状況で発生するかを理解している。
【★★中級】
・finallyブロックが必ず実行される処理ブロックであることを理解している。
・try-with-resources文について理解している。
・検査例外と非検査例外の違いを理解している。
・throws句がどのような場合に必要かを説明できる。
・ネストされたtry-catchブロックにおいて、スローされた例外が最も内側の適切なcatchブロックによって捕捉されることを理解している。
【★★★上級】
・スーパークラスの例外を捕捉するcatchブロックが、そのサブクラスの例外を捕捉するcatchブロックよりも先に記述されている場合、コンパイルエラーになる理由をポリモーフィズムの観点から説明できる。
・try-catch-finallyの各ブロックは記述順序が違うとコンパイルエラーになることを理解している。
・catchブロックとfinallyブロックの両方にreturn文がある場合、finallyブロックの戻り値が優先されることを理解している。
・try-with-resources文で宣言された変数はtryブロック内でのみ有効であり、finallyブロックなどからは参照できずコンパイルエラーになることを理解している。
・Errorは通常プログラム側での対処を求められないことを理解している。
・Errorが、catchブロックで捕捉して処理すること自体は可能であることを理解している。
try-catch-finally , try-with-resources ,検査例外 ,
非検査例外 (RuntimeException) , throws , Error , ポリモーフィズム(例外処理における) , ArrayIndexOutOfBoundsException , NullPointerException , ClassCastException , StackOverflowError
10 73, 74, 75, 76, 77 ,78, 79
ファイル処理とデータ管理の技術 【★初級】
・ファイル入出力ストリームの基本的な概念を理解している。
・バイトストリームとキャラクタストリームの役割の違いを説明できる。
・CSVファイルの構造を理解している。
・JSON形式の基本的な構造を理解している。
【★★中級】
・try-with-resources文を用いて、ファイル読み書き処理を記述できる。
・PrintWriterクラスやBufferedReaderクラスなどを用いたテキストファイルの読み書き方法を理解している。
・ジェネリクスを使用する基本的なメリットを説明できる。
【★★★ 上級】
・CSV形式のファイルを読み込みデータを処理できる
・JSON形式のデータを解析する方法を理解している。
・直列化(シリアライズ)の仕組みと、ObjectOutputStreamおよびObjectInputStreamの基本的な使い方を理解している。
・複数のストリームを連結して処理を実行できる。
・型パラメータを持つジェネリクスクラスの定義方法や利用方法を理解し、説明できる。
ストリーム , バイトストリーム (InputStream/OutputStream) , キャラクタストリーム (Reader/Writer) , デコレーターパターン , InputStreamReader , 直列化 (シリアライズ) , ObjectOutputStream ,
ObjectInputStream , try-with-resources , CSV , JSON , ジェネリクス
10 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90
評価方法
評価基準 評語
    学習目標をほぼ完全に達成している・・・・・・・・・・・・・ S (100~90点)
    学習目標を相応に達成している・・・・・・・・・・・・・・・ A (89~80点)
    学習目標を相応に達成しているが不十分な点がある・・・・・・ B (79~70点)
    学習目標の最低限は満たしている・・・・・・・・・・・・・・ C (69~60点)
    学習目標の最低限を満たしていない・・・・・・・・・・・・・ D (60点未満)
教科書
参考文献 1. 根本 有子,“オラクル認定資格教科書 Javaプログラマ Silver SE 17(試験番号1Z0-825)”,翔泳社,2024 2. 根本 有子,“Java[完全]入門”,SBクリエイティブ,2024 3. 井上 誠一郎,景井 教天, “改訂3版 パーフェクトJava”,技術評論社,2025 4. 中山清喬, “スッキリわかるJava入門 実践編 第4版”,インプレス,2024 
実験・実習・教材費