目 次 Chapter 01 Java とは... 5 Chapter 02 Java アプリケーションとは Chapter 03 Java の 文 法 ~その Chapter 04 Java の 文 法 ~その Chapter 05 Java の 文 法

Size: px
Start display at page:

Download "目 次 Chapter 01 Java とは... 5 Chapter 02 Java アプリケーションとは... 12 Chapter 03 Java の 文 法 ~その 1... 19 Chapter 04 Java の 文 法 ~その 2... 29 Chapter 05 Java の 文 法"

Transcription

1 平 成 24 年 度 文 部 科 学 省 委 託 成 長 分 野 等 における 中 核 的 専 門 人 材 養 成 の 戦 略 的 推 進 事 業 スマホアプリ 開 発 に 必 要 な Java スマートフォンアプリ 開 発 技 術 者 育 成 のための 教 育 プログラム 開 発 と 教 育 環 境 整 備 プロジェクト

2 目 次 Chapter 01 Java とは... 5 Chapter 02 Java アプリケーションとは Chapter 03 Java の 文 法 ~その Chapter 04 Java の 文 法 ~その Chapter 05 Java の 文 法 ~その Chapter 06 Java の 文 法 ~その Chapter 07 オブジェクト 指 向 とは Chapter 08 クラス~その Chapter 09 クラス~その Chapter 10 クラス~その Chapter 11 パッケージ Chapter 12 Java クラスライブラリ Chapter 13 コレクション~その Chapter 14 コレクション~その Chapter 15 例 外 処 理 Chapter 16 入 出 力 処 理 ~その Chapter 17 入 出 力 処 理 ~その Chapter 18 GUI プログラミング~その Chapter 19 GUI プログラミング~その Chapter 20 GUI プログラミング~その Chapter 21 HTTP 通 信 Chapter 22 非 同 期 処 理 ~その Chapter 23 非 同 期 処 理 ~その

3 Chapter 24 Eclipse 入 門 Chapter 25 XML と JSON Chapter 26 Android とは Chapter 27 Android アプリケーション Chapter 28 Android の GUI プログラミング~その Chapter 29 Android の GUI プログラミング~その Chapter 30 Android のアプリケーションコンポーネント

4 4

5 Chapter 01 Java とは [シラバス No. 01] 目 的 Java とは 何 かを 理 解 する Java アプリケーションの 開 発 環 境 を 準 備 する Java とは 何 か Java とは 狭 義 には Java プログラミング 言 語 のことです 広 義 には Java 言 語 で 作 成 したプログラムを 実 行 するためのプラットフォームを 指 します Java プラットフォームに は Java プログラムを 開 発 するための Java API ライブラリと 実 行 するための Java 仮 想 マ シンが 含 まれます Java はなぜ 普 及 したのか 1996 年 初 め サン マイクロシステムズ 社 ( 現 オラクル 社 )は Java 1.0 を 公 開 しました インターネットが 普 及 の 兆 しを 見 せ 始 めた 頃 です 当 時 インターネット 上 の Web ページは 単 にテキストや 画 像 を 表 示 するだけの 静 的 なも のでした しかし 新 しく 公 開 された Java では アプレットというプログラムを Web ペ ージに 埋 め 込 んで Web ブラウザで 実 行 することで ユーザとのやりとりやアニメーション の 表 示 といった 動 的 な 処 理 を 可 能 にしました Java は インターネット 上 で 利 用 すること を 前 提 に アプレットだけでなく 通 信 やセキュリティなどの 機 能 を 備 えていたのです そ して 主 要 な Web ブラウザが Java の 実 行 環 境 である Java プラグインに 対 応 したことが Java の 普 及 を 後 押 ししました 1999 年 Java 2 へのメジャーバージョンアップと 同 時 に PC 向 けのデスクトップアプ リケーション 開 発 用 の SE(Standard Edition)に 加 え エンタープライズアプリケーショ ン 開 発 用 の EE(Enterprise Edition)の 提 供 が 始 まりました 2000 年 には 携 帯 電 話 や 組 込 み 機 器 向 けの ME(Micro Edition)が 加 わったことで Java の 利 用 範 囲 がさらに 広 がり ます 2006 年 には Java がオープンソース 化 され オープンソースソフトウェアの 統 合 開 発 環 境 である Eclipse もリリースされました このような 経 緯 で Java は 世 界 的 に 広 く 利 用 されるようになってきたのです Java の 特 長 では Java を 利 用 するうえでどのようなメリットがあるのか 簡 単 にまとめましょう 無 償 の 開 発 環 境 Java でプログラミングを 行 うには Java API ライブラリやコンパイラなどが 必 要 です 5

6 JDK(Java Development Kit)は Java の 開 発 や 実 行 に 最 低 限 必 要 なソフトウェアをまと めたもので オラクルの Web サイトから 無 償 でダウンロードして 利 用 できます JDKには Java の 実 行 環 境 である JRE(Java Runtime Environment)をはじめ コンパイラなどの ツール 群 Java API ライブラリなど 必 要 なソフトウェアがすべて 含 まれています プラットフォームに 依 存 しないプログラム C や C++などの 言 語 でプログラムを 作 成 すると Windows や Linux などのプラットフォ ームごとにコンパイルしてそれぞれの OS のマシン 語 に 変 換 する 必 要 があります Java では 作 成 したプログラムをバイトコードにコンパイルし Java 仮 想 マシン 上 で 実 行 するしくみを 提 供 しています そのため Java 仮 想 マシンをインストールしたプラット フォームでは 一 度 作 成 したプログラムをそのまま 実 行 可 能 です オブジェクト 指 向 の 採 用 Java プログラミング 言 語 はオブジェクト 指 向 言 語 です クラスという 単 位 でコードを 書 き 複 数 のクラスを 組 み 合 わせてプログラムを 作 ります そのため 機 能 の 再 利 用 や 保 守 が 容 易 であり 開 発 の 効 率 が 向 上 します 開 発 のしやすさ 間 違 いのしにくさを 考 慮 Java プログラミング 言 語 は C と 似 た 構 文 を 採 用 しています C は 非 常 に 広 く 普 及 して いるプログラミング 言 語 であり 多 くの 技 術 者 が 利 用 しています そのため C の 基 礎 知 識 があれば Java はなじみやすく 覚 えやすい 言 語 になります 構 文 は 似 ていますが C プログラミングでバグの 原 因 になりやすいポインタは 採 用 してい ません また メモリリークなどメモリ 関 係 のエラーが 起 こらないように ガーベージコ レクタという 機 能 を 導 入 し メモリの 解 放 を 自 動 化 しています Java のオブジェクト 指 向 機 能 の 参 考 とされたのが C++です C++は C にオブジェクト 指 向 機 能 を 追 加 した 拡 張 言 語 であり C と 同 様 に 広 く 利 用 されていますが 多 機 能 であると 同 時 に 言 語 仕 様 が 複 雑 で 使 いこなすことが 難 しいという 短 所 もあります Java では C++の 複 雑 な 機 能 の 一 部 は 採 用 しないことで プログラムを 作 りやすく 間 違 いをしにくいようにしています たとえば C++では 多 重 継 承 が 可 能 ですが Java では 多 重 継 承 を 禁 じ 代 わりにインタフェースというしくみを 導 入 しています また C++では デストラクタがありますが Java ではありません このように Java は C/C++の 良 いところを 取 り 入 れ 複 雑 な 機 能 を 排 除 して コード を 書 きやすく バグを 作 りにくいプログラミングを 可 能 にしています Java 仮 想 マシンとは Java はプラットフォームに 依 存 しない 6

7 C や C++で 書 いたプログラム(ソースコード)は コンパイラでマシン 語 ( 実 行 プログ ラム)に 変 換 してから 実 行 します しかし Windows や Linux などのプラットフォームに よってマシン 語 が 異 なります そのため Windows でコンパイルした 実 行 プログラムは Windows では 動 作 しますが Linux では 動 作 しません Java はインターネットでの 利 用 を 前 提 に 開 発 されたため インターネットからどのプラ ットフォームにダウンロードしてもプログラムが 動 くようにする 必 要 がありました プラ ットフォームに 依 存 しないプログラムを 実 現 するしくみが Java 仮 想 マシンです 仮 想 マシンとは コンピュータ 上 でアーキテクチャが 異 なるハードウェア 環 境 を 実 現 す る 技 術 です Java 仮 想 マシンは Windows や Linux などの OS 上 で Java プラットフォー ムを 実 現 します Java バイトコード Java で 書 いたプログラム(ソースコード)をコンパイルすると Java バイトコードに 変 換 されます Java バイトコードは Java 仮 想 マシンが 解 釈 し 実 行 可 能 な 中 間 コードです 各 OS に 対 応 する Java 仮 想 マシンは Java バイトコードをそれぞれの OS のマシン 語 に 解 釈 して 実 行 します Javaで 書 いた プログラム コンパイル バイトコード ( 中 間 コード) 実 行 Java 仮 想 マシン Java 仮 想 マシン Java 仮 想 マシン Windows Linux Mac OS Java 仮 想 マシンは OS のアーキテクチャの 違 いを 吸 収 し 各 OS 上 に Java プラットフォ ームを 形 成 します Java 仮 想 マシンを 含 む Java 開 発 環 境 をインストールすれば コンパ イル 済 みの Java プログラムをそのまま 実 行 できます プラットフォームに 依 存 しないこ と は Java の 基 本 理 念 であり Write Once, Run Anywhere( 一 度 書 いたら どこでも 実 行 )という 言 葉 で 表 されています 7

8 01-04 Java の 3 つのエディション Java では 次 の 3 つのエディションが 提 供 されています Java SE(Java Platform, Standard Edition):Java の 基 本 機 能 を 提 供 する PC 向 けのデスクトッ プアプリケーションとして Java アプリケーション アプレット Java Bean の 開 発 が 可 能 Java EE(Java Platform, Enterprise Edition):エンタープライズ 向 けのクライアント/サーバシス テムを 構 築 するための 機 能 を 提 供 する サーブレット JSP EJB(Enterprise JavaBeans)など の 開 発 が 可 能 Java ME(Java Platform, Micro Edition): 携 帯 端 末 や 家 電 など リソースが 限 られる 組 込 みシス テムでのアプリケーション 開 発 機 能 を 提 供 する 本 教 科 書 では Java SE を 利 用 して Java プログラミングを 学 習 します Java アプリケーション 開 発 環 境 の 準 備 Java プログラミングの 学 習 を 始 める 前 に JDK(Java Development Kit)をダウンロー ドしてインストールしましょう 2013 年 1 月 時 点 では Java の 最 新 バージョンは Java 7 ですが Android のシステム 要 件 が JDK 6 であるため Java SE 6 Update 38 の JDK を 利 用 します ここでは Windows 7 (32 ビット)へのインストール 手 順 を 説 明 します JDK のダウンロード 次 の URL が 示 すオラクルの Web サイトにアクセスし Java SE 6 Update 38 の 右 横 にある JDK の DOWNLOAD ボタンをクリックします URL: 8

9 次 の 画 面 で Accept License Agreement にチェックを 入 れ 対 象 プラットフォームの 横 にある 実 行 ファイル(ここでは jdk-6u38-windows-i586.exe)をクリックし 任 意 の 場 所 にダウンロードします 9

10 JDK のインストール ダウンロードしたファイルを 実 行 します ウィザードの 指 示 に 従 って JDK をインストー ルします 10

11 環 境 変 数 PATH の 設 定 最 初 は Java プログラムのコンパイルや 実 行 をコマンドプロンプトで 行 います そのた めに 環 境 変 数 PATH の 設 定 を 行 います コマンドプロンプトにコマンドを 入 力 して 実 行 すると そのコマンドの 実 行 可 能 ファイ ルの 検 索 が 行 われます 環 境 変 数 PATH には そのときに 検 索 を 行 うべきフォルダのパス を 設 定 します 設 定 を 行 うことで Java のコンパイルや 実 行 のコマンドを 完 全 修 飾 パス を 指 定 せずに 実 行 できるようになります 環 境 変 数 PATH は 次 のように 設 定 します 1. [スタート]メニューから[コントロールパネル]を 選 択 し [システムとセキュリティ]の[システム] をクリックする 2. [システムの 詳 細 設 定 ]をクリックし [ 詳 細 設 定 ]タブで[ 環 境 変 数 ]ボタンをクリックする 3. [ユーザー 環 境 変 数 ]で[ 新 規 ]ボタンをクリックし [ 変 数 名 ]に PATH を [ 変 数 値 ]に<JDK の インストールフォルダ>\bin(デフォルトでは C:\Program Files\Java\jdk1.6.0_38\bin)を 入 力 し て [OK]ボタンをクリックする コマンドプロンプトを 開 いて 環 境 変 数 PATH が 設 定 されたことを 確 認 しましょう [スタ ート]メニューから[アクセサリ]の[コマンドプロンプト]を 選 択 します 環 境 変 数 PATH が 正 しく 設 定 されている 場 合 java -version と 入 力 すると 次 のように 表 示 されます 演 習 問 題 JDK 6 ドキュメント ( Java が 提 供 している 機 能 について 学 びなさい Java Platform, Standard Edition 6 API 仕 様 ( Java が 提 供 する 機 能 (パッ ケージ)を 確 認 しなさい 11

12 Chapter 02 Java アプリケーションとは [シラバス No. 01] 目 的 Java アプリケーションの 書 き 方 を 理 解 する Java アプリケーションをコンパイルして 実 行 する Java アプリケーションの 概 要 Java では 用 途 に 応 じてさまざまなプログラムを 作 成 できます Java SE では 次 のプ ログラムを 作 成 可 能 です Java アプリケーション:ローカルでスタンドアロン( 単 独 )で 動 く Java プログラム Java アプレット:HTML ファイルに 埋 め 込 み Web ブラウザで 実 行 するプログラム Java Bean: 再 利 用 可 能 なコンポーネントとして 作 成 するプログラム Java アプリケーションは 必 ず main メソッドを 持 ちます Java アプレットや Java Bean は main メソッドを 持 ちません 本 教 科 書 では Java アプリケーションを 作 成 しながら Java プログラミングを 学 習 しま す クラス メソッド フィールド Java アプリケーションは 1 つ 以 上 のクラスから 構 成 されます クラスは Java で 作 成 す るプログラムを 構 成 する 最 小 単 位 です クラスには データを 格 納 するためのフィールド とそのデータの 内 容 に 応 じた 処 理 を 実 行 するためのメソッドを 記 述 できます Java アプリケーションは 次 のように 記 述 します package パッケージ 名 ; import パッケージ 名 /クラス 名 ; /** * コメント * */ class クラス 名 { private int フィールド 名 ; } public static void main(string[] args) { // コメント } 12

13 では クラス メソッド フィールドの 書 き 方 を 見 ていきましょう クラス Java プログラムでは クラスからオブジェクトを 生 成 し オブジェクトがお 互 いにメソ ッドを 呼 び 出 すことで 処 理 を 進 めていきます Java アプリケーションには 1 つ 以 上 のク ラスを 記 述 します [クラス 修 飾 子 ] class クラス 名 { メソッドやフィールドの 定 義 } クラスを 定 義 するには class キーワードとクラス 名 を 指 定 します メソッドやフィール ドの 定 義 はクラス 名 の 後 の { から } までの 間 に 記 述 します { と } の 間 に 何 も 記 述 しないと 何 も 行 わないクラスになります また { と } の 間 に 別 のクラスの 定 義 を 記 述 することもできます クラス 内 に 記 述 したクラスを 内 部 クラスといいます クラス 修 飾 子 には アクセス 修 飾 子 (public protected private) final abstract な どを 指 定 可 能 です これらの 修 飾 子 については 後 続 の Chapter で 説 明 します メモ { と } は クラスやメソッド あるいは if 文 や for 文 などの 制 御 構 造 の 特 定 の 範 囲 を 示 すために 使 います { で 始 めたブロックを } で 適 切 に 閉 じていないと コンパイルエラーや 実 行 時 エラー の 原 因 になります メソッド メソッドにはさまざまな 演 算 を 記 述 します メソッドの 定 義 方 法 は 次 のとおりです [メソッド 修 飾 子 ] 戻 り 値 のデータ 型 メソッド 名 ( 引 数 リスト) { メソッドで 実 行 する 演 算 return 戻 り 値 ; // 戻 り 値 が void の 場 合 は 省 略 できる } 戻 り 値 のデータ 型 は メソッドが 処 理 結 果 として 返 すデータの 型 としてプリミティブ 型 や 参 照 型 のデータ 型 を 指 定 します データを 返 さないメソッドの 戻 り 値 は void 型 になりま す メソッド 名 の 後 には メソッドが 実 行 する 処 理 に 必 要 な 引 数 リストを 記 述 します 引 数 リストは ( 引 数 1 のデータ 型, 引 数 1 の 変 数 名 [, 引 数 2 のデータ 型, 引 数 2 の 変 数 名, ]) という 形 式 で 指 定 します 引 数 を 受 け 取 らない 場 合 は ( ) だけを 記 述 します 13

14 引 数 リストに 続 き { と } の 間 にメソッドで 行 う 処 理 を 記 述 します 何 も 記 述 しな いと 何 も 処 理 を 行 わないメソッドになりますが 戻 り 値 のデータ 型 を 指 定 した 場 合 には 必 ず return 文 を 記 述 する 必 要 があります メソッド 修 飾 子 には アクセス 修 飾 子 static final abstract などを 指 定 できます こ れらの 修 飾 子 については 後 続 の Chapter で 説 明 します フィールド フィールドは クラスまたはクラスから 生 成 されたオブジェクトにおいて データを 格 納 する 領 域 です メソッドは フィールドの 内 容 を 参 照 して 処 理 を 行 います フィールドは データ 型 とフィールド 名 を 指 定 して 定 義 します [フィールド 修 飾 子 ] データ 型 フィールド 名 [= 初 期 値 ]; データ 型 には フィールドに 格 納 可 能 なデータの 型 をプリミティブ 型 や 参 照 型 のデータ 型 で 指 定 します フィールド 名 の 後 に = 初 期 値 と 記 述 すると フィールドに 初 期 値 を 設 定 できます フィールド 修 飾 子 には アクセス 修 飾 子 static final trasient volatile などを 指 定 できます これらの 修 飾 子 については 後 続 の Chapter で 説 明 します メモ Java では 変 数 の 宣 言 やメソッドの 呼 び 出 しなどの 文 の 最 後 に;(セミコロン)を 記 述 します フィ ールドの 定 義 も 1 つの 文 であるため ;が 必 要 です Java では;によって 文 の 終 了 を 認 識 するため 1 つの 文 を 複 数 行 にわたって 記 述 することもできます 識 別 子 に 使 用 できる 文 字 す クラスやメソッドの 名 前 のことを 識 別 子 といいます 識 別 子 には 次 の 文 字 を 使 用 できま 英 字 (a ~ z A ~ Z) 数 字 (0 ~ 9) $(ドル 記 号 ) _(アンダースコア) Java ではあらかじめ 次 のキーワードが 予 約 されています このキーワードを 識 別 子 とし て 使 うことはできません 14

15 abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while その 他 の 要 素 Java アプリケーションには 次 の 要 素 を 記 述 できます パッケージの 宣 言 パッケージとは 複 数 のクラスやインタフェースをまとめたものです 類 似 の 機 能 を 持 つクラスをパッケージにまとめ ライブラリとして 提 供 したりすることができます Java アプリケーションでは package 文 でそのアプリケーションがどのパッケージに 属 するかを 宣 言 できます package com.sample; パッケージの 詳 細 については Chapter 11 で 説 明 します 他 のパッケージやクラスのインポート Java アプリケーションで Java API ライブラリのクラスや 他 のパッケージに 含 まれるク ラスを 利 用 する 場 合 import 文 でパッケージやクラスをインポートする 必 要 があります import java.util.*; // パッケージの 全 クラスをインポート import com.other.otherclass; // 他 のパッケージのクラスをインポート import 文 の 詳 細 については Chapter 11 で 説 明 します コメント 実 際 に 処 理 を 行 うコードとしては 認 識 されないコメントを 記 述 できます コメントとし て 処 理 の 内 容 やフィールドの 目 的 などを 記 述 すると コードが 読 みやすくなります 15

16 // 行 末 までがコメントになる /* /* から */ までがコメントになる */ main メソッド Java アプリケーションでは アプリケーションを 構 成 するいずれかのクラスに 必 ず main メソッドを 記 述 する 必 要 があります main メソッドは 次 のように 定 義 します public static void main(string[] args) { } メソッド 修 飾 子 として public static 戻 り 値 型 として void 引 数 リストには String[] args を 指 定 します String[] args は main メソッドが 引 数 として String 型 の 配 列 を 受 け 取 ることを 示 しま す 配 列 については Chapter 06 で 説 明 します 配 列 args には Java アプリケーションを 実 行 する 際 に 指 定 するコマンドライン 引 数 が 格 納 されます 詳 細 については Chapter 16 で 説 明 します Java アプリケーションを 実 行 すると 最 初 に main メソッドが 呼 び 出 されます main メソッドは Java アプリケーションの 処 理 の 開 始 地 点 になります Java アプリケーションの 作 成 と 実 行 実 際 にシンプルな Java アプリケーションを 作 成 して 実 行 してみましょう 手 順 は 次 のと おりです 4. ソースコードを 記 述 し XXX.java というファイル 名 で 保 存 する 5. javac コマンドで XXX.java をコンパイルし XXX.class というファイルを 作 成 する 6. java コマンドで XXX.java を 実 行 する ソースコードの 作 成 ここでは System.out.println メソッドでコマンドプロンプトの 画 面 に 文 字 列 を 表 示 しま す System.out.println メソッドには 画 面 に 表 示 したい 文 字 列 を 二 重 引 用 符 (")で 囲 んで 指 定 します Simple クラスの main メソッドを 記 述 してみましょう 01: class Simple { 02: public static void main(string[] args) { 03: System.out.println("Hello Java"); 16

17 04: } 05: } System.out.println メソッドは java.lang.system クラスの out フィールドに 対 して println メソッドを 呼 び 出 していることになります テキストエディタなどでソースコードを 記 述 し Simple.java というファイル 名 で 保 存 し ます javac コマンドによるコンパイル コマンドプロンプトを 開 き Simple.java を 保 存 したフォルダに 移 動 します ここでは C: Sample フォルダに 保 存 したものとします cd C: Sample javac コマンドを 次 のように 実 行 します javac Simple.java コンパイルが 成 功 すると Simple.class というクラスファイルが 生 成 されます これがソ ースコードがコンパイルされて 生 成 される Java バイトコードです メモ javac コマンドによるコンパイルが 失 敗 すると エラーメッセージが 表 示 されます コンパイルエラ ーが 発 生 すると クラスファイルは 作 成 されません たとえば Simple.java で main メソッドの 前 の void を 書 き 忘 れた 場 合 次 のようなコンパイルエラ ーが 発 生 します Simple.java:2: メソッドの 宣 言 が 不 正 です 戻 り 値 の 型 が 必 要 です public static main(string[] args) { ^ エラー 1 個 1 行 目 は Simple.java の 2 行 目 に メソッドの 宣 言 が 不 正 です 戻 り 値 の 型 が 必 要 です という 誤 りがあることを 示 します 2 行 目 は 実 際 にエラーが 発 生 したコードです Java アプリケーションの 実 行 コンパイルが 正 常 に 終 了 し Simple.class が 生 成 されていることを 確 認 したら java コ マンドで 実 行 してみましょう 17

18 java Simple java コマンドには 生 成 されたクラスファイルを 指 定 しますが 拡 張 子 の.class を 指 定 しな いことに 注 意 してください 実 行 結 果 は 次 のとおりです Hello Java 演 習 問 題 画 面 に 任 意 のメッセージを 表 示 する 簡 単 なプログラムを 作 成 しなさい 作 成 したプログラムをコンパイルして 実 行 しなさい 18

19 Chapter 03 Java の 文 法 ~その 1 [シラバス No. 01] 目 的 Java のデータ 型 を 理 解 する 変 数 と 定 数 の 違 いを 理 解 する リテラルの 書 き 方 を 理 解 する 代 入 演 算 子 とキャストの 使 い 方 を 理 解 する Java のデータ 型 Java のデータ 型 は プリミティブ 型 と 参 照 型 に 分 類 されます プリミティブ 型 参 照 型 整 数 型 byte short int long char 数 値 型 浮 動 小 数 点 数 型 float double boolean クラス 型 インタフェース 型 配 列 型 メモ Java は 強 く 型 付 けされたプログラミング 言 語 で すべての 変 数 や 式 がコンパイル 時 にどのデー タ 型 になるかが 決 まります データ 型 の 指 定 が 正 しくなければコンパイルエラーになるため 間 違 いを 見 つけやすくなります プリミティブ 型 プリミティブ 型 とは Java であらかじめ 定 義 されているデータ 型 のことです プリミテ ィブ 型 はキーワードとして 予 約 されています プリミティブ 型 には boolean 型 と 数 値 型 があります boolean 型 true( 真 )または false( 偽 )のいずれかになる 論 理 値 を 表 します if 文 やループの 条 件 文 には 必 ず boolean 型 の 値 を 返 す 式 を 指 定 します 数 値 型 整 数 型 と 浮 動 小 数 点 数 型 があります 各 データ 型 と 表 現 可 能 な 値 の 範 囲 を 次 に 示 します データ 型 ビット 数 表 現 可 能 な 値 byte 8-128~127 19

20 short 16-32,768~32,767 int 32-2,147,483,648~2,147,483,647 long 64-9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 char 16 0~65,535( 符 号 なし 整 数 UTF-16 では\u0000~\uFFFF) float ビットの 単 精 度 浮 動 小 数 点 数 (IEEE 754 に 準 じる) double ビットの 倍 精 度 浮 動 小 数 点 数 (IEEE 754 に 準 じる) 参 照 型 参 照 型 は 別 のデータを 参 照 するデータ 型 で クラス 型 インタフェース 型 配 列 型 があ ります クラス 型 とインタフェース 型 は Java API あるいは 独 自 定 義 のクラスやインタフェース のオブジェクトを 参 照 します 配 列 は プリミティブ 型 や 参 照 型 のデータを 複 数 並 べたデ ータを 参 照 します たとえば Java では 文 字 列 を String クラスで 扱 います String クラスは Java API の java.lang パッケージで 提 供 されているため 次 のように 宣 言 した 変 数 a は 参 照 型 (String クラス 型 )になります String a = " 文 字 列 "; 変 数 と 定 数 変 数 とは 値 を 保 持 する 記 憶 領 域 のことです 変 数 には クラス 変 数 インスタンス 変 数 ローカル 変 数 などがあります 変 数 は 格 納 する 値 のデータ 型 と 変 数 名 を 指 定 して 宣 言 します 初 期 値 を 指 定 すること も 可 能 です static はクラス 変 数 を 宣 言 するときに 使 用 します [static] データ 型 変 数 名 [= 初 期 値 ]; クラス 変 数 とインスタンス 変 数 クラス 変 数 とインスタンス 変 数 は Chapter 02 で 説 明 したクラスのフィールドのことで す 宣 言 の 際 に static を 付 けるとクラス 変 数 になります クラス 変 数 はクラスに 1 つだけ 存 在 し クラス 名. 変 数 名 という 形 式 で 参 照 できます インスタンス 変 数 は クラスから 生 成 されるオブジェクトごとに 存 在 します クラスか らオブジェクトを 生 成 し オブジェクト 名. 変 数 名 という 形 式 で 参 照 します クラスとオブジェクトについては Chapter 8 で 説 明 します 20

21 01: class FieldSample { 02: static int cvar; // クラス 変 数 03: int ivar; // インスタンス 変 数 04: 05: public static void main(string[] args) { 06: // クラス 変 数 :オブジェクトを 生 成 しないで 使 用 できる 07: FieldSample.cVar = 100; 08: System.out.println("cVar: " + FieldSample.cVar); 09: 10: // インスタンス 変 数 :オブジェクトを 生 成 して 使 用 する 11: // FieldSample クラスのオブジェクトを 生 成 して 変 数 obj に 代 入 12: FieldSample obj = new FieldSample(); 13: obj.ivar = 200; 14: System.out.println("iVar: " + obj.ivar); 15: } 16: } 実 行 結 果 は 次 のとおりです cvar: 100 ivar: 200 ローカル 変 数 ローカル 変 数 は メソッドや for 文 などの 制 御 ブロックの 範 囲 内 すなわち { から } の 間 で 宣 言 され 有 効 となる 変 数 のことです 次 のサンプルプログラムを 見 てみましょう 01: class LocalSample { 02: public static void main(string[] args) { 03: int number1 = 0; // int 型 の 変 数 number1 の 宣 言 04: 05: // 変 数 number1 が 0 の 場 合 に 変 数 number1 と 変 数 number2 に 値 を 代 入 06: if (number1 == 0) { 07: number1 = 100; 08: int number2 = 200; 09: } 10: 11: System.out.println("number1: " + number1); 12: System.out.println("number2: " + number2); 13: } 14: } LocalSample.java をコンパイルすると 12 行 目 で 変 数 number2 のシンボルを 見 つけ られない というコンパイルエラーになります これは int 型 変 数 number2 が if 文 の 後 の { から } の 間 で 宣 言 されており その 範 囲 内 でのみ 有 効 であるからです このエラーを 修 正 するには 変 数 number2 を 変 数 number1 と 同 じところで 宣 言 します 01: class LocalSample { 21

22 02: public static void main(string[] args) { 03: int number1 = 0, number2 = 0; // int 型 の 変 数 number1 の 宣 言 ( 初 期 値 004: ) 05: 06: // 変 数 number1 が 0 の 場 合 に 変 数 number1 と 変 数 number2 に 値 を 代 入 07: if (number1 == 0) { 08: number1 = 100; 09: number2 = 200; 10: } 11: 12: System.out.println("number1: " + number1); 13: System.out.println("number2: " + number2); 14: } 15: } 実 行 結 果 は 次 のとおりです 定 数 final キーワードを 指 定 した 変 数 は 最 初 に 設 定 した 初 期 値 以 外 の 値 に 変 更 できなくなり ます これを 定 数 (または final 変 数 )といいます 通 常 は 初 期 値 を 設 定 したクラス 変 数 に final キーワードを 指 定 し 定 数 として 利 用 します final static データ 型 定 数 名 = 初 期 値 ; たとえば Java API の java.lang.math クラスでは 円 周 率 を 表 す PI という 定 数 が 定 義 さ れています 01: class ConstantSample { 02: public static void main(string[] args) { 03: // 円 周 率 を 表 示 04: System.out.println("Math.PI: " + Math.PI); 05: } 06: } 実 行 結 果 は 次 のとおりです Math.PI: 定 数 は 特 定 の 値 を 複 数 のプログラムで 共 有 する 際 に 便 利 です たとえば 複 数 のプログ ラムで if 文 の 条 件 式 に 最 大 値 として 100 を 利 用 するとします このとき 各 プログラム 内 で 条 件 式 に 100 と 記 述 すると 将 来 仕 様 変 更 により 最 大 値 が 200 に 変 わったときには 100 と 記 述 した 箇 所 をすべて 200 に 変 更 しなければなりません しかし あらかじめ 値 が 100 である MAX_VALUE という 定 数 を 定 義 し プログラム 内 でこの 定 数 を 利 用 するよ うにすれは 仕 様 変 更 があっても 変 更 箇 所 は MAX_VALUE の 初 期 値 の 1 ヵ 所 のみです 22

23 03-03 リテラル リテラルとは プログラム 中 でプリミティブ 型 や 文 字 列 などの 実 際 の 値 を 表 現 するもの です データ 型 に 応 じて 書 き 方 が 決 まっています リテラルには 整 数 リテラル 浮 動 小 数 点 数 リテラル 文 字 リテラル 文 字 列 リテラル 真 偽 値 リテラル null リテラルがあり ます 整 数 リテラル byte 型 shor 型 t int 型 の 整 数 を 表 す 整 数 リテラルは 10 進 数 8 進 数 16 進 数 で 記 述 します 10 進 数 :0~9 の 数 字 8 進 数 : 先 頭 は 0 先 頭 以 外 は 0~7 の 数 字 16 進 数 : 先 頭 は 0x または 0X それ 以 外 は 0~9 の 数 字 long 型 の 整 数 リテラルは 10 進 数 8 進 数 16 進 数 の 末 尾 に l または L を 付 加 して 表 現 します 01: class IntegerSample { 02: public static void main(string[] args) { 03: byte b = 10; // 10 進 数 の : short s = 0144; // 8 進 数 の : int i = 0x64; // 16 進 数 の : long l = 0xAA00L; // long 型 (16 進 数 ) 07: 08: System.out.println("byte: " + b); 09: System.out.println("short: " + s); 10: System.out.println("int: " + i); 11: System.out.println("long: " + l); 12: } 13: } 実 行 結 果 は 次 のとおりです byte: 10 short: 100 int: 100 long: 整 数 リテラルはデフォルトでは int 型 として 解 釈 されます たとえば サンプルプログラ ムの 6 行 目 を long l = ; と 記 述 すると 次 のようなコンパイルエラーとな ります 23

24 IntegerSample.java:6: 整 数 が 大 き 過 ぎます long l = ; 整 数 リテラルに l または L を 付 けていないため int 型 の 整 数 とみなされますが int 型 の 最 大 値 は 2,147,483,647 で ここで より 小 さな 値 です そのために 大 きすぎる というエラーになります 浮 動 小 数 点 数 リテラル 浮 動 小 数 点 数 リテラルは float 型 と double 型 に 格 納 する 値 を 表 現 します 浮 動 小 数 点 数 リテラルは 次 のように 記 述 します 整 数 部 :10 進 数 または 16 進 数 小 数 点 ( 省 略 可 ):. 小 数 部 ( 省 略 可 ):10 進 数 または 16 進 数 指 数 部 ( 省 略 可 ):E(e)+(または-)10 進 数 P(p)+(または-)16 進 数 浮 動 小 数 点 数 リテラルは デフォルトでは double 型 とみなされます float 型 の 値 を 表 す には 末 尾 に f または F を 付 加 します また 末 尾 に d または D を 付 加 して double 型 を 表 すこともできます 01: class FloatSample { 02: public static void main(string[] args) { 03: float f1 = 200F; // 整 数 部 のみ 04: float f2 = 200.0F; // 指 数 部 なし 05: double d1 = 200.0E+4D; // 10 進 数 06: double d2 = 0xC8.0P-4; // 16 進 数 D 省 略 07: 08: System.out.println("f1: " + f1); 09: System.out.println("f2: " + f2); 10: System.out.println("d1: " + d1); 11: System.out.println("d2: " + d2); 12: } 13: } 実 行 結 果 は 次 のとおりです f1: f2: d1: d2: 12.5 文 字 リテラル 24

25 文 字 リテラルは char 型 に 代 入 する 1 文 字 の 値 を 表 します アルファベットなどの 文 字 または UTF-16 の 文 字 コードを 引 用 符 (')で 囲 んで 記 述 します 01: class CharSample { 02: public static void main(string[] args) { 03: char c1 = 'A'; // A 04: char c2 = 'あ'; // あ 05: char c3 = ' u0041'; // UTF-16 の 文 字 コード(A を 表 す) 06: char c4 = ' n'; // 制 御 文 字 ( n は 改 行 を 表 す) 07: int i = 'A'; // 'A'は 10 進 数 で 65 08: 09: System.out.println("c1: " + c1); 10: System.out.println("c2: " + c2); 11: System.out.println("c3: " + c3); 12: System.out.println("c4: " + c4); 13: System.out.println("int: " + i); 14: } 15: } 実 行 結 果 は 次 のとおりです c1: A c2: あ c3: A c4: int: 65 サンプルプログラムの 6 行 目 では ' n'を 指 定 しています n は 改 行 を 表 す 制 御 文 字 で す Java では 文 字 リテラルや 文 字 列 リテラルに 次 のような 制 御 文 字 を 利 用 できます 制 御 文 字 文 字 コード 意 味 \b \u0008 バックスペース(BS) \t \u0009 タブ(HT) \n \u000a 改 行 (LF) \f \u000c フォームフィード(FF) \r \u000d 復 帰 (CR) \" \u0022 二 重 引 用 符 \' \u0027 引 用 符 \\ \u005c \(バックスラッシュ) また 7 行 目 では int 型 の 変 数 に'A'を 代 入 しています int 型 は 整 数 値 を 表 しますが A に は 文 字 コードとして 16 進 数 で 0x0041 が 割 り 当 てられています そのため 文 字 'A'は 10 25

26 進 数 の 整 数 65 に 自 動 的 に 変 換 され 代 入 されます 文 字 列 リテラル 文 字 列 リテラルは String クラス 型 の 文 字 列 を 表 します 0 個 以 上 の 文 字 または UTF-16 の 文 字 コードを 二 重 引 用 符 (")で 囲 んで 記 述 します 01: class StrSample { 02: public static void main(string[] args) { 03: String s1 = "ABC"; // ABC 04: String s2 = "あいう"; // あいう 05: String s3 = " u0041 u0042 u0043"; // ABC( 文 字 コード) 06: 07: System.out.println("s1: " + s1); 08: System.out.println("s2: " + s2); 09: System.out.println("s3: " + s3); 10: } 11: } 実 行 結 果 は 次 のとおりです s1: ABC s2: あいう s3: ABC 真 偽 値 リテラル null リテラル 真 偽 値 リテラルは boolean 型 の 真 偽 値 を 表 現 し true または false のいずれかになりま す 大 文 字 の TRUE や FALSE は 真 偽 値 リテラルとはみなされません null リテラルは 参 照 型 がどのオブジェクトを 参 照 していない 状 態 の 値 つまり null 参 照 を 表 現 し null と 記 述 します 大 文 字 の NULL は null リテラルとみなされません 代 入 演 算 子 とキャスト 演 算 子 と 式 プログラムで 何 らかの 計 算 を 行 うことを 演 算 といいます 演 算 子 とは 演 算 を 行 うための 記 号 です たとえば 1+2 という 演 算 では + が 加 算 を 示 す 演 算 子 で 1 と 2 は 演 算 の 対 象 となるオペランドになります 1+2 の 演 算 を 実 行 すると 結 果 は 3 です このように 結 果 として 何 らかの 値 に 評 価 される 記 述 を 式 といいます 式 は 通 常 はオペランドと 演 算 子 で 記 述 しますが 1 つの 変 数 や 戻 り 値 を 返 すメソッドの 呼 び 出 しも 結 果 として 何 らかの 値 に 評 価 されるため 式 とみ なされます 式 は 評 価 結 果 によってデータ 型 が 決 まります 26

27 代 入 演 算 子 式 に 使 う 演 算 子 の 中 で 最 も 基 本 的 なものが 代 入 演 算 子 です 代 入 演 算 子 は 左 側 のオ ペランドに 右 側 のオペランドの 値 を 代 入 します 右 側 には 式 を 指 定 することもかのうです 右 側 に 式 を 指 定 すると その 評 価 結 果 が 左 側 のオペランドに 代 入 されます 01: class AssignSample { 02: public static void main(string[] args) { 03: int a, b, c, d = 10; 04: a = 70; // 整 数 05: b = d; // 変 数 06: c = ; // 式 07: d = Math.max(b, c); // メソッドの 呼 び 出 し 08: System.out.println("a = 70: " + a); 09: System.out.println("b = d: " + b); 10: System.out.println("c = : " + c); 11: System.out.println("d = Math.max(b, c): " + d); 12: } 13: } 実 行 結 果 は 次 のとおりです a = 70: 70 b = d: 10 c = : 52 d = Math.max(b, c): 52 キャスト 変 数 に 別 の 変 数 の 値 を 代 入 する 場 合 2 つの 変 数 のデータ 型 は 同 じでなければなりません ただし int 型 の 変 数 に byte 型 の 変 数 の 値 を 代 入 する 場 合 のように 左 のオペランドのデ ータ 型 が 右 のオペランドのものより 大 きなサイズの 場 合 は 暗 黙 的 にデータ 型 の 変 換 が 行 われます これを 暗 黙 的 変 換 (ワイドニング 変 換 )といいます int i; byte b = 20; i = b; // byte 型 から int 型 に 変 換 後 代 入 int 型 から byte 型 のように サイズの 小 さなデータ 型 の 変 数 に 代 入 すると コンパイル 時 に 精 度 が 落 ちている 可 能 性 というエラーが 発 生 します b = i; // コンパイルエラー このような 場 合 には キャストを 行 うことにより 代 入 先 のデータ 型 に 変 換 を 行 うこと で 代 入 が 可 能 になります これをナローイング 変 換 (キャスト 変 換 )といいます 27

28 b = (byte)i; // byte 型 へのキャスト キャストは 右 オペランドの 先 頭 に ( 代 入 先 のデータ 型 ) を 記 述 して 指 定 します プリミティブ 型 同 士 の 場 合 次 の 表 で 代 入 するデータ 型 を 代 入 先 のデータ 型 に 代 入 する 場 合 は ワイドニング 変 換 が 行 われます 逆 の 場 合 は キャストが 必 要 です boolean 型 と 他 のプリミティブ 型 との 変 換 はサポートされていないことに 注 意 してくださ い 代 入 するデータ 型 byte short int long char float 代 入 先 のデータ 型 short int long float double int long float double long float double float double int long float double double 演 習 問 題 整 数 型 の 変 数 を 定 義 し 10 進 数 16 進 数 8 進 数 の 整 数 リテラルを 使 って 変 数 に 代 入 するプロ グラムを 作 成 しなさい 整 数 型 の 変 数 を 定 義 し 異 なる 整 数 型 同 士 の 代 入 を 行 うプログラムを 作 成 しなさい 28

29 Chapter 04 Java の 文 法 ~その 2 [シラバス No. 01] 目 的 算 術 演 算 子 と 複 合 代 入 演 算 子 の 使 い 方 を 理 解 する インクリメント 演 算 子 とデクリメント 演 算 子 の 使 い 方 を 理 解 する ビット 演 算 子 の 使 い 方 を 理 解 する 算 術 演 算 子 Java では 加 算 減 算 乗 算 除 算 剰 余 算 を 行 うための 算 術 演 算 子 が 用 意 されています 演 算 子 のオペランドには 整 数 型 または 浮 動 小 数 点 数 型 の 変 数 またはリテラルを 指 定 しま す 演 算 子 実 行 する 演 算 説 明 + 加 算 a + b:a と b を 足 す - 減 算 a - b:a から b を 引 く * 乗 算 a * b:a に b を 掛 ける / 除 算 a / b:a を b で 割 って 商 を 求 める % 剰 余 算 a % b:a を b で 割 って 余 りを 求 める 01: class ArithmeticSample { 02: public static void main(string[] args) { 03: int a = 30, b = 13; 04: System.out.println("a + b: " + (a + b)); // 加 算 05: System.out.println("a - b: " + (a - b)); // 減 算 06: System.out.println("a * b: " + (a * b)); // 乗 算 07: System.out.println("a / b: " + (a / b)); // 除 算 08: System.out.println("a % b: " + (a % b)); // 剰 余 算 09: } 10: } 実 行 結 果 は 次 のとおりです a + b: 43 a - b: 17 a * b: 390 a / b: 2 a % b: 4 整 数 同 士 の 演 算 では 通 常 は int 型 で 計 算 が 行 われます オペランドの 一 方 が short 型 byte 型 char 型 である 場 合 は int 型 に 変 換 されます 一 方 のオペランドが long 型 である 場 29

30 合 もう 一 方 も long 型 に 変 換 されて 演 算 が 行 われます 浮 動 小 数 点 数 を 含 む 演 算 では 通 常 は float 型 で 計 算 が 行 われます 一 方 のオペランドが 整 数 型 である 場 合 は float 型 に 変 換 されて 演 算 が 行 われます 一 方 のオペランドが double 型 である 場 合 は もう 一 方 も double 型 に 変 換 されて 演 算 が 行 われます 加 算 演 算 子 (+)による 文 字 列 の 連 結 加 算 演 算 子 (+)を 使 って 文 字 列 を 連 結 することができます オペランドには String 型 の 変 数 や 文 字 列 リテラルを 指 定 します String str = "String"; "MOJI" + " 文 字 列 " // 連 結 して"MOJI 文 字 列 "になる str += " 文 字 列 " // 連 結 して"String 文 字 列 "になる また String 型 以 外 のデータ 型 のオペランドを 指 定 すると 文 字 列 に 変 換 されて 連 結 さ れます 次 のサンプルプログラムを 実 行 してみましょう 01: class StrPlusSample { 02: public static void main(string[] args) { 03: String str = "String"; 04: 05: System.out.println("MOJI" + " 文 字 列 "); // 文 字 列 リテラル 同 士 06: System.out.println(str + " 文 字 列 "); // String 型 変 数 + 文 字 列 リテラ ル 07: System.out.println(str ); // String 型 変 数 + 整 数 08: System.out.println( str); // 整 数 +String 型 変 数 09: } 10: } 実 行 結 果 は 次 のとおりです MOJI 文 字 列 String 文 字 列 String String 7 行 目 に str という 式 が 記 述 されています str は String 型 変 数 なので 次 に 指 定 されている 整 数 100 が 文 字 列 に 変 換 されて 連 結 され その 次 の 整 数 1 も 文 字 列 に 変 換 されて 連 結 され String1001 という 結 果 になります 一 方 8 行 目 の str では 最 初 に が 整 数 同 士 の 加 算 と 評 価 され 結 果 が 101 になります その 後 String 型 変 数 が 指 定 されているため 101 が 文 字 列 に 変 換 されて 連 結 されます このように 演 算 子 には 優 先 順 位 があります 複 数 の 算 術 演 算 子 を 含 む 式 では 演 算 子 30

31 の 優 先 順 位 が 同 じであれば 演 算 子 は 左 から 順 に 適 用 されることに 注 意 してください 演 算 子 の 優 先 順 位 については 後 述 します 複 合 代 入 演 算 子 複 合 代 入 演 算 子 は 代 入 演 算 子 と 算 術 演 算 子 を 組 み 合 わせたものです Java では 次 の 複 合 代 入 演 算 子 を 利 用 できます 演 算 子 説 明 += a += b:a と b を 足 した 結 果 を a に 代 入 する(a = a + b を 同 じ) -= a -= b:a から b を 引 いた 結 果 を a に 代 入 する(a = a - b と 同 じ) *= a *= b:a に b を 掛 けた 結 果 を a に 代 入 する(a = a * b と 同 じ) /= a /= b:a を b で 割 った 商 を a に 代 入 する(a = a / b と 同 じ) %= a %= b:a を b で 割 った 余 りを a に 代 入 する(a = a % b と 同 じ) インクリメント 演 算 子 とデクリメント 演 算 子 変 数 に 1 を 加 算 することをインクリメントといいます また 変 数 から 1 を 減 算 するこ とをデクリメントといいます Java では インクリメント 演 算 子 とデクリメント 演 算 子 を 利 用 できます 演 算 子 説 明 ++( 前 置 型 ) ++a: 変 数 a に 1 を 足 し その 後 に a を 使 用 する ++( 後 置 型 ) a++: 変 数 a を 使 用 し その 後 に a に 1 を 足 す --( 前 置 型 ) --a: 変 数 a から 1 を 引 き その 後 に a を 使 用 する --( 後 置 型 ) a--: 変 数 a を 使 用 し その 後 に a から 1 を 引 く 前 置 型 と 後 置 型 では インクリメントまたはデクリメントを 実 行 するタイミングが 異 な ります 01: class IncrementSample { 02: public static void main(string[] args) { 03: int a = 1, b = 1; 04: 05: System.out.println("++a: " + ++a); // 前 置 型 は 計 算 後 に 表 示 する 06: System.out.println("b++: " + b++); // 後 置 型 は 表 示 後 に 計 算 する 07: } 08: } 実 行 結 果 は 次 のとおりです 31

32 ++a: 2 b++: 1 このサンプルプログラムでは int 型 変 数 a に 前 置 型 のインクリメント 演 算 子 int 型 変 数 b に 後 置 型 のインクリメントを 指 定 しています a は 先 にインクリメントが 行 われ その 後 println メソッドに 渡 されるため 2 と 表 示 されます b は 先 に println メソッドに 渡 されるため 1 と 表 示 され その 後 にインクリメントが 行 われます ビット 演 算 子 ビット 演 算 子 は ビットの 並 びを 操 作 する 演 算 子 です たとえば byte 型 は 8 ビットの 符 号 付 き 整 数 を 表 すデータ 型 です byte 型 変 数 に 10 進 数 の 8 および-8 を 代 入 すると 8 個 のビットの 値 は 次 のようになります byte 型 8(10 進 数 ) (2 進 数 ) -8(10 進 数 ) (2 進 数 ) このとき 一 番 左 端 のビットは 符 号 ビットになり 0 のときには 正 の 整 数 1 のときには 負 の 整 数 になります Java では 次 のビット 演 算 子 を 使 って ビットの 並 びを 操 作 できます 演 算 子 説 明 << a << b:a を b ビットだけ 左 にシフトし 右 側 に b ビット 分 0 を 追 加 する >> a >> b:a を b ビットだけ 右 にシフトし 左 側 に b ビット 分 符 号 ビットと 同 じ ビットを 追 加 する >>> a >>> b:a を b ビットだけ 右 にシフトし 左 側 に b ビット 分 0 を 追 加 する a b:a と b のビット 単 位 の 論 理 和 をとる & a & b:a と b のビット 単 位 の 論 理 積 をとる ^ a ^ b:a と b のビット 単 位 の 排 他 的 論 理 和 をとる ~ ~a:a の 各 ビットを 反 転 する(0 を 1 に 1 を 0 にする) 01: class BitSample { 02: public static void main(string[] args) { 03: int a = 8; 04: int b = -8; 05: 06: System.out.println("a=8 -> a<<3: " + (a<<3)); // 8 倍 07: System.out.println("a=8 -> a>>2: " + (a>>2)); // 1/4 倍 08: System.out.println("a=8 -> a>>>2: " + (a>>>2)); 09: System.out.println("b=-8 -> b<<3: " + (b<<3)); // 8 倍 32

33 10: System.out.println("b=-8 -> b>>2: " + (b>>2)); // 1/4 倍 11: System.out.println("b=-8 -> b>>>2: " + (b>>>2)); 12: } 13: } 実 行 結 果 は 次 のとおりです a=8 -> a<<3: 64 a=8 -> a>>2: 2 a=8 -> a>>>2: 2 b=-8 -> b<<3: -64 b=-8 -> b>>2: -2 b=-8 -> b>>>2: >>や<<では 符 号 ビットがそのまま 引 き 継 がれることに 注 意 してください >>>は 符 号 ビットの 値 に 関 係 なく 左 側 に 0 が 埋 められるため -8 を>>>により 2 ビットシフトする と 負 の 整 数 ではなく 正 の 整 数 になります また 代 入 演 算 子 とビット 演 算 子 を 組 み 合 わせた 複 合 代 入 演 算 子 も 利 用 できます 演 算 子 説 明 <<= a <<= b:a << b の 結 果 を a に 代 入 する >>= a >>= b:a >> b の 結 果 を a に 代 入 する >>>= a >>>= b:a >>> b の 結 果 を a に 代 入 する = a = b:a b の 結 果 を a に 代 入 する &= a &= b:a & b の 結 果 を a に 代 入 する ^= a ^= b:a ^ b の 結 果 を a に 代 入 する 演 算 子 の 優 先 順 位 通 常 の 算 術 式 では と 書 くと 乗 算 が 優 先 されて 計 算 されます Java でも 同 様 に 演 算 子 に 優 先 順 位 があります 33

34 高 低 [].(メソッドなどの 参 照 ) ()(メソッドの 引 数 ) ++( 後 置 ) --( 後 置 ) ++( 前 置 ) --( 前 置 ) +( 符 号 ) -( 符 号 ) ~! (キャスト) new * / % + - << >> >>> < <= > >= instanceof ==!= & ^ &&? : = += -= *= /= %= <<= >>= >>>= &= = ^= 式 に 複 数 の 演 算 子 が 含 まれるとき この 表 で 上 にある 演 算 子 のほうが 優 先 的 に 評 価 され ます 演 算 の 順 序 を 制 御 したい 場 合 には かっこで 先 に 実 行 したい 演 算 を 囲 みます たとえば 前 節 のサンプルプログラムでは 次 のように 記 述 しています System.out.println("a=8 -> a<<3: " + (a<<3)); これは + 演 算 子 が<< 演 算 子 より 優 先 順 位 が 高 いため a<<3 をかっこで 囲 まないと ("a=8 -> a<<3: " + a という 演 算 が 先 に 実 行 されてしまうからです この 演 算 の 結 果 は 文 字 列 であるため その 後 に<<でビット 演 算 を 行 おうとすると コンパイルエラーにな ります 演 習 問 題 整 数 型 の 変 数 を 複 数 定 義 し 2 種 類 以 上 の 算 術 演 算 を 組 み 合 わせて 行 い(a + b * c など) 結 果 を 表 示 するプログラムを 作 成 しなさい 整 数 型 の 変 数 を 2 つ 定 義 し 前 置 型 と 後 置 型 のインクリメント 演 算 (またはデクリメント 演 算 )と 算 術 演 算 を 組 み 合 わせて 行 い(a++ + b++ ++a * b--など) 結 果 を 表 示 するプログラムを 作 成 しなさ い 34

35 Chapter 05 Java の 文 法 ~その 3 [シラバス No. 02] 目 的 真 偽 値 を 返 す 演 算 子 を 理 解 する 条 件 分 岐 とループの 制 御 構 文 を 理 解 する 真 偽 値 を 返 す 演 算 子 Java プログラミングでは 条 件 分 岐 やループなどによりプログラムの 処 理 の 流 れを 制 御 します 条 件 分 岐 やループでは 条 件 式 を 使 って 処 理 の 振 り 分 けや 繰 り 返 しの 終 了 を 判 定 します 条 件 式 とは 真 (true)または 偽 (false)のいずれかに 評 価 される 式 のことです 条 件 式 には 等 値 演 算 子 関 係 演 算 子 論 理 演 算 子 論 理 否 定 演 算 子 など 真 偽 値 を 返 す 演 算 子 を 利 用 します 等 値 演 算 子 等 値 演 算 子 は 左 右 のオペランドが 等 しいかどうかを 評 価 する 演 算 子 です 演 算 子 説 明 == a == b:a と b が 等 しい 場 合 に true 等 しくない 場 合 に false を 返 す!= a!= b:a と b が 等 しくない 場 合 に true 等 しい 場 合 に false を 返 す 01: class EqualSample { 02: public static void main(string[] args) { 03: int a = 65, b = 100; 04: char c = 'A'; 05: 06: System.out.println("a == b: " + (a == b)); // 等 しいか 07: System.out.println("a!= b: " + (a!= b)); // 等 しくないか 08: System.out.println("a == c: " + (a == c)); // 等 しいか 09: } 10: } 実 行 結 果 は 次 のとおりです a == b: false a!= b: true a == c: true 基 本 的 に 等 値 演 算 子 の 左 右 のオペランドには 同 じデータ 型 の 変 数 や 値 を 指 定 します ただし 整 数 型 や 浮 動 小 数 点 数 型 の 場 合 暗 黙 的 変 換 (ワイドニング 変 換 )が 行 われてか 35

36 ら 比 較 が 行 われます サンプルプログラムの 8 行 目 では int 型 変 数 a と char 型 変 数 c を== 演 算 子 で 比 較 して います この 場 合 変 数 c が int 型 に 暗 黙 的 に 変 換 されます 文 字 の'A'は 10 進 数 の 整 数 で は 65 になるため 変 数 a と 変 数 c は 等 しいとみなされ 評 価 結 果 は true になります 関 係 演 算 子 関 係 演 算 子 は 左 右 のオペランドの 大 小 関 係 を 評 価 する 演 算 子 です 演 算 子 説 明 < a < b:a が b より 小 さい 場 合 に true それ 以 外 の 場 合 に false を 返 す <= a <= b:a が b 以 下 である 場 合 に true それ 以 外 の 場 合 に false を 返 す > a > b:a が b より 大 きい 場 合 に true それ 以 外 の 場 合 に false を 返 す >= a >= b:a が b 以 上 である 場 合 に true それ 以 外 の 場 合 に false を 返 す 01: class CompareSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: int b = Integer.valueOf(args[1]); // 2 番 目 のコマンドライン 引 数 05: 06: System.out.println("a: " + a + " b: " + b); 07: System.out.println("a > b : " + (a > b)); // a > b 08: System.out.println("a >= b: " + (a >= b)); // a >= b 09: System.out.println("a < b : " + (a < b)); // a < b 10: System.out.println("a <= b: " + (a <= b)); // a <= b 11: } 12: } 実 行 結 果 は 次 のとおりです >java CompareSample a: 15 b: 20 a > b : false a >= b: false a < b : true a <= b: true このサンプルプログラムでは 3 行 目 と 4 行 目 で java.lang.integer クラスの valueof メ ソッドを 呼 び 出 しています このメソッドは 引 数 で 指 定 された 文 字 列 を 整 数 に 変 換 して 返 します 引 数 には main メソッドの 引 数 である String 型 の 配 列 args の 要 素 を 渡 します 配 列 args には Java アプリケーションの 実 行 時 に 指 定 されるコマンドライン 引 数 が 順 番 に 格 納 されます コマンドライン 引 数 は 実 行 結 果 に 示 すように 実 行 する Java アプリケ ーションの 名 前 に 続 き 空 白 で 区 切 って 指 定 します この 例 では 15 と 20 を 指 定 している 36

37 ため args[0]と args[1]にそれぞれ 文 字 列 として 格 納 されます 関 係 演 算 子 も 左 右 のオペランドは 基 本 的 に 同 じデータ 型 でなければなりません 整 数 型 や 浮 動 小 数 点 数 型 であれば 左 右 のオペランドのデータ 型 が 異 なる 場 合 に 暗 黙 的 変 換 が 行 われます 論 理 演 算 子 論 理 演 算 子 は 複 数 の 条 件 を 組 み 合 わせて 判 定 を 行 うときに 利 用 します 左 右 のオペラン ドには 真 偽 値 を 返 す 式 を 指 定 します 演 算 子 説 明 && a && b: 式 a と 式 b がどちらも true である 場 合 に true を 返 す a b: 式 a と 式 b のどちらかが true である 場 合 に true を 返 す 01: class LogicalSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: int b = Integer.valueOf(args[1]); // 2 番 目 のコマンドライン 引 数 05: int c = Integer.valueOf(args[2]); // 3 番 目 のコマンドライン 引 数 06: 07: System.out.println("a: " + a + " b: " + b + " c: " + c); 08: System.out.println("(a > b) && (a > c): " + ((a > b) && (a > c))); 09: // 論 理 積 10: System.out.println("(a < b) (a < c): " + ((a < b) (a < c))); 11: // 論 理 和 12: } 13: } 実 行 結 果 は 次 のとおりです >java LogicalSample a: 12 b: 40 c: 8 (a > b) && (a > c): false (a < b) (a < c): true このサンプルプログラムでは コマンドライン 引 数 で 指 定 した 3 つの 数 字 を 整 数 に 変 換 し 大 小 関 係 を 判 定 しています (a > b) && (a > c)は (a > b)が false (a > c)が true にな るので false (a < b) (a < c)は(a < b)が true (a < c)が false なので true になります メモ && 演 算 子 は 左 オペランドが false と 評 価 されると 右 オペランドの 式 を 評 価 せずにすぐに false を 返 します 右 オペランドの 式 は 左 オペランドの 式 が true を 返 す 場 合 にしか 評 価 しません 同 様 に 演 算 子 は 左 オペランドの 式 が true と 評 価 されると 右 オペランドの 式 を 評 価 せずにす 37

38 ぐに true を 返 します 右 オペランドの 式 は 左 オペランドの 式 が false を 返 す 場 合 にしか 評 価 しませ ん 論 理 演 算 子 は 式 を 一 方 しか 評 価 しない 場 合 があるため 短 絡 評 価 演 算 子 と 呼 ばれます 論 理 否 定 演 算 子 等 値 演 算 子 や 関 係 演 算 子 などはオペランドを 2 つとる 二 項 演 算 子 ですが 論 理 否 定 演 算 子 はオペランドを 1 つだけとる 単 項 演 算 子 です オペランドには 真 偽 値 を 返 す 式 を 指 定 し ます 論 理 否 定 演 算 子 は 式 が true であれば false 式 が false であれば true を 返 します 演 算 子 説 明!!a: 式 a が true の 場 合 に false 式 a が false の 場 合 に true を 返 す 条 件 分 岐 プログラミングでは 演 算 を 順 番 に 記 述 していくだけでなく 条 件 によって 異 なる 演 算 を 実 行 することもあります 条 件 に 応 じて 処 理 を 振 り 分 けることを 条 件 分 岐 といいます 条 件 分 岐 には if 文 if-else 文 switch 文 を 使 います if 文 if 文 は ある 条 件 に 合 致 する 場 合 にのみ 処 理 を 実 行 したい 場 合 に 利 用 します if ( 条 件 式 ) { 条 件 式 が true の 場 合 の 処 理 ; } if ( 条 件 式 ) 条 件 式 が true の 場 合 の 処 理 ; 条 件 式 false true 処 理 条 件 式 には true または false を 返 す 式 を 記 述 します { と } の 間 には 条 件 式 が true の 場 合 に 実 行 する 処 理 を 記 述 します 実 行 する 処 理 が 1 文 のみの 場 合 には { と } を 省 略 可 能 です 38

39 01: class IfSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: System.out.println("a: " + a); 05: 06: if (a%2 == 0) { // a 2 の 余 りは 0 か( 偶 数 か) 07: System.out.println(" 偶 数 "); 08: } 09: } 10: } 実 行 結 果 は 次 のとおりです >java IfSample 14 a: 14 偶 数 >java IfSample 13 a: 13 サンプルプログラムでは コマンドライン 引 数 として 受 け 取 った 数 字 が 偶 数 かどうかを 判 定 しています 整 数 を 2 で 割 って 余 りが 0 であれば 偶 数 です 偶 数 を 指 定 した 場 合 のみ 偶 数 と 表 示 されます if-else 文 if-else 文 は 条 件 が 真 の 場 合 と 偽 の 場 合 に 別 々の 処 理 を 実 行 したい 場 合 に 利 用 します if ( 条 件 式 ) { 条 件 式 が true の 場 合 の 処 理 ; } else { 条 件 式 が false の 場 合 の 処 理 ; } if ( 条 件 式 ) 条 件 式 が true の 場 合 の 処 理 ; else 条 件 式 が false の 場 合 の 処 理 ; 条 件 式 には true または false を 返 す 式 を 記 述 します 条 件 式 に 続 く { と } の 間 には 条 件 式 が true の 場 合 に 実 行 する 処 理 を 記 述 します else の 後 にに 続 く { と } の 間 に は 条 件 式 が false の 場 合 に 実 行 する 処 理 を 記 述 します 実 行 する 処 理 が 1 文 のみの 場 合 には { と } を 省 略 可 能 です 39

40 条 件 式 false true 処 理 1 処 理 2 01: class IfElseSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: System.out.println("a: " + a); 05: 06: if (a%2 == 0) { // a 2 の 余 りは 0 か( 偶 数 ) 07: System.out.println(" 偶 数 "); 08: } 09: else { // a 2 の 余 りは 0 以 外 ( 奇 数 ) 10: System.out.println(" 奇 数 "); 11: } 12: } 13: } 実 行 結 果 は 次 のとおりです >java IfElseSample 55 a: 55 奇 数 条 件 式 では 整 数 が 偶 数 かどうかを 判 定 しています 整 数 を 2 で 割 って 余 りが 0 であれば 条 件 式 に 続 く { と } の 間 の 処 理 0 以 外 であれば else に 続 く { と } の 間 の 処 理 が 実 行 されます 条 件 演 算 子 Java では if-else 文 と 同 じ 機 能 を 持 つ 条 件 演 算 子 を 利 用 できます 演 算 子 説 明? : a? b : c a が true の 場 合 に b false の 場 合 に c を 評 価 する たとえば if-else 文 のサンプルプログラムの 6~11 行 目 は 次 のように 書 き 換 えることが できます String s = (a%2 == 0)? " 偶 数 " : " 奇 数 "; 40

41 System.out.println(s); 条 件 演 算 子 によって(a%2 == 0)が true であれば" 偶 数 " false であれば" 奇 数 "が 評 価 され String 型 変 数 s に 代 入 されます 実 行 結 果 はサンプルプログラムと 同 じです 条 件 演 算 子 は 3 つのオペランドをとる 三 項 演 算 子 です if-else 文 のネスト 条 件 によって 3 つ 以 上 の 処 理 に 振 り 分 けたい 場 合 if-else 文 をネストさせて 利 用 します if ( 条 件 式 1) { 条 件 式 1 が true の 場 合 の 処 理 ; } else if ( 条 件 式 2) { 条 件 式 1 が false で 条 件 式 2 が true の 場 合 の 処 理 ; } else { 条 件 式 1 が false で 条 件 式 2 が false の 場 合 の 処 理 ; } if ( 条 件 式 1) 条 件 式 1 が true の 場 合 の 処 理 ; else if ( 条 件 式 2) 条 件 式 1 が false で 条 件 式 2 が true の 場 合 の 処 理 ; else 条 件 式 1 が false で 条 件 式 2 が false の 場 合 の 処 理 ; 条 件 式 1 が true であれば 条 件 式 1 に 続 く 処 理 が 実 行 されます 条 件 式 1 が false であれ ば 条 件 式 2 が 評 価 され true であればその 後 に 続 く 処 理 が 実 行 されます 条 件 式 2 が false であれば 最 後 の else に 続 く 処 理 が 実 行 されます 実 行 する 処 理 が 1 文 のみの 場 合 には { と } を 省 略 可 能 です if-else 文 のネストの 回 数 には 制 限 がありません 41

42 条 件 式 1 false 処 理 1 true 条 件 式 2 true false 処 理 2 処 理 3 01: class IfElseNestSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: System.out.println("a: " + a); 05: 06: if (a%2 == 0) { // a 2 の 余 りは 0 か(2 の 倍 数 ) 07: System.out.println("2 の 倍 数 "); 08: } 09: else if (a%3 == 0) { // a 3 の 余 りは 0 か(3 の 倍 数 ) 10: System.out.println("3 の 倍 数 "); 11: } 12: else { 13: System.out.println("2 の 倍 数 と 3 の 倍 数 以 外 "); 14: } 15: } 16: } 実 行 結 果 は 次 のとおりです >java IfElseNestSample 345 a: の 倍 数 switch 文 条 件 に 応 じて 複 数 の 処 理 に 分 岐 させたい 場 合 switch 文 を 使 うこともできます switch ( 式 ) { case 値 1: 式 が 値 1 の 場 合 に 実 行 する 処 理 ; break; case 値 2: 式 が 値 2 の 場 合 に 実 行 する 処 理 ; break; case 値 3: 42

43 } 式 が 値 3 の 場 合 に 実 行 する 処 理 ; break; default: デフォルト 処 理 ; switch 文 の 式 には char 型 byte 型 short 型 int 型 のいずれかに 評 価 される 式 を 指 定 します(プリミティブ 型 の 場 合 ) case には 式 の 評 価 結 果 と 同 じデータ 型 の 値 を 指 定 し ます 式 の 評 価 結 果 が case の 値 に 一 致 すると その case のところに 記 述 した 処 理 が 実 行 されま す break 文 を 記 述 しておくと そこで switch 文 から 抜 け 出 します default には いずれの case にも 一 致 しないときに 実 行 するデフォルト 処 理 を 記 述 します デフォルト 処 理 がない 場 合 には default 文 を 省 略 可 能 です 式 == 値 1 処 理 1 false true 式 == 値 2 処 理 2 false true 式 == 値 1 処 理 3 false true デフォルト 処 理 01: class SwitchSample { 02: public static void main(string[] args) { 03: int a = Integer.valueOf(args[0]); // 1 番 目 のコマンドライン 引 数 04: int b = a % 6; 05: System.out.println("a: " + a); 06: 07: switch(b) { 08: case 0: 09: System.out.println("6 の 倍 数 "); 10: break; 11: case 2: 12: case 4: 13: System.out.println("2 の 倍 数 "); 14: break; 15: case 3: 16: System.out.println("3 の 倍 数 "); 17: break; 18: default: 43

44 19: System.out.println("2 3 6 の 倍 数 以 外 "); 20: } 21: } 22: } 実 行 結 果 は 次 のとおりです >java SwitchSample 32 a: 32 2 の 倍 数 このサンプルプログラムでは コマンドライン 引 数 で 指 定 した 数 字 が2の 倍 数 3の 倍 数 6 の 倍 数 のいずれであるかを 判 定 しています コマンドライン 引 数 から 取 得 して 整 数 に 変 換 した 変 数 a を 6 で 割 り 余 りが 0 であれば 6 の 倍 数 余 りが 2 または 4 であれば 2 の 倍 数 余 りが 3 であれば 3 の 倍 数 と 判 定 できます その 判 定 に switch 文 を 使 用 しています 11 行 目 では case 2: と 記 述 していますが その 場 合 の 処 理 は 記 述 していません この case に 合 致 した 場 合 そのまま 次 の case 文 に 入 りそこに 記 述 された 処 理 が 実 行 されます 次 の case 4: には break 文 があるため ここで switch 文 から 抜 け 出 します このように break 文 など switch 文 から 抜 けるための 記 述 がない 場 合 には その case 以 下 の 処 理 がすべて 実 行 されます ループ 同 じ 処 理 を 何 度 も 繰 り 返 したい 場 合 に 使 うのがループです Java では while 文 do-while 文 for 文 でループを 記 述 できます while 文 と do-while 文 while 文 と do-while 文 は 指 定 された 条 件 式 が true の 間 だけ 処 理 を 繰 り 返 します while ( 条 件 式 ) { 繰 り 返 し 実 行 する 処 理 ; } while ( 条 件 式 ) 繰 り 返 し 実 行 する 処 理 ; do { 繰 り 返 し 実 行 する 処 理 ; } while ( 条 件 式 ) do 繰 り 返 し 実 行 する 処 理 ; while ( 条 件 式 ); 44

45 while do-while 条 件 式 false 処 理 処 理 true 条 件 式 true false 条 件 式 には 真 偽 値 を 返 す 式 を 指 定 します while 文 と do-while 文 は 条 件 式 が true を 返 す 間 { と } の 間 の 処 理 を 繰 り 返 します 実 行 する 処 理 が 1 文 のみの 場 合 には { と } を 省 略 可 能 です 01: class WhileSample { 02: public static void main(string[] args) { 03: int a = 0, b = 0; 04: 05: System.out.println("while start!!"); 06: while (a < 5) { 07: System.out.println("a: " + a++); 08: } 09: 10: System.out.println("do-while start!!"); 11: do { 12: System.out.println("b: " + b++); 13: } while (b < 5); 14: } 15: } 実 行 結 果 は 次 のとおりです while start!! a: 0 a: 1 a: 2 a: 3 a: 4 do-while start!! b: 0 b: 1 b: 2 b: 3 b: 4 45

46 サンプルプログラムでは int 型 変 数 a と b をインクリメントする 処 理 をそれぞれの 値 が 5 未 満 の 間 繰 り 返 します 実 行 結 果 からは while 文 と do-while 文 の 違 いがよくわからない ため 3 行 目 を int a = 5, b = 5; と 書 き 換 えて 実 行 してみましょう すると 実 行 結 果 は 次 のようになります while start!! do-while start!! b: 5 変 数 a と b には 5 が 代 入 されているため 繰 り 返 しを 実 行 する 条 件 式 は false になります そのため while 文 では 処 理 が 一 度 も 実 行 されません これは 条 件 式 の 評 価 を 繰 り 返 し 処 理 の 前 に 行 っているからです 一 方 do-while 文 は 条 件 式 が false になるにもかかわらず 処 理 が 一 度 実 行 されます これは 条 件 式 の 評 価 を 繰 り 返 し 処 理 の 後 に 行 っているからです while 文 と do-while 文 では 条 件 を 判 定 するタイミングが 異 なることに 注 意 してください for 文 for 文 は 処 理 を 繰 り 返 す 条 件 式 以 外 に 繰 り 返 し 処 理 の 前 処 理 と 後 処 理 を 指 定 できます for ( 前 処 理 ; 条 件 式 ; 後 処 理 ) { 繰 り 返 し 実 行 する 処 理 ; } for ( 前 処 理 ; 条 件 式 ; 後 処 理 ) 繰 り 返 し 実 行 する 処 理 ; 前 処 理 条 件 式 false true 処 理 後 処 理 46

47 前 処 理 には 処 理 を 繰 り 返 す 前 に 実 行 する 処 理 を 指 定 します たとえば カウンタの 初 期 値 に 0 を 設 定 するなど 繰 り 返 しに 必 要 な 準 備 を 行 います 条 件 式 には 真 偽 値 を 返 す 式 を 指 定 します for 文 は 条 件 式 が true を 返 す 間 { と } の 間 の 処 理 を 繰 り 返 します 実 行 する 処 理 が 1 文 のみの 場 合 には { と } を 省 略 可 能 で す 後 処 理 には { と } の 間 の 処 理 を 実 行 した 後 に 実 行 する 処 理 を 指 定 します たとえ ば カウンタのインクリメントなどを 記 述 します 01: class ForSample { 02: public static void main(string[] args) { 03: System.out.println("for start!!"); 04: for (int a = 0; a < 5; a++) { 05: System.out.println("a: " + a); 06: } 07: } 08: } 実 行 結 果 は 次 のとおりです for start!! a: 0 a: 1 a: 2 a: 3 a: 4 なお このサンプルプログラムでは for 文 の 前 処 理 として 変 数 a を 宣 言 しています 変 数 a は for 文 内 でのみ 有 効 であることに 注 意 してください 無 限 ループ ループは ファイルからのデータの 読 み 込 み 処 理 やユーザの 入 力 待 ち 処 理 などでよく 利 用 します このような 処 理 では 処 理 を 繰 り 返 す 条 件 があらかじめわからずに 条 件 式 を 指 定 できない 場 合 があります このような 場 合 には 永 遠 に 処 理 を 繰 り 返 す 無 限 ループを 記 述 し 処 理 の 途 中 で if 文 で 終 了 条 件 (ファイルの EOF コードや 入 力 の 終 了 を 示 す Enter キーなど)を 評 価 し break 文 でループを 抜 けるようにします while 文 と do-while 文 では 条 件 式 に true を 指 定 して 無 限 ループを 実 行 します while (true) { 繰 り 返 す 処 理 ; if (ループを 終 了 する 条 件 式 ) { break; // while 文 を 抜 ける } 47

48 } do { 繰 り 返 す 処 理 ; if (ループを 終 了 する 条 件 式 ) { break; // do-while 文 を 抜 ける } } while (true) for 文 は 条 件 式 を 省 略 します for ( ; ; ) { 繰 り 返 す 処 理 ; if (ループを 終 了 する 条 件 式 ) { break; // for 文 を 抜 ける } } 演 習 問 題 整 数 を 1 から 10 まで 加 算 していき その 過 程 の 結 果 と 最 終 結 果 を 表 示 するプログラムを while 文 を 使 って 作 成 しなさい while 文 を do-while 文 または for 文 に 置 き 換 えたプログラムを 作 成 しなさい 48

49 Chapter 06 Java の 文 法 ~その 4 [シラバス No. 02] 目 的 文 字 列 の 使 い 方 を 理 解 する 配 列 の 使 い 方 を 理 解 する 列 挙 型 の 概 要 を 理 解 する 文 字 列 Java では 文 字 列 はプリミティブ 型 のデータ 型 ではなく java.lang.string クラスで 扱 います つまり 文 字 列 は クラス 型 になります String クラス 型 の 変 数 String クラス 型 の 変 数 は 次 のように 宣 言 します String s; 初 期 値 には 文 字 列 を 二 重 引 用 符 で 囲 んだ 文 字 列 リテラルを 指 定 します String s = "ABC"; これは 次 の 文 と 同 じ 意 味 になります String s = new String("ABC"); この 文 では 文 字 列 ABC を 表 す String クラスのオブジェクトを 生 成 し String クラ ス 型 変 数 s に 代 入 しています クラスからオブジェクトを 生 成 する 場 合 new キーワード に 続 いてそのクラスのコンストラクタを 呼 び 出 します ここでは 引 数 として 文 字 列 を 指 定 したコンストラクタを 使 用 しています クラスとオブジェクトの 詳 細 については Chapter XX で 説 明 します String クラスのオブジェクトが 表 す 文 字 列 は 変 更 できない 文 字 列 定 数 です 前 述 のよ うに 宣 言 した 変 数 s は オブジェクトが 表 す 文 字 列 ABC への 参 照 を 格 納 しています そのため 次 の 文 は 変 数 s が 参 照 する 文 字 列 ABC を 上 書 きするのではなく 文 字 列 DEF への 参 照 を 変 数 s に 代 入 します s = "DEF"; 49

50 Chapter 04 で 説 明 したように + 演 算 子 や+= 演 算 子 を 使 うと 文 字 列 を 連 結 できます た だし 文 字 列 の 連 結 を 行 っても 元 の 文 字 列 が 変 更 されるわけではなく 連 結 された 文 字 列 を 表 すオブジェクトが 生 成 されます たとえば 次 のように+= 演 算 子 で 文 字 列 を 連 結 し ても 文 字 列 DEF が 文 字 列 DEFABC に 変 更 されるのではなく 文 字 列 DEFABC を 表 すオブジェクトが 新 たに 生 成 され その 参 照 が 変 数 s に 代 入 されます s += "ABC"; 文 字 列 の 比 較 次 のように String クラス 型 変 数 を 宣 言 し 文 字 列 リテラルを 指 定 して 初 期 化 した 場 合 変 数 sa と sb は 同 じ 文 字 列 リテラル ABC を 参 照 しています String sa = "ABC"; String sb = "ABC"; そのため 次 のように 等 値 演 算 子 で 変 数 sa と sb を 比 較 すると 結 果 は true になります if (sa == sb) // true を 返 す しかし 次 のように String クラス 型 変 数 sc を 宣 言 すると 変 数 sc は 文 字 列 リテラル ABC ではなく 別 の 文 字 列 ABC を 参 照 します String sc = new String("ABC"); そのため 次 のように 等 値 演 算 子 で 変 数 sa と sc を 比 較 すると 結 果 は false になります if (sa == sc) // false を 返 す これは クラス 型 変 数 を 等 値 演 算 子 で 比 較 すると 参 照 しているオブジェクトが 同 じで あれば true 異 なる 場 合 は false を 返 すからです String クラス 型 の 変 数 が 参 照 するオブ ジェクトの 内 容 の 文 字 列 自 体 を 比 較 したい 場 合 は String クラスの equals メソッドを 使 い ます boolean equals(object anobject) equals メソッドは 引 数 として 受 け 取 った Object クラス 型 のオブジェクトの 内 容 と 自 オ ブジェクトが 表 す 文 字 列 を 比 較 します 文 字 列 が 同 じ 場 合 は true 異 なる 場 合 は false を 返 します 50

51 01: class StrCompareSample { 02: public static void main(string[] args) { 03: String sa = "ABC"; // 文 字 列 リテラル ABC を 参 照 04: String sb = "ABC"; // 文 字 列 リテラル ABC を 参 照 05: String sc = new String("ABC"); // 文 字 列 ABC を 参 照 06: 07: System.out.println("sa == sb: " + (sa == sb)); 08: System.out.println("sa.equals(sb): " + sa.equals(sb)); 09: System.out.println("sa == sc: " + (sa == sc)); 10: System.out.println("sa.equals(sc): " + sa.equals(sc)); 11: } 12: } 実 行 結 果 は 次 のとおりです sa == sb: true sa.equals(sb): true sa == sc: false sa.equals(sc): true 文 字 列 の 操 作 String クラスは 文 字 列 を 操 作 するために 便 利 なメソッドを 提 供 しています char charat(int n) 引 数 に 指 定 されたインデックス(0~length( )-0)の 位 置 の 文 字 を 返 します boolean equalsignorecase(string s) 引 数 に 指 定 された 文 字 列 と 大 文 字 と 小 文 字 の 違 いを 無 視 して 比 較 を 行 います int length( ) 文 字 列 の 長 さを 返 します String substring(int b) String substring(int b, int e) 指 定 された 開 始 位 置 (b)から 最 後 まで または 終 了 位 置 (e)の 前 までの 部 分 文 字 列 を 返 します 文 字 の 位 置 は 1 文 字 目 を 0 とします String tolowercase( ) 小 文 字 に 変 換 した 文 字 列 を 返 します String touppercase( ) 大 文 字 に 変 換 した 文 字 列 を 返 します 51

52 String concat(string s) 指 定 された 文 字 列 を 末 尾 に 連 結 した 文 字 列 を 返 します char[] tochararray() 文 字 列 を 文 字 型 の 配 列 に 変 換 して 返 します String trim() 先 頭 または 末 尾 の 空 白 を 取 り 除 いた 文 字 列 を 返 します static String valueof(xxx o) 指 定 されたデータ 型 (boolean char char[] double float int long Object)の 値 を 文 字 列 に 変 換 して 返 します 01: class StrMethodSample { 02: public static void main(string[] args) { 03: String sa = "ABCDEFGHI"; 04: String sb = new String("abcdefghi"); 05: 06: System.out.println("sa: " + sa + " sb: " + sb); 07: System.out.println("sa.charAt(5): " + sa.charat(5)); 08: System.out.println("sa.equalsIgnoreCase(sb): " + 09: sa.equalsignorecase(sb)); 10: System.out.println("sa.length(): " + sa.length()); 11: System.out.println("sa.substring(2): " + sa.substring(2)); 12: System.out.println("sb.substring(1, 4): " + sb.substring(1, 4))13: ; 14: System.out.println("sa.toLowerCase(): " + sa.tolowercase()); 15: System.out.println("sb.toUpperCase(): " + sb.touppercase()); 16: } 17: } 実 行 結 果 は 次 のとおりです sa: ABCDEFGHI sb: abcdefghi sa.charat(5): F sa.equalsignorecase(sb): true sa.length(): 9 sa.substring(2): CDEFGHI sb.substring(1, 4): bcd sa.tolowercase(): abcdefghi sb.touppercase(): ABCDEFGHI 配 列 配 列 は 同 じデータ 型 の 要 素 を 複 数 集 めたデータ 構 造 です 配 列 自 体 はオブジェクトに なります したがって 配 列 型 は 参 照 型 です 52

53 プリミティブ 型 の 配 列 プリミティブ 型 の 配 列 の 変 数 は 次 のように 宣 言 します プリミティブ 型 [ ] 変 数 名 ; プリミティブ 型 変 数 名 [ ]; これは 配 列 型 変 数 のみで 要 素 を 格 納 するための 配 列 の 領 域 は 確 保 されません 次 のように 記 述 すると 配 列 型 変 数 を 宣 言 し 配 列 の 領 域 も 確 保 されます プリミティブ 型 [ ] 変 数 名 = new プリミティブ 型 [ 要 素 数 ]; プリミティブ 型 変 数 名 [ ] = new プリミティブ 型 [ 要 素 数 ]; また 右 オペランドに 配 列 に 格 納 する 初 期 値 を 指 定 すると 配 列 の 領 域 が 確 保 され 要 素 に 値 が 設 定 されます プリミティブ 型 [ ] 変 数 名 = { 要 素 1 の 初 期 値, 要 素 2 の 初 期 値, }; プリミティブ 型 変 数 名 [ ] = { 要 素 1 の 初 期 値, 要 素 2 の 初 期 値, }; int 型 の 配 列 の 場 合 次 のようになります int 型 配 列 を 参 照 する 変 数 aの 宣 言 ( 配 列 の 領 域 は 確 保 されない) int 型 配 列 を 参 照 する 変 数 aを 宣 言 し 配 列 の 領 域 を 確 保 する int 型 配 列 を 参 照 する 変 数 aを 宣 言 し 配 列 の 領 域 を 確 保 し 要 素 に 初 期 値 を 代 入 する int[] a; int[] a = new int[ 要 素 数 ]; int[] a = {10, 20, 30, 40, 50}; int 型 int 型 int 型 a a[0] a a[0] a 10 a[0] a[1] a[1] 20 a[1] a[2] a[2] 30 a[2] a[3] a[3] 40 a[3] a[4] a[4] 50 a[4] a[ 要 素 数 -1] a[ 要 素 数 -1] 配 列 の 各 要 素 は 次 のように 参 照 します インデックスには 0~ 配 列 の 要 素 数 -1 を 指 定 可 能 です 配 列 型 の 変 数 名 [インデックス] また 次 の 記 述 により 配 列 に 格 納 される 要 素 数 を 調 べることができます 配 列 型 の 変 数 名.length 01: class IntArraySample { 02: public static void main(string[] args) { 53

54 03: int[] a = {10, 20, 30, 40, 50}; 04: int i = 0; 05: 06: // 配 列 の 各 要 素 を 順 番 に 表 示 する 07: while (i < a.length) { // インデックスが 要 素 数 未 満 の 間 実 行 08: System.out.println("a[" + i + "]: " + a[i++]); 09: } 10: } 11: } 実 行 結 果 は 次 のとおりです a[0]: 10 a[1]: 20 a[2]: 30 a[3]: 40 a[4]: 50 このサンプルプログラムでは 初 期 値 を 指 定 して int 型 の 配 列 を 宣 言 しています while 文 では 配 列 の 各 要 素 を 順 番 に 表 示 しています while 文 を 実 行 する 条 件 は 配 列 のインデ ックスが a.length すなわち 配 列 の 要 素 数 未 満 の 場 合 です 配 列 のインデックスは 0 から 始 まります また 後 置 型 のインクリメント 演 算 子 で 要 素 の 参 照 後 にインクリメントして いる 点 に 注 意 してください 参 照 型 の 配 列 参 照 型 の 配 列 もプリミティブ 型 の 配 列 とほぼ 同 じです 参 照 型 の 配 列 の 変 数 は 次 のよう に 宣 言 します 参 照 型 [ ] 変 数 名 ; 参 照 型 変 数 名 [ ]; 配 列 型 の 変 数 を 宣 言 し 配 列 の 領 域 をも 確 保 されます 参 照 型 [ ] 変 数 名 = new 参 照 型 [ 要 素 数 ]; 参 照 型 変 数 名 [ ] = new 参 照 型 [ 要 素 数 ]; また 右 オペランドに 配 列 に 格 納 する 初 期 値 を 指 定 すると 配 列 の 領 域 が 確 保 され 要 素 に 値 が 設 定 されます 参 照 型 [ ] 変 数 名 = { 要 素 1 の 初 期 値, 要 素 2 の 初 期 値, }; 参 照 型 変 数 名 [ ] = { 要 素 1 の 初 期 値, 要 素 2 の 初 期 値, }; 初 期 値 にはその 参 照 型 のオブジェクトを 指 定 します つまり 参 照 型 の 配 列 の 要 素 には 54

55 オブジェクトの 参 照 が 格 納 されます String クラス 型 の 配 列 の 場 合 次 のようになります Stringクラス 型 配 列 を 参 照 する 変 数 sの 宣 言 ( 配 列 の 領 域 は 確 保 されない) Stringクラス 型 配 列 を 参 照 する 変 数 sを 宣 言 し 配 列 の 領 域 を 確 保 する( 配 列 の 各 要 素 は 文 字 列 を 参 照 していない) Stringクラス 型 配 列 を 参 照 する 変 数 sを 宣 言 し 配 列 の 領 域 を 確 保 して 各 要 素 が 文 字 列 を 参 照 するようにする String[] s; String[] s = new String[ 要 素 数 ]; String[] s = {"ABC", "DEF", "GHI", "JKL", "MNO"}; Stringクラス 型 Stringクラス 型 String 型 s s[0] s s[0] 文 字 列 s s[0] ABC s[1] s[1] 文 字 列 s[1] DEF s[2] s[2] 文 字 列 s[2] GHI s[3] s[3] 文 字 列 s[3] JKL s[4] s[4] 文 字 列 s[4] MNO s[ 要 素 数 -1] s[ 要 素 数 -1] 文 字 列 01: class StrArraySample { 02: public static void main(string[] args) { 03: String[] s = {"ABC", "DEF", "GHI", "JKL", "MNO"}; 04: int i = 0; 05: 06: // 配 列 の 各 要 素 を 順 番 に 表 示 する 07: while (i < s.length) { // インデックスが 要 素 数 未 満 の 間 実 行 08: System.out.println("s[" + i + "]: " + s[i++]); 09: } 10: } 11: } 実 行 結 果 は 次 のとおりです s[0]: ABC s[1]: DEF s[2]: GHI s[3]: JKL s[4]: MNO 参 照 型 の 配 列 は プリミティブ 型 の 配 列 を 同 じように 扱 うことができますが 構 造 が 異 なることに 注 意 してください 拡 張 for 文 配 列 のすべての 要 素 に 対 して 同 じ 処 理 を 実 行 する 場 合 拡 張 for 文 を 利 用 できます 拡 張 for 文 に 配 列 の 要 素 を 格 納 する 変 数 と 配 列 の 変 数 を 指 定 すると 配 列 の 先 頭 から 末 尾 の 要 素 まで 処 理 が 繰 り 返 されます 通 常 の for 文 のように 条 件 式 を 指 定 する 必 要 はありません for ( 配 列 の 要 素 のデータ 型 変 数 名 : 配 列 の 変 数 名 ) { // 配 列 の 各 要 素 に 対 して 実 行 する 処 理 ; } 55

56 たとえば StrArraySample は 次 のように 書 き 直 すことができます 01: class StrArraySample { 02: public static void main(string[] args) { 03: String[] s = {"ABC", "DEF", "GHI", "JKL", "MNO"}; 04: int i = 0; 05: 06: // 拡 張 for 文 07: for (String temp : s) { // 配 列 の 各 要 素 を 順 番 に 表 示 する 08: System.out.println("s[" + i++ + "]: " + temp); 09: } 10: } 11: } 実 行 結 果 は 同 じです n 次 元 配 列 配 列 はネストさせることができます たとえば 次 のように 記 述 すると a は int 型 の 配 列 を 参 照 する 配 列 型 変 数 になります int[][] a = { {1, 2, 3}, {11, 22, 33, 44, 55}}; a[0]は 最 初 の 3 つの 要 素 を 持 つ int 型 配 列 を 参 照 します また その 配 列 内 の 2 番 目 の 要 素 を 参 照 するには a[0][1]と 記 述 します このようにネストさせた 配 列 を n 次 元 配 列 といいます n は 含 まれる 配 列 の 数 です この 例 の 場 合 は 2 次 元 配 列 になります 2 次 元 配 列 の 要 素 をすべて 表 示 するサンプルプログラムを 作 成 してみましょう 01: class NestArraySample { 02: public static void main(string[] args) { 03: int[][] a = { {1, 2, 3}, {11, 22, 33, 44, 55}}; 04: int i, j; 05: 06: // 配 列 の 各 要 素 を 順 番 に 表 示 する 07: for (i = 0; i < a.length; i++) { // 最 初 (a[]) 08: for (j =0; j < a[i].length; j++) { // 2 番 目 (a[][]) 09: System.out.println("a["+i+"]["+j+"]: " + a[i][j]); 10: } 11: } 12: } 13: } 実 行 結 果 は 次 のとおりです a[0][0]: 1 a[0][1]: 2 56

57 a[0][2]: 3 a[1][0]: 11 a[1][1]: 22 a[1][2]: 33 a[1][3]: 44 a[1][4]: 55 2 次 元 配 列 の 各 要 素 をすべて 参 照 するには ループの 中 でさらにループを 実 行 します 演 習 問 題 コマンドライン 引 数 から 5 個 の 文 字 列 を 受 け 取 って 配 列 に 格 納 し 各 要 素 を 順 番 に 表 示 するプロ グラムを 作 成 しなさい 10 個 の 要 素 を 持 つ int 型 の 配 列 を 宣 言 して 各 要 素 に 0~インデックス+1 の 整 数 を 加 算 した 整 数 (インデックスが 0 なら 0+1 インデックスが 1 なら )を 格 納 し 各 要 素 を 順 番 に 表 示 するプログラムを 作 成 しなさい 57

58 Chapter 07 オブジェクト 指 向 とは [シラバス No. 03 No.04] 目 的 オブジェクト 指 向 の 概 要 を 理 解 する カプセル 化 継 承 多 相 性 を 理 解 する オブジェクト 指 向 プログラミングとは オブジェクト オブジェクト 指 向 プログラミングの 中 心 となるのはオブジェクトです オブジェクトは 英 語 で object 日 本 語 では もの です 現 実 の 世 界 にはオブジェクトが あふれています 人 間 のひとりひとりも もの と 言 えます 自 分 自 身 のことを 考 えてみましょう 自 分 は 人 間 の 1 人 です 自 分 には 名 前 国 籍 仕 事 などがあります 他 人 とは 異 なる 自 分 独 自 の 値 を 持 つこれらの 特 徴 は オブジェクトの 属 性 (フィールド)です また 自 分 は 食 べる 眠 る 仕 事 をする などの 行 動 をとります これらの 行 動 は 属 性 の 値 によって 異 なります これがオブジェクトの 振 る 舞 い(メソッド)です 自 分 オブジェクト 属 性 名 前 = 安 藤 ろいど 国 籍 = 日 本 仕 事 = 学 生 振 る 舞 い 食 べる 眠 る 仕 事 をする たとえば 仕 事 属 性 が 学 生 である 自 分 オブジェクトに 仕 事 をする よう にメッセージを 送 ります すると 仕 事 属 性 が 学 生 であるため 実 際 の 振 る 舞 いは 勉 強 をする になります 仕 事 属 性 が プログラマ である 自 分 オブジェクトな ら プログラミングをする という 振 る 舞 いです 58

59 オブジェクトA 属 性 の 値 によって オブジェクトの 振 る 舞 いが 決 まる 属 性 仕 事 = 学 生 振 る 舞 い 仕 事 をする = 勉 強 をする 仕 事 を する オブジェクトB 属 性 仕 事 = プログラマ 振 る 舞 い 仕 事 をする =プログラミングをする オブジェクトはその 属 性 の 値 によって 異 なる 振 る 舞 いをします プログラム 内 で 複 数 の オブジェクトを 使 って 互 いにメッセージを 送 る(=メソッドを 呼 び 出 す)ことで 処 理 を 進 めていくのがオブジェクト 指 向 プログラミングです クラス 仕 事 属 性 が 学 生 のオブジェクトもあれば プログラマ のオブジェクトもあり ます それ 以 外 にもさまざまな 値 を 持 つオブジェクトがあります これらのオブジェクト は 仕 事 などの 共 通 した 属 性 を 持 ち 仕 事 をする などの 共 通 した 振 る 舞 いを 持 ちま す そこで オブジェクトに 共 通 する 属 性 と 振 る 舞 いをまとめると これらのオブジェクト がどのようなものかを 示 す 枠 組 みを 作 成 できます この 枠 組 みがクラスです 自 分 オブ ジェクトに 共 通 する 属 性 (フィールド)と 振 る 舞 い(メソッド)を 定 義 すると 人 間 ク ラスを 作 成 できます ただし 人 間 クラスはそのままでは 使 えません クラスは 枠 組 みであり いわばオブ ジェクトの 設 計 図 でしかないからです そのため プログラム 上 では 人 間 クラスから オブジェクトを 生 成 して 利 用 します これをインスタンス 生 成 といいます 59

60 人 間 クラス 自 分 オブジェクト 属 性 (フィールド) 名 前 国 籍 仕 事 振 る 舞 い(メソッド) 食 べる 眠 る 仕 事 をする 具 体 的 な 値 を 与 えて オブジェクトを 生 成 する インスタンス 生 成 属 性 (フィールド) 名 前 = 安 藤 ろいど 国 籍 = 日 本 仕 事 = 学 生 振 る 舞 い(メソッド) 食 べる 眠 る 仕 事 をする インスタンスは 実 例 という 意 味 です(オブジェクトとほぼ 同 義 と 考 えてかまいません) インスタンス 生 成 を 行 うことで 枠 組 みに 実 体 を 与 えます すなわち オブジェクト 用 に 必 要 なメモリを 確 保 し 属 性 (フィールド)に 値 を 設 定 して プログラム 上 で 利 用 可 能 に します 手 続 き 指 向 プログラミングとオブジェクト 指 向 プログラミング 手 続 き 指 向 プログラミングの 場 合 手 続 き 指 向 プログラミングとは 手 続 き(プロシージャ)を 中 心 とするプログラミング 手 法 です ファイルからデータを 読 み 取 る 処 理 を 行 いたいとします 手 続 き 指 向 プログラミン グでは オープン 読 み 取 り クローズ といった 手 続 きを 関 数 として 記 述 します プ ログラムでは ファイルの 名 前 や 種 類 などの 情 報 を 引 数 として 渡 して 関 数 を 呼 び 出 し 処 理 を 行 います プログラム ファイル 名 入 力 オープン 入 力 ファイル 読 み 取 り 実 行 結 果 出 力 クローズ 出 力 画 面 たとえば テキストファイルと 画 像 ファイルのように ファイルの 種 類 によって 読 み 取 り 方 法 が 異 なる 場 合 があります このような 場 合 手 続 き 指 向 プログラミングでは テキ 60

61 ストの 読 み 取 り と 画 像 の 読 み 取 り のようにさらに 関 数 を 作 成 して ファイルの 種 類 に 応 じて 別 の 関 数 を 呼 び 出 すようにします プログラム ファイル 名 入 力 オープン 実 行 結 果 出 力 読 み 取 り クローズ テキストの 読 み 取 り 画 像 の 読 み 取 り 手 続 き 指 向 プログラミングでは このように 手 続 きを 関 数 に 分 割 することで 開 発 効 率 を 上 げることができます しかし 最 初 は 2 種 類 でも 仕 様 変 更 後 に 何 種 類 にも 増 えた 場 合 関 数 を 追 加 するだけでなく 関 数 を 呼 び 出 している 場 所 をすべて 修 正 しなければなり ません さらに 読 み 取 り の 手 続 き 自 体 に 変 更 があれば 関 連 する 関 数 をすべて 修 正 す る 必 要 があります システムの 規 模 が 多 くなると 関 数 の 数 も 増 えるため システムの 保 守 に 手 間 がかかるようになります オブジェクト 指 向 プログラミングの 場 合 オブジェクト 指 向 プログラミングで 同 様 の 処 理 を 実 行 することを 考 えてみましょう まず 基 本 となる ファイル クラスを 作 成 します ファイル クラスには ファイル の 名 前 や 種 類 を 格 納 するフィールドと オープン 読 み 取 り クローズを 行 うメソッドを 定 義 します ファイルクラス 属 性 (フィールド) 名 前 種 類 振 る 舞 い(メソッド) オープン 読 み 取 り クローズ プログラムでは ファイルクラスからインスタンス 生 成 によりオブジェクトを 作 成 し 61

62 オブジェクトに 名 前 や 種 類 などを 設 定 します あとはオブジェクトのオープンメソッド 読 み 取 りメソッド クローズメソッドを 呼 び 出 し その 結 果 を 受 け 取 るだけです ファイルクラス 属 性 (フィールド) 名 前 種 類 振 る 舞 い(メソッド) オープン 読 み 取 り クローズ 名 前 と 種 類 の 値 を 与 えて オブジェクトを 生 成 する インスタンス 生 成 メソッドの 呼 び 出 し 実 行 結 果 ファイルオブジェクト 属 性 (フィールド) 名 前 = somefile 種 類 = テキスト 振 る 舞 い(メソッド) オープン 読 み 取 り クローズ 呼 び 出 し 側 では どのように 処 理 を 行 うかはオブジェクトに 任 せ 詳 細 には 関 知 しませ ん そのため 手 続 き 自 体 に 変 更 があった 場 合 ファイル クラスのメソッドを 修 正 する だけで 呼 び 出 し 側 のプログラムは 修 正 せずに 済 みます ファイルの 種 類 が 増 えたときには ファイル クラスの 機 能 を 受 け 継 ぐ テキストファ イル クラスと 画 像 ファイル クラスを 作 成 し それぞれのクラスで 異 なる 部 分 だけを 修 正 または 追 加 します ゼロからクラスを 作 成 せずに 済 むため 効 率 的 です また ファイル クラスを 修 正 し ファイルの 種 類 に 応 じて テキストファイル クラ スまたは 画 像 ファイル クラスのオブジェクトを 返 すようにします 呼 び 出 し 側 では フ ァイル クラス 型 のオブジェクトとして 受 け 取 りますが そのオブジェクトに 対 して 読 み 取 りメソッドを 呼 び 出 すと オブジェクトの 種 類 に 応 じた 処 理 が 行 われます テキストフ ァイル クラスのオブジェクトであれば テキストファイルの 読 み 取 りが 行 われるという ことです そのため いくら 新 しいクラスを 追 加 しても 呼 び 出 し 側 ではコードを 修 正 せ ずに 済 みます オブジェクト 指 向 プログラミングを 採 用 すると 大 規 模 なシステムでは 保 守 性 が 向 上 し ます また 複 雑 な 処 理 の 詳 細 をクラスに 隠 し クラスの 利 用 方 法 に 従 って 利 用 すれば 開 発 も 容 易 になり 効 率 がアップします カプセル 化 継 承 多 相 性 オブジェクト 指 向 プログラミングでは カプセル 化 継 承 多 相 性 を 理 解 することが 重 要 です カプセル 化 カプセル 化 とは 処 理 の 詳 細 やデータをオブジェクト 内 に 隠 蔽 することです 前 述 の 例 62

63 で 言 うと 呼 び 出 し 側 ではオブジェクトを 生 成 してメソッドを 呼 び 出 すだけで 処 理 はオ ブジェクトに 任 せ 詳 細 には 関 知 しない ことがカプセル 化 に 該 当 します カプセル 化 は クラスで 定 義 したメソッドの 仕 様 ( 引 数 戻 り 値 例 外 など)のみを 公 開 することで 実 現 します フィールドは 外 部 から 直 接 アクセスできないようにして フィ ールドを 参 照 または 変 更 するメソッドを 提 供 します Aクラスのオブジェクト private idフィールド public setidメソッド getidメソッド 他 のオブジェクト 呼 び 出 し 側 では 公 開 されているメソッドを 呼 び 出 してオブジェクトに 処 理 を 任 せます 処 理 の 詳 細 を 気 にする 必 要 がないため 開 発 効 率 の 向 上 が 可 能 になります また 仕 様 変 更 によりメソッドの 処 理 やフィールドのデータ 構 造 が 変 わっても メソッドの 仕 様 が 変 わ らない 限 り 呼 び 出 し 側 ではプログラムを 修 正 する 必 要 がありません そのため プログラ ムの 保 守 性 が 上 がります 継 承 継 承 とは 既 存 のクラスの 機 能 を 引 き 継 いで 新 しいクラスを 作 成 することです 前 述 の 例 では ファイル クラスの 機 能 を 受 け 継 ぐ テキストファイル クラスと 画 像 ファイ ル クラスを 作 成 すること が 継 承 に 該 当 します 継 承 では 継 承 元 のクラスをスーパークラス スーパークラスを 継 承 して 作 成 するクラ スをサブクラスといいます Java では クラスの 基 本 機 能 を 提 供 する java.lang.object ク ラスがすべてのクラスのスーパークラスになります Java で 利 用 するクラスは Java API のクラスも 自 分 で 作 成 するクラスもすべて Object クラスを 継 承 するサブクラスです サブクラスでは スーパークラスから 機 能 を 引 き 継 ぐだけでなく サブクラスに 固 有 の 機 能 を 追 加 できます また スーパークラスから 引 き 継 いだメソッドを 上 書 きして サブ クラス 用 に 再 定 義 できます これをオーバーライドといいます 63

64 Superクラス スーパークラス フィールド メソッド 継 承 Sub extends Super Subクラス Superクラスから 引 き 継 いだ 部 分 サブクラス フィールド メソッド Subクラスで 追 加 した 部 分 フィールド メソッド サブクラスでは スーパークラスのフィールドや メソッドを 受 け 継 ぎ さらに 新 しいフィールドや メソッドを 定 義 したり スーパークラスのメソッ ドをオーバーライドできる 継 承 を 利 用 すると 既 存 のプログラムの 再 利 用 性 が 高 くなり 開 発 効 率 の 向 上 を 期 待 で きます メモ サブクラスとスーパークラスは is-a の 関 係 になります サブクラス is-a スーパークラス つ まり サブクラスはスーパークラスの 一 種 という 意 味 です 前 述 の 例 では テキストファイルはフ ァイルの 一 種 となります is-a 関 係 が 成 立 する 場 合 には 継 承 を 利 用 できます たとえば トラックは 自 動 車 の 一 種 という 関 係 が 成 り 立 つなら 自 動 車 クラスをスーパークラスとし 継 承 によりトラッククラスをサブクラスと して 定 義 することが 可 能 です 逆 に is-a 関 係 が 成 り 立 たなければ 継 承 を 利 用 できないということです オレンジは 動 物 の 一 種 というのは 誤 りなので 動 物 クラスを 継 承 してオレンジクラスを 定 義 することはできません 多 相 性 多 相 性 (ポリモーフィズム)とは 見 かけは 同 じオブジェクトに 見 えても その 種 類 に 応 じて 実 際 の 振 る 舞 いが 決 まるということです 前 述 の 例 では オブジェクトに 対 して 読 み 取 りメソッドを 呼 び 出 すと オブジェクトの 種 類 に 応 じた 処 理 が 行 われること が 多 相 性 に 該 当 します Java では クラスからオブジェクトを 生 成 してその 参 照 をクラス 型 の 変 数 に 代 入 し そ の 変 数 を 介 してメソッドを 呼 び 出 します たとえば File クラスに read メソッドがあれば 次 のようにメソッドを 呼 び 出 します File obj = new File(); // File クラスのオブジェクトを 生 成 して 参 照 を 代 入 obj.method(); // read メソッドの 呼 び 出 し 64

65 File クラスを 継 承 して TextFile クラスを 作 成 します TextFile クラスでは read メソッド をオーバーライドしており File クラスとは 異 なる 振 る 舞 いをします TextFile クラスも 同 じようにオブジェクトを 生 成 して 利 用 しますが その 参 照 を File クラス 型 の 変 数 に 代 入 することができます File obj = new TextFile(); // TextFile クラスのオブジェクトを 生 成 して 参 照 を 代 入 obj.method(); // read メソッドの 呼 び 出 し 変 数 obj は 見 かけは File クラス 型 ですが 実 際 には TextFile クラスのオブジェクトを 参 照 しています したがって 変 数 obj に 対 して read メソッドを 呼 び 出 すと TextFile クラス の read メソッドが 呼 び 出 されます このように 同 じ 処 理 を 実 行 しても 実 際 のオブジェクトによって 振 る 舞 いが 異 なるとい うのが 多 相 性 です 多 相 性 によって 新 しいクラスが 追 加 されてもメソッドの 呼 び 出 し 側 ではコードを 修 正 せずに 済 むため カプセル 化 や 継 承 と 同 様 に 保 守 性 や 開 発 効 率 の 向 上 が 可 能 になります 演 習 問 題 手 続 き 指 向 プログラミングと 比 較 して オブジェクト 指 向 プログラミングにどのようなメリットがある か 考 察 しなさい オブジェクト 指 向 のカプセル 化 継 承 多 相 性 の 概 念 を 説 明 し 理 解 できているかどうか 確 認 し なさい 65

66 Chapter 08 クラス~その 1 [シラバス No. 03 No.04] 目 的 クラスを 定 義 して 利 用 する 方 法 を 理 解 する カプセル 化 をどのように 実 現 するかを 理 解 する クラスの 定 義 これまでに 説 明 したように 簡 単 な Java プログラムは 次 の 手 順 で 作 成 します 1. 必 要 なクラスを 作 成 し メソッドとフィールドを 定 義 する 2. クラスからオブジェクトを 生 成 し その 参 照 をクラス 型 変 数 に 代 入 する 3. クラス 型 変 数 を 介 して メソッドの 呼 び 出 しやフィールドのアクセスを 行 う この 手 順 を 確 認 するために 次 の Super クラスと AppSample クラスを 作 成 します Super クラス Super クラスは 次 のメソッドとフィールドを 持 ちます message メソッド:クラス 名 と 引 数 として 受 け 取 った 文 字 列 を 出 力 し 戻 り 値 として number フィー ルドの 値 を 返 す number フィールド:int 型 の 整 数 を 格 納 する 01: class Super { 02: public int number = 0; // number フィールド(インスタンス 変 数 ) 03: 04: // クラス 名 と 指 定 された 文 字 列 を 表 示 する 05: public int message(string str) { 06: System.out.println(str + " : " + getclass().getname()); 07: return number; 08: } 09: } message メソッドと numberフィールドにはアクセス 修 飾 子 としてpublic を 指 定 します public はクラスの 内 部 および 外 部 に 関 係 なく どこからでもアクセスできることを 意 味 し ます アクセス 修 飾 子 の 詳 細 については Chapter 11 で 説 明 します AppSample クラス AppSample クラスには main メソッドを 定 義 します main メソッドで Super クラスの 66

67 オブジェクトを 生 成 して 利 用 します AppSample クラスのコードは 次 節 で 示 します オブジェクトの 生 成 new キーワードとコンストラクタ Super クラスを 利 用 するには オブジェクトを 生 成 する 必 要 があります クラスからオ ブジェクトを 生 成 するには 次 のように 記 述 します クラス 名 変 数 名 = new クラス 名 (); クラス 名 変 数 名 = new クラス 名 ( 引 数 リスト); new キーワードに 続 いてコンストラクタの 呼 び 出 しを 記 述 します コンストラクタは 特 別 な 形 式 のメソッドで 名 前 はクラス 名 と 同 じになります AppSample クラスの main メソッドでは 次 のように Super クラスのオブジェクトを 生 成 します Super obj = new Super(); メソッドの 呼 び 出 しとフィールドへのアクセス クラス 型 変 数 には 生 成 したオブジェクトの 参 照 が 格 納 されます この 変 数 を 使 ってクラ スのメソッドやフィールドにアクセスします 変 数 名.フィールド 名 ; 変 数 名.メソッド 名 ( 引 数 リスト); AppSample クラスの main メソッドでは 次 のように Super クラスのフィールドとメソ ッドを 利 用 しています obj.number = 100; int ret = obj.message("c08"); // number フィールドに 値 を 設 定 する // message メソッドを 呼 び 出 す 戻 り 値 を 返 すメソッドの 場 合 戻 り 値 と 同 じデータ 型 の 変 数 と 代 入 演 算 子 を 指 定 すれば メソッドの 戻 り 値 がその 変 数 に 代 入 されます AppSample クラスは 次 のようになります 01: class AppSample { 02: public static void main(string[] args) { 03: Super obj = new Super(); // Super クラスのオブジェクトを 生 成 する 04: 05: obj.number = 100; // number フィールドを 設 定 する 06: int ret = obj.message("c08"); // message メソッドを 呼 び 出 す 67

68 07: System.out.println("AppSample : " + ret); 08: } 09: } 実 行 結 果 は 次 のとおりです Super : C08 AppSample : 100 メモ Super クラスの 6 行 目 には 次 のような 記 述 があります getclass().getname() getclass は Object クラスのメソッドで オブジェクト 自 体 のクラスを 表 す Class クラス 型 のオブジ ェクトを 返 します また getname は Class クラスのメソッドで クラス 名 を 表 す 文 字 列 を 返 します getclass()という 記 述 は Class クラス 型 のオブジェクトを 返 すため それに 続 いて.(ピリオド)と Class クラスのメソッドを 記 述 すれば そのメソッドを 呼 び 出 すことができます この 記 述 は Super クラスの 名 前 として Super を 返 します オブジェクトを 一 度 だけ 利 用 する 場 合 などは 変 数 を 宣 言 せずにこのようにしてオブジェクトを 取 得 してメソッドを 呼 び 出 すことができます カプセル 化 によるフィールドの 隠 蔽 ここで Super クラスの number フィールドの 定 義 を 次 のように 変 更 してみましょう private int number = 0; private は クラスの 内 部 でのみアクセスを 許 可 するという 意 味 です すると AppSample クラスのコンパイルで 次 のエラーが 発 生 します AppSample.java:5: number は Super で private アクセスされます obj.number = 100; // number フィールドを 設 定 する ^ エラー 1 個 これは private を 指 定 した number フィールドは 外 部 からアクセスできなくなるからで す フィールドに 直 接 アクセスしていると クラスの 仕 様 変 更 に 伴 い 呼 び 出 し 側 のクラス も 修 正 が 必 要 になることがあります これを 避 けるためにカプセル 化 によってフィールド を 隠 蔽 します 68

69 フィールドのカプセル 化 フィールドのカプセル 化 は 次 のように 行 います 1. フィールドを private で 定 義 する 2. フィールドの 値 を 参 照 または 変 更 するメソッドを public で 定 義 する 3. 呼 び 出 し 側 では 常 に 2 のメソッドによりフィールドの 値 を 参 照 または 変 更 する 2 のメソッドは 慣 習 的 に get+フィールド 名 set+フィールド 名 という 名 前 にします このようなメソッドをアクセサメソッドといいます Super クラスを 次 のように 変 更 します 01: class Super { 02: private int number = 0; // numeber フィールド(インスタンス 変 数 ) 03: 04: // number フィールドの 値 を 参 照 する 05: public int getnumber() { 06: return number; 07: } 08: 09: // number フィールドの 値 を 変 更 する 10: public void setnumber(int newnumber) { 11: number = newnumber; 12: } 13: 14: // クラス 名 と 指 定 された 文 字 列 を 表 示 する 15: public int message(string str) { 16: System.out.println(getClass().getName() + " : " + str); 17: return getnumber(); 18: } 19: } AppSample クラスを 次 のように 変 更 します 01: class AppSample { 02: public static void main(string[] args) { 03: Super obj = new Super(); // Super クラスのオブジェクトを 生 成 する 04: 05: obj.setnumber(100); // number フィールドを 設 定 する 06: int ret = obj.message("c08"); // message メソッドを 呼 び 出 す 07: System.out.println("AppSample : " + ret); 08: } 09: } 実 行 結 果 は 次 のとおりです 69

70 Super : C08 AppSample : 100 フィールドをカプセル 化 すると 仮 に Super クラスで number フィールドを String クラ ス 型 に 変 更 しても getname メソッドと setname メソッドの 仕 様 が 変 わらない 限 り AppSample クラスを 変 更 する 必 要 はありません コンストラクタ コンストラクタは クラスのオブジェクトが 生 成 されるときに 呼 び 出 される 特 別 な 形 式 のメソッドです 次 のように 定 義 します [アクセス 修 飾 子 ] クラス 名 ([ 引 数 リスト]) { // クラスの 利 用 に 必 要 な 初 期 化 処 理 など } コンストラクタは 戻 り 値 を 返 しませんが 引 数 を 受 け 取 ることができます 引 数 を 受 け 取 らないコンストラクタをデフォルトコンストラクタといいます コンストラクタにはオブジェクトを 利 用 するために 必 要 な 処 理 を 記 述 します そのよう な 処 理 が 不 要 であれば コンストラクタを 定 義 しなくてもかまいません コンストラクタ が 定 義 されていない 場 合 コンパイル 時 にデフォルトコンストラクタが 自 動 的 に 生 成 され ます コンストラクタの 例 Super クラスにコンストラクタを 実 装 してみましょう その 前 に 次 のフィールドとメソ ッドを 追 加 します name フィールド:String クラス 型 で オブジェクトのクラス 名 を 格 納 する getname メソッド:name フィールドの 値 を 返 す setname メソッド:name フィールドの 値 を 設 定 する 続 いて number フィールドと name フィールドの 初 期 値 を 受 け 取 って 設 定 するコンスト ラクタを 追 加 します 01: // コンストラクタ 02: public Super(int newnumber, String newname) { 03: setnumber(newnumber); 04: setname(newname); 05: } Super クラスは 次 のようになります 70

71 01: class Super { 02: private int number = 0; // numeber フィールド(インスタンス 変 数 ) 03: private String name = null; // name フィールド クラス 名 を 設 定 04: 05: // コンストラクタ 06: public Super(int newnumber, String newname) { 07: setnumber(newnumber); 08: setname(newname); 09: } 10: 11: // number フィールドの 値 を 参 照 する 12: public int getnumber() { 13: return number; 14: } 15: 16: // number フィールドの 値 を 変 更 する 17: public void setnumber(int newnumber) { 18: number = newnumber; 19: } 20: 21: // name フィールドの 値 を 参 照 する 22: public String getname() { 23: return name; 24: } 25: 26: // name フィールドの 値 を 変 更 する 27: public void setname(string newname) { 28: name = newname; 29: } 30: 31: // クラス 名 と 指 定 された 文 字 列 を 表 示 する 32: public int message(string str) { 33: System.out.println(getName() + " : " + str); 34: return getnumber(); 35: } 36: } AppSample クラスは 新 しく 追 加 したコンストラクタを 呼 び 出 すように 次 のように 変 更 します 01: class AppSample { 02: public static void main(string[] args) { 03: Super obj = new Super(100, "Super.Class"); 04: // Super クラスのオブジェクトを 生 成 する 05: 06: int ret = obj.message("c08"); // message メソッドを 呼 び 出 す 07: System.out.println("AppSample : " + ret); 08: } 09: } 実 行 結 果 は 次 のとおりです 71

72 Super.Class : C08 AppSample : 100 コンストラクタに 指 定 した 値 が 各 フィールドに 設 定 されていることがわかります コンストラクタのオーバーロード クラスには 複 数 のコンストラクタを 定 義 できます ただし 引 数 のデータ 型 や 数 は 違 う ものでなければなりません このように 複 数 のコンストラクタを 追 加 することをコンスト ラクタのオーバーロードといいます では Super クラスにデフォルトコンストラクタを 追 加 してみましょう デフォルトコ ンストラクタでは number フィールドと name フィールドに 初 期 値 としてそれぞれ 1 と Super が 設 定 されるようにします デフォルトコンストラクタの 定 義 は 次 のとおりです 01: // デフォルトコンストラクタ 02: public Super() { 03: this(1, "Super"); 04: } デフォルトコンストラクタでは this(1, "Super"); という 処 理 を 実 行 しています この 場 合 this はもう 1 つのコンストラクタを 表 しており Super(1, "Super"); が 実 行 されま す コンストラクタをオーバーロードする 場 合 は this を 使 って 他 のコンストラクタを 呼 び 出 すことが 可 能 です this による 呼 び 出 しはコンストラクタの 最 初 で 行 ってください 最 終 的 に Super クラスは 次 のようになります 01: class Super { 02: private int number = 0; // numeber フィールド(インスタンス 変 数 ) 03: private String name = null; // name フィールド クラス 名 を 設 定 04: 05: // デフォルトコンストラクタ 06: public Super() { 07: this(1, "Super"); 08: } 09: 10: // コンストラクタ 11: public Super(int newnumber, String newname) { 12: setnumber(newnumber); 13: setname(newname); 14: } 15: 16: // number フィールドの 値 を 参 照 する 17: public int getnumber() { 18: return number; 19: } 20: 72

73 21: // number フィールドの 値 を 変 更 する 22: public void setnumber(int newnumber) { 23: number = newnumber; 24: } 25: 26: // name フィールドの 値 を 参 照 する 27: public String getname() { 28: return name; 29: } 30: 31: // name フィールドの 値 を 変 更 する 32: public void setname(string newname) { 33: name = newname; 34: } 35: 36: // クラス 名 と 指 定 された 文 字 列 を 表 示 する 37: public int message(string str) { 38: System.out.println(getName() + " : " + str); 39: return getnumber(); 40: } 41: } AppSample クラスを 次 のように 変 更 して デフォルトコンストラクタで Super クラスの オブジェクトを 生 成 するようにします 01: class AppSample { 02: public static void main(string[] args) { 03: Super obj = new Super(); // Super クラスのオブジェクトを 生 成 する 04: 05: int ret = obj.message("c08"); // message メソッドを 呼 び 出 す 06: System.out.println("AppSample : " + ret); 07: } 08: } 実 行 結 果 は 次 のとおりです Super : C08 AppSample : 1 デフォルトコンストラクタにより 初 期 値 が 設 定 されていることがわかります 演 習 問 題 int 型 のフィールドと String クラス 型 のフィールド および 各 フィールドへのアクセサメソッドを 持 つ クラスを 作 成 しなさい また デフォルトコンストラクタとフィールドの 初 期 値 を 受 け 取 るコンストラク タを 定 義 しなさい 作 成 したクラスを 利 用 するプログラムを 作 成 しなさい また フィールドのデータ 型 を 変 更 しても 利 用 側 に 影 響 がないことを 確 認 しなさい 73

74 Chapter 09 クラス~その 2 [シラバス No. 03 No.04] 目 的 継 承 によるクラスの 作 成 方 法 を 理 解 する メソッドのオーバーライドとオーバーロードを 理 解 する static メソッドと static フィールドを 理 解 する 継 承 による 新 しいクラスの 作 成 継 承 とは 既 存 のクラスを 再 利 用 して 新 しいクラスを 作 成 することです 再 利 用 する 既 存 のクラスをスーパークラス(または 基 底 クラス) 新 しく 作 成 するクラスをサブクラス(ま たは 拡 張 クラス)といいます サブクラスでは スーパークラスの 機 能 を 引 き 継 ぐほか 引 き 継 いだ 機 能 を 上 書 きしたり 新 しい 機 能 を 上 書 きしたりすることができます 継 承 によりクラスを 定 義 する 場 合 は 次 のように 記 述 します [クラス 修 飾 子 ] class サブクラス 名 extends スーパークラス 名 { // メソッドやフィールドの 定 義 } では Chapter 08 で 作 成 した Super クラスを 継 承 する Sub クラスを 作 成 してみましょう 01: class Sub extends Super { 02: //... 03: } これで Super クラスの 機 能 を 引 き 継 いだ Sub クラスを 作 成 できました AppSample クラスで Super クラスの 代 わりに Sub クラスのオブジェクトを 作 成 して 利 用 してみます 01: class AppSample { 02: public static void main(string[] args) { 03: Sub obj = new Sub(); // Sub クラスのオブジェクトを 生 成 する 04: 05: int ret = obj.message("c09"); // message メソッドを 呼 び 出 す 06: System.out.println("AppSample : " + ret); 07: } 08: } 実 行 結 果 は 次 のとおりです Super : C09 74

75 AppSample : 1 Sub クラスには 何 も 定 義 していませんが Super クラスの 機 能 を 引 き 継 いでいるため Super クラスのメソッドやフィールドを 利 用 できます コンストラクタは 引 き 継 ぎません ただし スーパークラスでデフォルトコンストラク タを 定 義 しており サブクラスでコンストラクタを 記 述 していない 場 合 スーパークラス のデフォルトコンストラクタが 呼 び 出 されます この 例 でも Super クラスにデフォルト コンストラクタが 定 義 されているため Sub クラスのオブジェクトを 生 成 するときに Super クラスのコンストラクタが 呼 び 出 されます メソッドのオーバーライドとオーバーロード では Sub クラスを 定 義 しながら 継 承 の 概 念 をより 深 く 理 解 しましょう 具 体 的 には Sub クラスに 次 の 機 能 を 追 加 します デフォルトコンストラクタが 呼 び 出 されたときに number フィールドと name フィールドに 初 期 値 と してそれぞれ 10 と Sub を 設 定 する message メソッドを 変 更 して 1 行 目 にクラス 名 と 文 字 列 2 行 目 にクラス 名 と number フィールド の 値 を 表 示 する 文 字 列 を 2 つ 受 け 取 り 1 行 目 にクラス 名 と 1 つ 目 の 文 字 列 2 行 目 にクラス 名 と number フィ ールドの 値 3 行 目 に 2 つ 目 の 文 字 列 を 表 示 する message メソッドを 追 加 する スーパークラスのコンストラクタの 呼 び 出 し オブジェクトが 生 成 されたときに Sub クラス 独 自 の 初 期 値 が 設 定 されるようにするには デフォルトコンストラクタを 追 加 します Sub クラスのコードは 次 のようになります 01: class Sub extends Super { 02: // デフォルトコンストラクタ 03: public Sub() { 04: super(10, "Sub"); // Super クラスのコンストラクタを 呼 び 出 す 05: } 06: } 4 行 目 の super(10, "Sub"); は Super クラスのコンストラクタを 呼 び 出 しています Super クラスは 各 フィールドに 設 定 する 値 を 引 数 として 受 け 取 るコンストラクタを 定 義 しています そのため Sub クラスで 改 めて 同 じコンストラクタを 定 義 しなくても Super クラスのコンストラクタを 利 用 すれば 済 みます 同 じクラスの 他 のコンストラクタ this(...) で 呼 び 出 しますが スーパークラスのコンストラクタは super(...)で 呼 び 出 します this(...) の 場 合 と 同 様 に super(...)の 呼 び 出 しもコンストラクタの 先 頭 で 実 行 する 必 要 があります AppSample の 実 行 結 果 は 次 のように 変 わります 75

76 Sub : C09 AppSample : 10 デフォルトコンストラクタが 呼 び 出 され Sub クラスの 初 期 値 が 設 定 されていることが わかります メソッドのオーバーライド 続 いて message メソッドを 定 義 します 次 のように Super クラスと 同 じ message メソ ッドを 記 述 すると Super クラスの message メソッドの 機 能 が 上 書 きされます 01: // クラス 名 と 指 定 された 文 字 列 を 表 示 する 02: public int message(string str) { 03: return getnumber(); 04: } この 状 態 で AppSample を 実 行 すると 次 のような 結 果 になります AppSample : 10 Sub クラスの message メソッドでは number フィールドの 値 を 戻 り 値 として 返 してい るだけで 表 示 処 理 は 行 われません では 1 行 目 にクラス 名 と 文 字 列 を 表 示 する と 2 行 目 にクラス 名 と number フィー ルドの 値 を 表 示 する という 2 つの 機 能 を 追 加 します まず 1 行 目 にクラス 名 と 文 字 列 を 表 示 する は Super クラスの message メソッドの 機 能 と 同 じです そのため 次 のように 記 述 して Super クラスの message メソッドを 呼 び 出 します super.message(str); この 場 合 super はスーパークラスのオブジェクトを 表 します そのため 次 の 形 式 でス ーパークラスのメソッドやフィールドを 利 用 できます super.メソッド 名 ([ 引 数 リスト]) super.フィールド 名 さらに 2 行 目 にクラス 名 と number フィールドの 値 を 表 示 する という 処 理 を 追 加 す ると Sub クラスのコードは 次 のようになります 01: class Sub extends Super { 76

77 02: // デフォルトコンストラクタ 03: public Sub() { 04: super(10, "Sub"); // Super クラスのコンストラクタを 呼 び 出 す 05: } 06: 07: // 1 行 目 :クラス 名 と 指 定 された 文 字 列 08: // 2 行 目 :クラス 名 と number フィールドの 値 09: public int message(string str) { 10: super.message(str); // Super クラスの message メソッドを 呼 び 出 す 11: System.out.println(getName() + " : " + getnumber()); // 2 行 目 12: return getnumber(); 13: } 14: } この 状 態 で AppSample を 実 行 すると 次 のような 結 果 になります Sub : C09 Sub : 10 AppSample : 10 このようにスーパークラスのメソッドを 上 書 きして 機 能 を 変 更 することを メソッドの オーバーライドといいます メソッドのオーバーロード メソッドもコンストラクタと 同 様 にオーバーロードが 可 能 です メソッド 名 引 数 の 数 引 数 のデータ 型 をまとめてメソッドのシグネチャといいます Java では 1 つのクラスにシ グネチャの 異 なるメソッドを 複 数 追 加 できます オーバーロードによって Sub クラスに 新 しい message メソッドを 追 加 します 新 しいメ ソッドは 文 字 列 を 2 つ 受 け 取 るので シグネチャは 次 のようになります 戻 り 値 に 関 して は 記 述 がないので 戻 り 値 のデータ 型 は 既 存 の message メソッドと 同 じものにします public int message(string str1, String str2) {... 新 しい message メソッドに 記 述 する 3 つの 機 能 のうち 1 行 目 にクラス 名 と 文 字 列 を 表 示 する と 2 行 目 にクラス 名 と number フィールドの 値 を 表 示 する は Sub クラスでオ ーバーライドした 既 存 の message メソッドと 同 じです したがって 次 のように 記 述 して Sub クラスの 既 存 の message メソッドを 呼 び 出 します this.message(str1); この 場 合 this は 自 オブジェクトを 表 します そのため 次 の 形 式 で 同 じオブジェクト のメソッドやフィールドを 利 用 できます 77

78 this.メソッド 名 ([ 引 数 リスト]) this.フィールド 名 さらに 3 行 目 に 2 つ 目 の 文 字 列 を 表 示 する という 処 理 を 追 加 すると Sub クラスの コードは 次 のようになります 01: class Sub extends Super { 02: // デフォルトコンストラクタ 03: public Sub() { 04: super(10, "Sub"); // Super クラスのコンストラクタを 呼 び 出 す 05: } 06: 07: // 1 行 目 :クラス 名 と 指 定 された 文 字 列 08: // 2 行 目 :クラス 名 と number フィールドの 値 09: public int message(string str) { 10: super.message(str); // Super クラスの message メソッドを 呼 び 出 す 11: System.out.println(getName() + " : " + getnumber()); // 2 行 目 12: return getnumber(); 13: } 14: 15: // 1 行 目 :クラス 名 と 1 つ 目 の 文 字 列 16: // 2 行 目 :クラス 名 と number フィールドの 値 17: // 3 行 目 :2 つ 目 の 文 字 列 18: public int message(string str1, String str2) { 19: this.message(str1); // Sub クラスの message メソッドを 呼 び 出 す 20: System.out.println(str2); // 3 行 目 21: return getnumber(); 22: } 23: } AppSample クラスを 変 更 して 新 しい message メソッドを 呼 び 出 すようにします 01: class AppSample { 02: public static void main(string[] args) { 03: Sub obj = new Sub(); // Sub クラスのオブジェクトを 生 成 する 04: 05: int ret = obj.message("c09", "3 行 目 の 文 字 列 "); 06: // message メソッドを 呼 び 出 す 07: System.out.println("AppSample : " + ret); 08: } 09: } 実 行 結 果 は 次 のとおりです Sub : C09 78

79 Sub : 10 3 行 目 の 文 字 列 AppSample : static メソッドと static フィールド インスタンスメソッドとインスタンスフィールド これまで 説 明 してきたメソッドやフィールドは クラスから 生 成 したオブジェクトを 介 して 利 用 してきました たとえば 次 のように Super クラスのオブジェクトを 生 成 したと します Super obj1 = new Super(); Super obj2 = new Super(100, "SuperSuper"); obj1 と obj2 に 対 して 次 のように message メソッドを 呼 び 出 します obj1.message("c09"); obj2.message("c09"); 指 定 した 引 数 は 同 じでも 結 果 は 次 のように 異 なります Super : C09 SuperSuper : C09 obj1 と obj2 は フィールドに 異 なる 値 が 設 定 されているため メソッドの 結 果 も 異 なる ものになります このようにオブジェクトを 介 して 利 用 するメソッドをインスタンスメソ ッド フィールドをインスタンスフィールド(またはインスタンス 変 数 )といいます static メソッドと static フィールド メソッドやフィールドには static 修 飾 子 を 指 定 できます static を 指 定 すると クラス に 1 つだけ 存 在 するクラスメソッド(または static メソッド)およびクラスフィールド(ま たはクラス 変 数 static フィールド)になります クラスメソッドやクラスフィールドは 次 のように 利 用 します クラス 名.フィールド 名 クラス 名.メソッド 名 ([ 引 数 リスト]) static メソッドは 次 のような 場 合 に 定 義 します オブジェクトの 値 に 依 存 せず クラス 内 で 共 通 して 使 用 できる 処 理 を 行 う 場 合 static フィールドを 隠 蔽 するためのアクセサメソッドとして 定 義 する 場 合 79

80 たとえば java.lang.math クラスでは 基 本 的 な 数 値 処 理 を static メソッドとして 定 義 しています 数 値 処 理 はすべてのオブジェクトに 共 通 する 処 理 で オブジェクトの 値 によ って 変 わることはないからです Math クラスの max メソッドは 2 つの 引 数 のうち 大 きいほうの 値 を 返 します Math.max(15, 86); static フィールドは 多 くの 場 合 さらに final を 指 定 して クラス 内 で 共 通 して 利 用 す る 定 数 として 定 義 します たとえば Math クラスには 円 周 率 を 表 す 次 の static フィールドが 定 義 されています public static final double PI static メソッドと static フィールドを 利 用 するサンプルプログラムを 作 ってみましょう 01: class StaticSample { 02: public static void main(string[] args) { 03: // Math クラスの static メソッド 04: System.out.println("Math.max(15, 86): " + Math.max(15, 86)); 05: // Math クラスの static フィールド 06: System.out.println("Math.PI: " + Math.PI); 07: } 08: } 実 行 結 果 は 次 のとおりです Math.max(15, 86): 86 Math.PI: メモ final は これ 以 上 変 更 できない ことを 示 すキーワードです フィールドの 定 義 に final を 指 定 する と 定 数 になります メソッドの 定 義 に final を 指 定 すると そのメソッドはオーバーライドできません クラスの 定 義 に final を 指 定 すると そのクラスを 継 承 してサブクラスを 作 成 できなくなります 演 習 問 題 Sub クラスを 継 承 するクラスを 作 成 し boolean 型 のフィールドとアクセサメソッド コンストラクタを 追 加 しなさい java.lang.math クラスの static メソッドを 使 って さまざまな 計 算 を 行 うプログラムを 作 成 しなさい 80

81 Chapter 10 クラス~その 3 [シラバス No. 03 No.04] 目 的 抽 象 クラスとインタフェースを 理 解 する 内 部 クラスと 匿 名 クラスを 理 解 する クラス 型 の 変 数 の 代 入 と 多 相 性 のしくみを 理 解 する 抽 象 クラス 抽 象 メソッドと 抽 象 クラス メソッドの 定 義 にメソッド 修 飾 子 として abstract を 指 定 すると 抽 象 メソッドになりま す 抽 象 メソッドは そのメソッドでどのような 機 能 を 提 供 するかだけを 定 義 するメソッ ドで 実 行 するコードを 記 述 しません [public] abstract 戻 り 値 のデータ 型 メソッド 名 ( 引 数 リスト); 抽 象 メソッドを 含 むクラスは 必 ず 抽 象 クラスとして 定 義 する 必 要 があります 01: abstract class AbstractSuper { 02: private String configuration = null; 03: public abstract String getconfiguration(); 04: public abstract void setconfiguration(); 05: } 抽 象 クラスは 処 理 のコードを 持 たない 抽 象 メソッドを 含 むため オブジェクトを 生 成 できません AbstractSuper obj = new AbstractSuper(); // コンパイルエラー この 文 はコンパイルで 次 のようなエラーになります AppSample.java:3: AbstractSuper は abstract です インスタンスを 生 成 することは できません AbstractSuper obj = new AbstractSuper(); 抽 象 クラスは 実 行 する 機 能 は 決 まっていても その 機 能 をどのように 実 行 するか 決 ま っていない 場 合 に 利 用 します たとえば Java API の java.awt.graphics クラスは 図 形 の 描 画 などのグラフィックス 処 理 を 行 うためのクラスですが 実 際 にグラフィックス 処 理 を どう 行 うかは Windows などのプラットフォームによって 異 なります そのため Graphics 81

82 クラスでは 図 形 の 描 画 処 理 などを 抽 象 メソッドとして 定 義 し どのような 機 能 を 提 供 する かだけを 示 しています 抽 象 クラスの 継 承 抽 象 クラスを 利 用 するには 抽 象 クラスを 継 承 するサブクラスを 作 成 し 抽 象 メソッド をオーバーライドして 処 理 のコードを 記 述 します 抽 象 クラスを 継 承 するサブクラスで 抽 象 メソッドをオーラ ライドしない 場 合 そのサブクラスも 抽 象 クラスとして 定 義 しなけ ればなりません 01: class AbstractSub extends AbstractSuper { 02: // configuration フィールドを 返 す 03: public String getconfiguration() { 04: return configuration; 05: } 06: 07: // configuration フィールドを 設 定 する 08: public void setconfiguration(string config) { 09: configuration = config; 10: } 11: } 12: AppSample クラスを 次 のように 修 正 して AbstractSuper クラスを 利 用 してみましょう 01: class AppSample { 02: public static void main(string[] args) { 03: AbstractSuper obj = new AbstractSub(); 04: // AbstractSub クラスのオブジェクトの 生 成 05: 06: obj.setconfiguration("c10 Configuration"); 07: System.out.println("AppSample : " + obj.getconfiguration()); 08: } 09: } 実 行 結 果 は 次 のとおりです AppSample : C10 Configuration 抽 象 クラスは オブジェクトを 生 成 できませんが クラス 型 変 数 を 宣 言 し そこに 抽 象 クラスのサブクラスから 生 成 したオブジェクトの 参 照 を 代 入 することができます AppSample クラスで 宣 言 した 変 数 obj は AbstractSupler クラス 型 ですが 実 際 は AbstractSub クラスのオブジェクトを 参 照 するため AbstractSub クラスで 定 義 されたメ ソッドのコードが 実 行 されます 前 述 の Graphics クラスで 定 義 された 抽 象 メソッドの 処 理 は プラットフォームごとに 提 82

83 供 されるサブクラスで 定 義 されます ただし どのようなサブクラスがありどのように 処 理 が 定 義 されているかは 利 用 者 側 で 意 識 する 必 要 がありません Graphics クラスの paint メソッドに 引 数 として 渡 される Graphics クラス 型 の 変 数 を 利 用 すれば サブクラスを 意 識 せずに Graphics クラスのメソッドを 利 用 できます これは 多 相 性 によって 実 現 する 機 能 で す インタフェース 多 重 継 承 とインタフェース オブジェクト 指 向 には 多 重 継 承 という 概 念 があります これは 複 数 のスーパークラ スを 継 承 してサブクラスを 定 義 する 機 能 です C++では 多 重 継 承 をサポートしていますが Java ではサポートしていません 多 重 継 承 を 許 可 すると 継 承 関 係 がわかりにくく 複 雑 にな る 可 能 性 があるため プログラムを 作 りやすいに 多 重 継 承 が 禁 止 されています extends に 続 いて 複 数 のクラスを 記 述 すると コンパイルエラーになります class Sub extends Super, AbstractSuper { Java では 多 重 継 承 の 代 わりに インタフェースを 利 用 できます インタフェースは 次 の ように 定 義 します [アクセス 修 飾 子 ] interface インタフェース 名 { // 定 数 public static final フィールド 名 = 初 期 値 ; // 抽 象 メソッド [public] 戻 り 値 のデータ 型 メソッド 名 ( 引 数 リスト); } インタフェースには 定 数 と 抽 象 メソッドを 定 義 します 抽 象 メソッドには abstract の 指 定 が 不 要 であることに 注 意 してください 次 にインタフェースの 例 を 示 します 01: interface InterfaceSuper { 02: // 定 数 03: public static final int MY_MAX_VALUE = 100; 04: // 抽 象 メソッド 05: public String getaddress(); 06: public void setaddress(string addr); 07: } インタフェースの 実 装 インタフェースはクラスを 定 義 する 際 に 利 用 します extends とは 異 なり implements の 後 には 複 数 のインタフェースを 指 定 可 能 です このようにインタフェースを 指 定 してク 83

84 ラスを 定 義 することを クラスにインタフェースを 実 装 する といいます [クラス 修 飾 子 ] class クラス 名 [extends スーパークラス 名 ] implements インタフェース 名 1[, ]{ // フィールドやメソッドの 定 義 } インタフェースを 実 装 したクラスでは インタフェースで 定 義 されたメソッドをオーバ ーライドしてコードを 記 述 する 必 要 があります オーバーライドしないと コンパイルで エラーになります 01: class SubSub extends Sub implements InterfaceSuper { 02: private String address = null; 03: 04: // デフォルトコンストラクタ 05: public SubSub() { 06: setnumber(100); 07: setname("subsub"); 08: } 09: 10: // address フィールドを 返 す 11: public String getaddress() { 12: return address; 13: } 14: 15: // address フィールドを 設 定 する 16: public void setaddress(string addr) { 17: address = addr; 18: } 19: } では AppSample クラスを 修 正 して SubSubSub クラスを 利 用 してみましょう 01: class AppSample { 02: public static void main(string[] args) { 03: InterfaceSuper obj = new SubSubSub(); 04: // SubSubSub クラスのオブジェクトの 生 成 05: 06: obj.setaddress("c10 Address"); 07: System.out.println("AppSample : " + obj.getaddress()); 08: } 09: } 実 行 結 果 は 次 のとおりです AppSample : C10 Address インタフェースは 抽 象 クラスと 同 様 にオブジェクトを 生 成 できません ただし インタ 84

85 フェース 型 変 数 を 宣 言 し そこにインタフェースを 実 装 したクラスから 生 成 したオブジェ クトの 参 照 を 代 入 できます AppSample クラスでは InterfaceSuper インタフェース 型 変 数 obj を 宣 言 し SubSub クラスのオブジェクトの 参 照 を 代 入 しています メモ 既 存 のインタフェースを 継 承 して 新 しいインタフェースを 定 義 することもできます クラスと 同 様 に extends の 後 に 指 定 できるインタフェースは 1 つだけです public interface InterfaceSub extends InterfaceSuper {... } ネストしたクラス ネストした static クラスと 内 部 クラス Java では クラスの 定 義 内 に 別 のクラスを 定 義 できます [クラス 修 飾 子 ] class クラス 名 { [アクセス 修 飾 子 ] static ネストクラス 名 { // メソッドやフィールドの 定 義 } [アクセス 修 飾 子 ] 内 部 クラス 名 { // メソッドやフィールドの 定 義 } } static を 指 定 するとネストした static クラス 指 定 しないと 内 部 クラスになります クラ ス 内 ではネストクラス 名 と 内 部 クラス 名 で 参 照 します クラスの 外 からは クラス 名.ネス トクラス 名 クラス 名. 内 部 クラス 名 という 形 式 で 参 照 します ただし アクセス 修 飾 子 に private を 指 定 するとクラス 内 でのみ 利 用 できるクラスになります 01: class Outer { 02: // ネストした static クラス 03: static class StaticInner { 04: public void output(string s) { 05: System.out.println("StaticInner: " + s); 06: } 07: } 08: 09: // 内 部 クラス 10: class Inner { 11: public void output(string s) { 12: System.out.println("Inner: " + s); 13: } 14: } 15: 85

86 16: // Outer クラスのメソッド 17: public void output() { 18: // Outer クラス 内 ではクラス 名 で 参 照 19: new StaticInner().output("Outer.StaticInner"); 20: new Inner().output("Outer.Inner"); 21: } 22: } 定 義 されたクラス 内 であれば ネストした static クラスと 内 部 クラスの 利 用 方 法 に 特 に 差 はありません 利 用 する 場 合 には どちらもオブジェクトを 生 成 してメソッドを 呼 び 出 します(クラス 型 変 数 を 利 用 せずに コンストラクタが 返 すオブジェクトに 対 してメソッ ドを 呼 び 出 しています) では クラスの 外 からの 利 用 方 法 を 見 てみましょう 01: class AppSample { 02: public static void main(string[] args) { 03: Outer.StaticInner obj1 = new Outer.StaticInner(); 04: // Outer.StaticInner クラスのオブジェクトの 生 成 05: Outer.Inner obj2 = new Outer().new Inner(); 06: // Outer.Inner クラスのオブジェクトの 生 成 07: 08: obj1.output("c10 ネストしたクラス"); // Outer.StaticInner クラ ス 09: obj2.output("c10 内 部 クラス"); // Outer.Inner クラス 10: } 11: } 外 部 から 参 照 する 場 合 にはそれぞれ Outer.StaticInner Outer.Inner として 参 照 します しかし オブジェクトの 生 成 方 法 が 異 なることに 注 意 してください Outer.StaticInner クラスは static クラスです static メソッドや static フィールドと 同 様 に クラスに 1 つしか 存 在 しません そのため クラス 名. を 付 加 して 参 照 できます 一 方 OuterInner クラスは static が 指 定 されていません したがって インスタンスメ ソッドやインスタンス 変 数 と 同 様 に 利 用 する 際 には Outer クラスのオブジェクトが 必 要 です そのため new Outer()で 生 成 した Outer クラスのオブジェクトを 介 してのみアクセ スが 可 能 です 実 行 結 果 は 次 のとおりです StaticInner: C10 ネストしたクラス Inner: C10 内 部 クラス 匿 名 の 内 部 クラス Java では 既 存 のクラスの 継 承 やインタフェースの 実 装 により 新 しいクラスを 定 義 でき ますが 用 途 がその 場 限 りの 場 合 もあります このような 場 合 には クラス 名 を 指 定 して 86

87 定 義 するのではなく 名 前 のないクラスを 内 部 クラスとして 定 義 し 利 用 できます 匿 名 の 内 部 クラスを 利 用 する 場 合 は クラス 内 の 特 定 の 場 所 に 次 のように 記 述 します new クラス 名 () { // クラスのメソッドの 定 義 } new インタフェース 名 () { // インタフェースのメソッドの 定 義 } extends や implements を 使 わないことに 注 意 してください では インタフェースを 実 装 する 匿 名 の 内 部 クラスの 例 を 見 てみましょう 01: class AnonymousInterfaceSample { 02: public static void main(string[] args) { 03: // 匿 名 の 内 部 クラスを 定 義 してそのオブジェクトを 代 入 04: InterfaceSuper obj = new InterfaceSuper() { 05: // InterfaceSuper インタフェースのメソッドを 記 述 06: public String getaddress(){ 07: return " 匿 名 の 内 部 クラス"; 08: } 09: public void setaddress(string addr) { 10: System.out.println(addr + "を 設 定 できません"); 11: } 12: }; 13: 14: // InterfaceSuper インタフェースのメソッドの 呼 び 出 し 15: obj.setaddress("address"); 16: System.out.println("AnonymousSample: " + obj.getaddress()); 17: } 18: } AnonymousInterfaceSample の 4 行 目 では InterfaceSuper インタフェース 型 の 変 数 obj を 宣 言 しています その 右 オペランドに InterfaceSuper インタフェースを 実 装 する 匿 名 の 内 部 クラスを 定 義 しています 匿 名 の 内 部 クラスの 定 義 は new InterfaceSuper()の 後 の {} から 12 行 目 の } までです その 後 に 続 く ; は 変 数 obj への 代 入 文 の 終 わりを 示 し ています 15 行 目 16 行 目 では 匿 名 の 内 部 クラスのメソッドを 呼 び 出 しています 実 行 結 果 は 次 の とおりです Address を 設 定 できません AnonymousSample: 匿 名 の 内 部 クラス 続 いて クラスを 継 承 する 匿 名 の 内 部 クラスの 例 です 87

88 01: class AnonymousClassSample { 02: // AbstractSuper クラス 型 のオブジェクトを 引 数 として 受 け 取 る 03: public void config(abstractsuper obj) { 04: obj.setconfiguration("configuration"); 05: System.out.println("Anonymous: " + obj.getconfiguration()); 06: } 07: 08: public static void main(string[] args) { 09: // 自 オブジェクトを 生 成 10: AnonymousClassSample obj = new AnonymousClassSample(); 11: // AbstractSuper クラスを 継 承 するクラスを 12: // 匿 名 の 内 部 クラスとして 定 義 し そのオブジェクトを 渡 す 13: obj.config(new AbstractSuper() { 14: // AbstractSuper クラスのメソッドのオーバーライド 15: public String getconfiguration() { 16: return configuration; 17: } 18: public void setconfiguration(string config) { 19: configuration = config; 20: } 21: }); 22: } 23: } AnonymousClassSample では AbstractSuper クラス 型 のオブジェクトを 受 け 取 る config メソッドを 定 義 しています 13 行 目 でこのメソッドを 呼 び 出 す 際 に AbstractSuper クラスを 継 承 する 匿 名 の 内 部 クラスを 定 義 しています 匿 名 の 内 部 クラスの 定 義 は new AbstractSuper()の 後 の {}から 21 行 目 の } までです その 後 に 続 く ); は config メソッドの 引 数 リストを 閉 じるかっこと 呼 び 出 し 文 の 終 わりを 示 しています 実 行 結 果 は 次 のとおりです Anonymous: Configuration 匿 名 の 内 部 クラスは 非 常 によく 使 う 機 能 です しっかりと 理 解 しましょう 10-4 クラス 型 変 数 への 代 入 と 多 相 性 クラス 型 変 数 への 代 入 これまでに 次 のクラスを 作 成 してきました Super クラス:スーパークラス Sub クラス:Super クラスのサブクラス SubSub クラス:Sub クラスのサブクラス Super クラスの 間 接 的 なサブクラス 2 つのクラスが 継 承 の 関 係 にあれば スーパークラス 型 の 変 数 にサブクラス 型 のオブジェ 88

89 クトの 参 照 を 代 入 できます Super obj1 = new Sub(); Super obj2 = new SubSub(); Sub obj3 = new SubSub(); 逆 に サブクラス 型 の 変 数 にスーパークラス 型 のオブジェクトの 参 照 を 代 入 することは できません Sub obj4 = new Super(); SubSub obj5 = new Super(); SubSub obj6 = new Sub(); これらの 文 はコンパイルでエラーになります ClassAssignSample.java:8: 互 換 性 のない 型 検 出 値 : Super 期 待 値 : Sub Sub obj4 = new Super(); ^ ClassAssignSample.java:9: 互 換 性 のない 型 検 出 値 : Super 期 待 値 : SubSub SubSub obj5 = new Super(); ^ ClassAssignSample.java:10: 互 換 性 のない 型 検 出 値 : Sub 期 待 値 : SubSub SubSub obj6 = new Sub(); Sub obj4 = (Sub)new Super(); SubSub obj5 = (SubSub)new Super(); SubSub obj6 = (SubSub)new Sub(); プリミティブ 型 同 士 の 代 入 のようにキャストを 使 うと コンパイルエラーは 出 なくなり ます Sub obj4 = (Sub)new Super(); SubSub obj5 = (SubSub)new Super(); SubSub obj6 = (SubSub)new Sub(); しかし 実 行 時 に ClassCastException の 例 外 が 発 生 します Exception in thread "main" java.lang.classcastexception: Super cannot be cast to Sub at ClassAssignSample.main(ClassAssignSample.java:8) 89

90 サブクラスは 通 常 スーパークラスより 多 くの 機 能 を 備 えています サブクラス 型 の 変 数 にスーパークラス 型 のオブジェクトを 代 入 しても サブクラスで 追 加 したメソッドやフ ィールドにアクセスできないため 実 行 時 にエラーが 発 生 します 多 相 性 の 確 認 スーパークラス 型 変 数 には サブクラスのオブジェクトの 参 照 を 代 入 できます 次 の 文 はコンパイルも 実 行 も 問 題 なく 実 行 できます Super obj = new Super(); Super obj = new Sub(); Super obj = new SubSub(); 変 数 obj は Super クラス 型 ですが 実 際 に 参 照 しているオブジェクトは Sub クラスや SubSub クラスのものである 可 能 性 があります このとき 変 数 obj に 対 して message メ ソッドを 呼 び 出 すと 参 照 しているオブジェクトに 応 じた 処 理 が 実 行 されます これが 多 相 性 です 01: class PolymorphismSample { 02: public static void main(string[] args) { 03: Super obj = null; 04: 05: switch (args[0].charat(0)) { 06: case '1': obj = new Super(); // Super 07: break; 08: case '2': obj = new Sub(); // Sub 09: break; 10: case '3': obj = new SubSub(); // SubSub 11: break; 12: default: 13: System.out.println("1~3 を 指 定 してください"); 14: } 15: obj.message(" is created"); // message メソッドを 呼 び 出 す 16: } 17: } PolymorphismSample では コマンドライン 引 数 の 指 定 によって 1 の 場 合 は Super ク ラス 2 の 場 合 は Sub クラス 3 の 場 合 は SubSub クラスのオブジェクトを 生 成 していま す 最 後 に message メソッドを 呼 び 出 すと 生 成 されたオブジェクトに 応 じた 処 理 が 実 行 されます >java PolymorphismSample 1 Super : is created >java PolymorphismSample 2 90

91 Sub : is created Sub : 10 >java PolymorphismSample 3 SubSub : is created SubSub : 100 演 習 問 題 InterfaceSuper インタフェースを 継 承 する InterfaceSub インタフェースを 作 成 し 名 前 と 年 齢 を 取 得 設 定 するメソッドを 定 義 しなさい InterfaceSub インタフェースを 匿 名 の 内 部 クラスとして 実 装 し 利 用 するプログラムを 作 成 しなさ い 91

92 Chapter 11 パッケージ [シラバス No. 05] 目 的 パッケージの 概 要 と 使 い 方 を 理 解 する アクセス 修 飾 子 の 意 味 と 使 い 方 を 理 解 する パッケージの 活 用 パッケージを 使 うメリット Java では 作 成 したクラスやインタフェースをパッケージにまとめることができます パッケージを 使 うと 次 のようなメリットを 得 られます 関 連 機 能 をパッケージにまとめてライブラリとして 公 開 できる パッケージごとに 名 前 空 間 が 形 成 されるため パッケージが 異 なるクラスやインタフェースは 同 じ 名 前 でも 別 のものとして 認 識 される パッケージにまとめることによりクラスやインタフェースへの 外 部 からのアクセスを 制 御 できる パッケージの 宣 言 クラスをパッケージに 入 れるには クラスを 定 義 するソースコードファイルの 先 頭 で package 文 によりパッケージを 宣 言 します package パッケージ 名 ; パッケージ 名 は com.example のように パッケージ 名. サブパッケージ 名. と いう 形 式 で 指 定 します 01: package com.example; 02: 03: public class Package { 04: public void message(string s) { 05: System.out.println("Package: " + s); 06: } 07: } Package クラスは com.example パッケージに 入 ります パッケージを 宣 言 した 場 合 そのクラスのクラスファイルはパッケージと 同 じ 構 造 のフ ォルダに 格 納 する 必 要 があります Package クラスの 場 合 は com example フォルダです コンパイル 時 に javac コマンドに-d オプションを 指 定 すると 指 定 されたフォルダを 基 準 としてパッケージに 対 応 するフォルダを 探 してそこにクラスファイルを 格 納 してくれます 92

93 対 応 するフォルダがない 場 合 には 自 動 的 に 適 切 なフォルダが 生 成 されます javac -d. Package.java -d に.(ピリオド)を 指 定 すると 現 在 のフォルダが 基 準 になります パッケージのクラスの 利 用 パッケージのクラスは 同 じパッケージのクラスからはクラス 名 だけで 参 照 できます 異 なるパッケージのクラスでは パッケージ 名.クラス 名 という 完 全 修 飾 クラス 名 で 参 照 する 必 要 があります Package クラスの 場 合 com.example.package です 01: class PackageSample { 02: public static void main(string[] args) { 03: com.example.package obj = new com.example.package(); 04: obj.message("packagesample"); 05: } 06: } 実 行 結 果 は 次 のとおりです Package: PackageSample PackageSample クラスではパッケージを 宣 言 していません パッケージを 宣 言 していな いクラスは 無 名 パッケージに 入 っているものとみなされます 無 名 パッケージのクラス をコンパイルすると クラスファイルは 現 在 のフォルダに 格 納 されます なお PackageSample を 実 行 する 際 に Package クラスのクラスファイルが 正 しいフォ ルダに 格 納 されていないと クラスが 見 つからない という 意 味 の 実 行 時 エラーが 発 生 し ます Exception in thread "main" java.lang.noclassdeffounderror: com/example/package at PackageSample.main(PackageSample.java:3) Caused by: java.lang.classnotfoundexception: com.example.package at java.net.urlclassloader$1.run(unknown Source) at java.security.accesscontroller.doprivileged(native Method) at java.net.urlclassloader.findclass(unknown Source) at java.lang.classloader.loadclass(unknown Source) at sun.misc.launcher$appclassloader.loadclass(unknown Source) at java.lang.classloader.loadclass(unknown Source)... 1 more クラスのインポート プログラム 中 で 常 に 完 全 修 飾 クラス 名 を 記 述 してクラスを 利 用 すると 手 間 がかかるだ 93

94 けでなく ソースコードが 読 みにくくなります そこで import 文 でクラスをインポート すると クラス 名 だけで 利 用 できるようになります import パッケージ 名.クラス 名 ; 次 のように 記 述 すると パッケージ 内 のクラスをすべてクラス 名 だけで 利 用 できます import パッケージ 名.*; import 文 は 自 分 で 定 義 したクラスだけでなく Java API ライブラリのクラスを 利 用 す る 際 にも 必 要 です ただし java.lang パッケージは コンパイル 時 に import java.lang.*; という 文 が 自 動 的 に 追 加 されるため import 文 を 追 加 できます PackageSample に import 文 を 追 加 してみましょう 01: import com.example.package; 02: 03: class PackageSample { 04: public static void main(string[] args) { 05: Package obj = new Package(); 06: obj.message("packagesample"); 07: } 08: } 実 行 結 果 は 同 じです import static 文 たとえば Package クラスに 次 のような static メソッドがあるとします // static メソッド public static void staticmethod() { System.out.println("Package: staticmethod"); } このメソッドは import 文 で Package クラスをインポートして 次 のように 利 用 します import com.example.package; Package.staticMethod(); static メソッドや static フィールドを 含 むクラスを 利 用 する 場 合 import static 文 を 使 えばクラスの 指 定 を 省 略 できます 94

95 import static パッケージ 名.クラス 名.static メソッド 名 ; import static パッケージ 名.クラス 名.static フィールド 名 ; import static パッケージ 名.クラス 名.*; static メソッド 名 や static フィールド 名 の 代 わりに * を 指 定 すると クラス 内 の static なメソッドやフィールドをすべて クラスの 指 定 なしで 利 用 できます 01: import static com.example.package.staticmethod; 02: 03: class StaticImportSample { 04: public static void main(string[] args) { 05: staticmethod(); 06: } 07: } 実 行 結 果 は 次 のとおりです Package: staticmethod アクセス 修 飾 子 Java では クラス メソッド フィールドの 定 義 にアクセス 修 飾 子 を 指 定 して 他 のク ラスからのアクセスを 制 御 します デフォルトアクセス( 指 定 なし) クラス メソッド フィールドの 定 義 にアクセス 修 飾 子 を 指 定 しない 場 合 デフォルト アクセスが 適 用 されます デフォルトアクセスのクラス メソッド フィールドは 同 じ クラス 内 または 同 じパッケージ 内 のクラスから 利 用 できます 異 なるパッケージのクラス からは 利 用 できません public クラス メソッド フィールドの 定 義 に public を 指 定 した 場 合 どこからでも 自 由 にア クセスできます クラスは 通 常 public かデフォルトアクセスを 指 定 します private メソッドやフィールドの 定 義 に private を 指 定 した 場 合 同 じクラス 内 でのみアクセス 可 能 です クラスの 場 合 内 部 クラスにのみ 指 定 でき 内 部 クラスを 定 義 したクラス 内 での みアクセスできます private を 指 定 すると そのクラスを 継 承 するサブクラスからもアクセスできません そ のため private を 指 定 したメソッドは サブクラスでオーバーライドできません 95

96 protected メソッドやフィールドの 定 義 に protected を 指 定 した 場 合 同 じクラス 同 じパッケージ 内 のクラス そのクラスを 継 承 するサブクラス( 異 なるパッケージ)から 利 用 できます クラスの 場 合 内 部 クラスにのみ 指 定 でき 内 部 クラスを 定 義 したクラス 内 およびその クラスのサブクラスでのみアクセスできます protected は 基 本 的 には 異 なるパッケージからのアクセスを 制 限 して 保 護 したいが そ のクラスを 継 承 するサブクラスにはアクセスを 許 可 したい 場 合 に 使 用 します 演 習 問 題 com.example パッケージのクラスを 作 成 し public private protected 指 定 なしのメソッドを 定 義 して パッケージ 外 から 利 用 できるかどうかを 確 認 するプログラムを 作 成 しなさい com.example パッケージのクラスを 継 承 するサブクラスを 作 成 し サブクラスからスーパークラス のメソッドにアクセスできるかどうかを 確 認 するプログラムを 作 成 しなさい 96

97 Chapter 12 Java クラスライブラリ [シラバス No. 05] 目 的 java.lang パッケージの 概 要 を 理 解 する java.util パッケージの 概 要 を 理 解 する java.lang パッケージ Java の 基 本 機 能 を 提 供 するパッケージです コンパイル 時 に 自 動 的 にインポートが 行 わ れるため プログラムで import 文 を 書 く 必 要 はありません java.lang パッケージの 主 なクラスを 示 します Object クラス Java で 扱 うオブジェクトを 表 し すべてのクラスのスーパークラスになります 次 のよ うなメソッドを 利 用 できます Object clone() 自 オブジェクトのコピーを 作 成 して 返 します boolean equals(object obj) 自 オブジェクトと 引 数 に 指 定 されたオブジェクトが 等 しい 場 合 は true それ 以 外 は false を 返 します String tostring() 自 オブジェクトの 文 字 列 表 現 を 返 します Class<?> getclass() 自 オブジェクトのクラスを 返 します int hashcode() オブジェクトのハッシュコード 値 を 返 します Class<T>クラス オブジェクトのクラスやインタフェースの 型 を 表 します <T>はジェネリクス 型 の 型 引 数 です ジェネリクス 型 については Chapter 13 で 説 明 します Class<T>クラスは 基 本 となるクラスの 正 規 名 を 返 す getcanonicalname オブジェク 97

98 トが 表 すクラスやインタフェースの 名 前 を 返 す getname など クラスやインタフェースに 関 連 する 情 報 を 取 得 するメソッドを 数 多 く 提 供 しています System クラス プログラムが 動 作 しているシステムの 状 態 を 操 作 するための static フィールドと static メソッドを 提 供 しています System クラスでは 標 準 入 出 力 を 表 す 次 の 3 つのフィールドをよく 使 用 します 一 般 に 標 準 入 力 にはキーボード 標 準 出 力 および 標 準 エラーには 画 面 が 割 り 当 てられています static InputStream in 標 準 入 力 を 表 します static PrintStream out 標 準 出 力 を 表 します static PrintStream err 標 準 エラーを 表 します また 次 のような static メソッドを 利 用 できます static void arraycopy(object s, int si, Object d, int di, int length) 配 列 同 士 のコピーを 行 います 引 数 にはコピーする 要 素 の 位 置 と 数 を 指 定 します static long currenttimemillis() 現 在 の 時 間 をミリ 秒 で 返 します static void exit(int status) 現 在 実 行 中 の Java 仮 想 マシンを 終 了 します static void gc() ガーベージコレクションを 実 行 します static void setin(inputstream in) 標 準 入 力 を 割 り 当 て 直 します static void setout(printstream out) 98

99 標 準 出 力 を 割 り 当 て 直 します static void seterr(printstream err) 標 準 エラーを 割 り 当 て 直 します プリミティブ 型 のラッパークラス プリミティブ 型 (boolean 数 値 型 )の 値 をオブジェクトとして 扱 いたいときに 使 用 しま す ラップとは 内 包 する つまりオブジェクトの 中 に 保 持 するという 意 味 です クラス Boolean クラス Byte クラス Character クラス Double クラス Float クラス Integer クラス Long クラス Short クラス 説 明 boolean 型 の 値 をオブジェクトにラップする byte 型 の 値 をオブジェクトにラップする char 型 の 値 をオブジェクトにラップする double 型 の 値 をオブジェクトにラップする float 型 の 値 をオブジェクトにラップする int 型 の 値 をオブジェクトにラップする long 型 の 値 をオブジェクトにラップする short 型 の 値 をオブジェクトにラップする これらのラッパークラスでは よく 次 のメソッドを 使 用 します String tostring() static String tostring(xxx value) 自 オブジェクトまたは 指 定 されたプリミティブ 型 (xxx)の 値 を 文 字 列 に 変 換 します static String tostring(xxx value, int n) 指 定 された int 型 または short 型 の n 進 数 の 整 数 値 を 文 字 列 に 変 換 します static Xxx valueof(string s) 指 定 された 文 字 列 が 表 すプリミティブ 型 (xxx)の 値 を 保 持 するラッバークラス 型 (Xxx) のオブジェクトを 返 します static xxx parsexxx(string s) 指 定 された 文 字 列 が 表 すプリミティブ 型 (xxx char 型 を 除 く)の 値 を 返 します static Xxx valueof(string s, int n) 99

100 指 定 された 文 字 列 が 表 す 整 数 型 (xxx char 型 を 除 く)の n 進 数 の 値 を 保 持 するラッバ ークラス 型 (Xxx)のオブジェクトを 返 します static xxx parsexxx(string s, int n) 指 定 された 文 字 列 が 表 す 整 数 型 (xxx char 型 を 除 く)の n 進 数 の 値 を 返 します Integer クラスを 例 に 使 い 方 を 示 します 01: class WrapperSample { 02: public static void main(string[] args) { 03: int i1 = Integer.parseInt("1000"); // 10 進 数 の 文 字 列 整 数 04: int i2 = Integer.valueOf(" ", 2);// 2 進 数 の 文 字 列 整 数 05: int i3 = Integer.parseInt("1750", 8); // 8 進 数 の 文 字 列 整 数 06: int i4 = Integer.valueOf("3E8", 16); // 16 進 数 の 文 字 列 整 数 07: 08: String s1 = Integer.toString(100); // 整 数 10 進 数 の 文 字 列 09: String s2 = Integer.toString(100, 2); // 整 数 2 進 数 の 文 字 列 10: String s3 = Integer.toString(100, 8); // 整 数 8 進 数 の 文 字 列 11: String s4 = Integer.toString(100, 16); // 整 数 16 進 数 の 文 字 列 12: 13: System.out.println("i1: " + i1); 14: System.out.println("i2: " + i2); 15: System.out.println("i3: " + i3); 16: System.out.println("i4: " + i4); 17: 18: System.out.println("s1: " + s1); 19: System.out.println("s2: " + s2); 20: System.out.println("s3: " + s3); 21: System.out.println("s4: " + s4); 22: } 23: } 実 行 結 果 は 次 のとおりです i1: 1000 i2: 1000 i3: 1000 i4: 1000 s1: 100 s2: s3: 144 s4: 64 4 行 目 では Integer クラスの valueof メソッドを 使 って 文 字 列 を int 型 の 整 数 に 変 換 して います valueof メソッドは Integer クラス 型 のオブジェクトを 返 しますが valueof メソ ッドの 戻 り 値 は int 型 変 数 に 代 入 されています プリミティブ 型 のラッパークラスでは ラッパークラスのオブジェクトが 表 す 値 が 自 動 100

101 的 にプリミティブ 型 に 変 換 されます これをアンボクシングといいます 逆 に 次 のようにプリミティブ 型 のリテラルを 指 定 すると その 値 を 表 すオブジェクト を 生 成 できます これをオートボクシングといいます Integer obj = 100; Math クラス 指 数 関 数 対 数 関 数 平 方 根 三 角 関 数 などの 数 学 的 演 算 を 行 うための static メソッド を 数 多 く 提 供 しています 詳 細 については JDK 6 ドキュメントを 参 照 してください Thread クラス Runnable インタフェース 非 同 期 処 理 を 行 う 際 に 使 用 します 詳 細 は Chapter 22 で 説 明 します Throwable クラス Exception クラス RuntimeException クラス 例 外 を 表 します 詳 細 は Chapter 15 で 説 明 します java.util パッケージ 便 利 なユーティリティクラスを 提 供 します 利 用 時 には import 文 によるインポートが 必 要 です java.util パッケージの 主 なクラスを 示 します コレクションクラス ArrayList クラス LinkedList クラス HashedMap クラスなど さまざまデータ 構 造 を 表 すクラスやインタフェースが 提 供 されています 詳 細 については Chapter XX で 説 明 し ます Locale クラス 国 や 言 語 に 合 わせて 表 示 を 切 り 替 えたりする 国 際 化 処 理 に 使 用 するメソッドや 定 数 を 提 供 しています たとえば 国 を 表 す Locale 型 の 定 数 として JAPAN US UF FRANCE 言 語 を 表 す Locale 型 の 定 数 として JAPANESE ENGLISH FRENCH などを 定 義 しています Date クラス Calendar クラス GregorianCalendar クラス Date クラスは 特 定 の 日 付 を 表 します Calendar クラスはカレンダーを 表 す 抽 象 クラスです 年 (YEAR) 月 (MONTH) 日 (DATE)などカレンダーの 値 を 表 すフィールドを 定 義 しています GregorianCalendar クラスは Calendar のサブクラスであり グレゴリオ 暦 を 表 します 101

102 GregorianCalendar クラスの gettime メソッドを 使 えば 現 在 の 日 時 を 表 す Date クラス 型 のオブジェクトを 取 得 できます また Calendar クラスのフィールドを 指 定 して get メ ソッドを 呼 び 出 すと 指 定 したフィールドの 値 を 取 得 できます 01: import java.util.*; 02: 03: class CalendarSample { 04: public static void main(string[] args) { 05: GregorianCalendar cal = new GregorianCalendar(); 06: 07: System.out.println("Today: " + 08: cal.get(calendar.year) + " 年 " + 09: (cal.get(calendar.month) + 1) + " 月 " + 10: cal.get(calendar.date) + " 日 "); 11: } 12: } Calendar クラスの MONTH フィールドには 実 際 の 月 より 1 少 ない 整 数 値 (つまり 1 月 は 0)が 入 ります そのため 7 行 目 では 取 得 した 値 に 1 を 足 していることに 注 意 してく ださい 実 行 結 果 は 次 のとおりです Today: 2013 年 1 月 23 日 EventObject クラス EventListener インタフェース ボタンなどの GUI 部 品 のクリックに 応 じて 処 理 を 行 うことをイベント 処 理 といいます イベント 処 理 では ボタンのクリックなどをイベントオブジェクトで 表 し そのイベント をイベントリスナーで 受 け 取 って 処 理 を 実 行 します EventObject クラスはすべてのイベントのスーパークラス EventListener インタフェー スはすべてのイベントリスナーのスーパーインタフェースです Random クラス 擬 似 乱 数 を 生 成 するためのクラスです Math クラスの random メソッドは 0.0~1.0 の 乱 数 を double 型 で 返 すため 整 数 で 取 得 したい 場 合 には Random クラスを 利 用 すると 便 利 です 01: import java.util.random; 02: 03: class RandomSample { 04: public static void main(string[] args) { 05: Random random = new Random(); 06: int i = 0, cnt; 07: 102

103 08: while(true) { 09: cnt = random.nextint(10); 10: System.out.println(++i + " 回 目 : " + cnt); 11: if (cnt == 5) { 12: System.out.println(" 終 了 "); 13: break; 14: } 15: } 16: } 17: } Random クラスの nextint メソッドは 0 から 引 数 に 指 定 した 値 未 満 の 値 をランダムに 返 します 9 行 目 では 10 を 指 定 するため 0~9 の 整 数 が 返 されます 実 行 結 果 は 次 のとおりです 1 回 目 : 9 2 回 目 : 2 3 回 目 : 1 4 回 目 : 5 終 了 メモ 本 書 では java.lang や java.util 以 外 に java.io パッケージ( 入 出 力 処 理 ) java.awt パッケージと javax.swing パッケージ(GUI プログラミング) java.net パッケージ(ネットワーク)などを 扱 います 演 習 問 題 プリミティブ 型 のラッパークラスを 使 って 文 字 列 から 整 数 または 浮 動 小 数 点 数 整 数 または 浮 動 小 数 点 数 から 文 字 列 への 変 換 を 行 うプログラミングを 作 成 しなさい Random クラスを 使 って サイコロを 2 個 振 って 出 た 目 を 表 示 するプログラムを 作 成 しなさい 103

104 Chapter 13 コレクション~その 1 [シラバスなし] 目 的 Java のジェネリック 型 の 基 本 を 理 解 する Java のコレクションフレームワークの 概 要 を 理 解 する ジェネリック 型 とは ジェネリック 型 は Java 5 で 導 入 された 機 能 です 簡 単 に 言 えば クラス 内 で 別 のクラス を 使 う 際 に どのクラスを 使 うかを 明 確 にすることで プログラムの 安 全 性 を 高 くするこ とを 目 的 としています Java では Object クラスがすべてのクラスのスーパークラスになります そのため Object クラスを 指 定 できるところには Integer クラスを 指 定 できます この 処 理 はコンパ イルは 問 題 なく 通 りますが もし 間 違 えて String クラスを 指 定 した 場 合 整 数 を 期 待 して いるのに 文 字 列 を 渡 されたために 実 行 時 エラーが 起 こるかもしれません ジェネリック 型 を 使 うことで このようなエラーをできる 限 り 防 ぐことができます ジェネリック 型 を 使 わない 場 合 たとえば BlackBox クラスは Object クラス 型 のフィールドを 持 ち そのフィールドを 読 み 書 きする getobj メソッドと setobj メソッドを 定 義 しています 01: class BlackBox { 02: private Object myobj; 03: public void setobj(object obj) { 04: myobj = obj; 05: } 06: public Object getobj() { 07: return myobj; 08: } 09: } BlackBox クラスは 次 のようにフィールドに 同 じ 型 のオブジェクトを 設 定 している 限 り 安 全 に 使 用 できます 01: class BlackBoxOKSample { 02: public static void main(string[] args) { 03: BlackBox numbox = new BlackBox(); 04: numbox.setobj(new Integer(100)); 05: Integer myint = (Integer)numBox.getObj(); 06: System.out.println("My number is: " + myint); 07: } 08: } 104

105 My number is: 100 しかし 次 のように 間 違 えて 文 字 列 を 設 定 すると Integer クラスで 取 り 出 そうとしてい るために 実 行 時 エラーが 発 生 します 01: class BlackBoxNGSample { 02: public static void main(string[] args) { 03: BlackBox numbox = new BlackBox(); 04: numbox.setobj("100"); 05: Integer myint = (Integer)numBox.getObj(); 06: System.out.println("My number is: " + myint); 07: } 08: } xception in thread "main" java.lang.classcastexception: java.lang.string cannot be cast to java.lang.integer at BlackBoxNGSample.main(BlackBoxNGSample.java:5) このプログラムはコンパイルが 通 るため ミスは 実 行 するときまで 発 覚 しません ジェネリック 型 を 使 う 場 合 BlackBox クラスをジェネリック 型 の BlackBoxG クラスとして 定 義 し 直 してみます 01: class BlackBoxG<T> { 02: private T myobj; 03: public void setobj(t obj) { 04: myobj = obj; 05: } 06: public T getobj() { 07: return myobj; 08: } 09: } <T>は 型 引 数 といい BlackBoxG クラス 内 でデータ 型 として T を 使 うことを 示 していま す ジェネリック 型 として 定 義 された BlackBoxG クラスを 使 う 場 合 コンストラクタを 呼 び 出 す 際 に<T>の 代 わりに< 使 用 する 型 >を 指 定 します 01: class BlackBoxGOKSample { 02: public static void main(string[] args) { 03: BlackBoxG<Integer> numbox = new BlackBoxG<Integer>(); 04: numbox.setobj(new Integer(100)); 05: Integer myint = numbox.getobj(); 06: System.out.println("My number is: " + myint); 07: } 08: } 105

106 ジェネリック 型 として 定 義 することで 間 違 えて 4 行 目 を 次 のように 記 述 してもコンパ イルエラーになります numbox.setobj("100"); BlackBoxGNGSample.java:4: setobj(java.lang.integer) (BlackBoxG<java.lang.Integer> 内 ) を (java.lang.string) に 適 用 できません numbox.setobj("100"); ^ エラー 1 個 また 3 行 目 で 型 引 数 を 指 定 せずに 次 のように 記 述 すると 型 に 互 換 性 がないというエラ ーになります BlackBoxG numbox = new BlackBoxG<Integer>(); BlackBoxGNGSample.java:5: 互 換 性 のない 型 検 出 値 : java.lang.object 期 待 値 : java.lang.integer Integer myint = numbox.getobj(); ^ 注 :BlackBoxGNGSample.java の 操 作 は 未 チェックまたは 安 全 ではありません 注 : 詳 細 については -Xlint:unchecked オプションを 指 定 して 再 コンパイルしてください エラー 1 個 ジェネリック 型 と 型 引 数 ジェネリック 型 は 次 のように 定 義 します class クラス 名 < 型 引 数 [, 型 引 数,...]> { 型 引 数 には 任 意 の 識 別 子 を 使 用 できますが 通 常 は 1 文 字 の 英 大 文 字 を 使 います T S U V :データ 型 E: 要 素 K:キー V: 値?: 任 意 (ワイルドカード) コレクションフレームワークではジェネリック 型 をよく 使 うため 基 本 を 押 さえておき ましょう 106

107 13-02 コレクションフレームワークとは Java では java.util パッケージでコレクションフレームワークを 提 供 しています コレ クションとは リストやセットなど 複 数 のデータを 集 めた 構 造 のことです よく 利 用 す るデータ 構 造 を 表 すインタフェースや 操 作 用 メソッドを 定 義 しているため プログラムで 有 効 に 活 用 できます Java のコレクションフレームワークを 利 用 するメリットは 次 のとおりです よく 使 われるデータ 構 造 とアルゴリズムが 含 まれているため プログラムを 新 しく 記 述 せずに 済 み プログラミングの 手 間 が 軽 減 される コレクションの 機 能 を 表 すインタフェースを 実 装 したクラスを 利 用 すれば 高 速 かつ 高 品 質 な 処 理 が 可 能 になる コレクションインタフェースによってその 実 装 クラスが 相 互 に 交 換 可 能 であるため プログラムを 簡 単 に 修 正 できる コレクションインタフェースでデータ 構 造 への 操 作 が 定 義 されているため API の 学 習 やプログ ラムの 設 計 実 装 に 必 要 な 労 力 を 軽 減 される コレクションやアルゴリズムを 操 作 するインタフェースが 定 義 されているため ソフトウェアの 再 利 用 が 容 易 になる コレクションインタフェース コレクションフレームワークでは リスト セット マップなど 種 類 の 異 なるデータ 構 造 を 表 すインタフェースが 定 義 されています Collection Map List Set Queue SrotedMap SrotedSet Collection<E>インタフェース データ( 要 素 )の 集 合 であるコレクションを 表 します List Set Queue のスーパーイ 107

108 ンタフェースです 次 のようなメソッドを 定 義 しています boolean add(e e) 指 定 された 要 素 をコレクションに 追 加 します boolean addall(collection<? extends E> c) 指 定 されたコレクションのすべての 要 素 をこのコレクションに 追 加 します void clear() すべての 要 素 を 削 除 します boolean contains(object o) 指 定 された 要 素 が 含 まれている 場 合 に true を 返 します boolean containsall(collection<?> c) 指 定 されたコレクションのすべての 要 素 が 含 まれている 場 合 に true を 返 します boolean equals(object o) 指 定 されたオブジェクトと 等 しい 場 合 に true を 返 します int hashcode() ハッシュコード 値 を 返 します boolean isempty() 要 素 が 含 まれていない 場 合 に true を 返 します Iterator<E> iterator() 要 素 に 対 する 反 復 処 理 を 実 行 するための Iterator オブジェクトを 返 します boolean remove(object o) 指 定 された 要 素 を 削 除 します boolean removeall(collection<?> c) すべての 要 素 を 削 除 します boolean retainall(collection<?> c) 108

109 指 定 されたコレクションに 格 納 されている 要 素 のみを 保 持 するようにします int size() 含 まれている 要 素 の 数 を 返 します Object[] toarray() <T> T[] toarray(t[] a) コレクションの 要 素 をすべて 格 納 した 配 列 を 返 します List<E>インタフェース Collection<E>インタフェースのサブインタフェースで 要 素 に 順 序 があるリストを 表 し ます 要 素 の 重 複 は 許 可 されます 要 素 として null を 保 持 することも 可 能 です 次 のよう なメソッドを 定 義 しています(Collection<E>インタフェースにはない あるいは 機 能 が 異 なるメソッドを 示 します) boolean add(e e) boolean addall(collection<? extends E> c) 指 定 された 要 素 または 指 定 されたコレクションのすべての 要 素 をリストの 最 後 に 追 加 し ます void add(int index, E element) boolean addall(int index, Collection<? extends E> c) リスト 内 の 指 定 された 位 置 に 要 素 または 指 定 されたコレクションのすべての 要 素 を 挿 入 します E get(int index) 指 定 された 位 置 にある 要 素 を 返 します int indexof(object o) int lastindexof(object o) 指 定 された 要 素 が 最 初 または 最 後 に 検 出 された 位 置 のインデックスを 返 します Iterator<E> iterator() ListIterator<E> listiterator() ListIterator<E> listiterator(int index) 要 素 に 対 する 反 復 処 理 を 適 切 な 順 序 で 実 行 するための Iterator オブジェクトまたは ListIterator オブジェクトを 返 します インデックスを 指 定 した 場 合 は その 位 置 から 処 理 109

110 を 実 行 します E remove(int index) 指 定 された 位 置 の 要 素 を 削 除 します boolean remove(object o) 指 定 された 要 素 のうち 最 初 の 要 素 を 削 除 します E set(int index, E element) 指 定 された 位 置 の 要 素 を 指 定 の 要 素 に 置 き 換 えます List<E> sublist(int fromindex, int toindex) 最 初 の 位 置 (fromindex)の 要 素 から 最 後 の 位 置 (toindex)の 1 つ 前 の 要 素 までを 含 む List オブジェクトを 返 します Set<E>インタフェース/SortedSet<E>インタフェース Set<E>インタフェースは Collection<E>インタフェースのサブインタフェースで 要 素 の 重 複 を 許 さないセットを 表 します null を 許 可 する 場 合 は 1 つのみ 保 持 します 次 の ようなメソッドを 定 義 しています(Collection<E>インタフェースにはない あるいは 機 能 が 異 なるメソッドを 示 します) boolean add(e e) boolean addall(collection<? extends E> c) 指 定 された 要 素 または 指 定 されたコレクションのすべての 要 素 がセット 内 にない 場 合 に セットに 追 加 します SortedSet<E>インタフェースは Set<E>インタフェースのサブインタフェースで ソー トされたセットを 表 します Set インタフェースのメソッドに 加 え 次 のメソッドを 定 義 し ます Comparator<? super E> comparator() セット 内 の 要 素 の 順 序 を 決 める Comparator オブジェクトを 返 します E first() E last() セット 内 の 最 初 または 最 後 の 要 素 を 返 します 110

111 SortedSet<E> headset(e toelement) セット 内 で 指 定 された 要 素 より 小 さな 要 素 を 持 つセットを 返 します SortedSet<E> subset(e fromelement, E toelement) 最 初 の 要 素 (fromelement)から 最 後 の 要 素 (toelement)の 1 つ 前 の 要 素 までを 含 むセ ットを 返 します SortedSet<E> tailset(e fromelement) セット 内 で 指 定 された 要 素 より 大 きな 要 素 を 持 つセットを 返 します Queue<E>インタフェース Collection<E>インタフェースのサブインタフェースで キューを 表 します 通 常 は FIFO (First In, First Out) 方 式 で 要 素 を 出 し 入 れします 次 のようなメソッドを 定 義 していま す(Collection<E>インタフェースにはない あるいは 機 能 が 異 なるメソッドを 示 します) boolean add(e e) boolean offer(e e) 指 定 された 要 素 を 容 量 制 限 がない 場 合 にすぐに 挿 入 します add メソッドは 挿 入 に 失 敗 す ると 例 外 をスローします E element() E peek() キューの 先 頭 の 要 素 を 削 除 することなく 取 得 します element メソッドは 取 得 に 失 敗 する と 例 外 をスローします E remove() E poll() キューの 先 頭 を 取 得 して 削 除 します remove メソッドは 取 得 に 失 敗 すると 例 外 をスローし ます また 両 端 キュー(デック)を 表 すものとして Queue インタフェースを 継 承 する Deque インタフェースも 提 供 されています Map<K,V>インタフェース/SortedMap<K,V>インタフェース Map<K,V>インタフェースは キーと 値 をペアで 格 納 するマップを 表 します 同 じキー 111

112 を 複 数 格 納 することはできません 1 つのキーは 1 つの 値 に 対 応 します 次 のようなメソ ッドを 定 義 しています void clear() キーと 値 のペアをすべて 削 除 します boolean containskey(object key) 指 定 されたキーに 対 応 する 値 が 存 在 する 場 合 に true を 返 します boolean containsvalue(object value) 指 定 された 値 に 対 応 するキーが 存 在 する 場 合 に true を 返 します Set<Map.Entry<K,V>> entryset() マップに 含 まれるキーと 値 のすべてのセットを 返 します boolean equals(object o) 指 定 されたオブジェクトと 等 しい 場 合 に true を 返 します V get(object key) 指 定 されたキーに 対 応 する 値 を 返 します int hashcode() ハッシュコード 値 を 返 します boolean isempty() マップが 空 の 場 合 に true を 返 します Set<K> keyset() マップに 含 まれるすべてのキーのセットを 返 します V put(k key, V value) 指 定 されたキーと 値 をマップに 追 加 します void putall(map<? extends K,? extends V> m) 指 定 されたマップに 含 まれるキーと 値 をすべて 追 加 します 112

113 V remove(object key) 指 定 されたキーと 対 応 する 値 を 削 除 します int size() マップ 内 のキーと 値 のペアの 数 を 返 します Collection<V> values() このマップに 含 まれる 値 を 含 む Collection オブジェクトを 返 します SortedMap<K,V>インタフェースはソートされたマップを 表 します 次 のようなメソッ ドを 定 義 しています(Map<K,V>インタフェースにはない あるいは 機 能 が 異 なるメソッ ドを 示 します) Comparator<? super K> comparator() マップ 内 のキーの 順 序 を 決 める Comparator オブジェクトを 返 します K firstkey() K lastkey() マップ 内 の 最 初 または 最 後 のキーを 返 します SortedMap<K,V> headmap(k tokey) マップ 内 で 指 定 されたキーより 小 さなキーとその 値 を 持 つマップを 返 します SortedMap<K,V> submap(k fromkey, K tokey) 最 初 のキー(fromKey)から 最 後 のキー(toKey)の 1 つ 前 までのキーと 値 を 含 むマップ を 返 します SortedMap<K,V> tailmap(k fromkey) マップ 内 で 指 定 されたキーより 小 さなキー 以 上 とその 値 を 持 つマップを 返 します 演 習 問 題 BlackBoxG クラスに Integer クラス 以 外 を 指 定 して 利 用 するプログラムを 書 きなさい JDK 6 ドキュメントの java.util パッケージのコレクションインタフェースの 記 述 を 読 み 各 インタフェ ースの 特 徴 を 理 解 しなさい 113

114 Chapter 14 コレクション~その 2 [シラバスなし] 目 的 Iterator インタフェースについて 理 解 する コレクションインタフェースの 汎 用 実 装 を 活 用 する Iterator<E>インタフェース/ListIerator<E>インタフェース Iterator<E>インタフェース Iterator インタフェースは コレクションに 対 して 繰 り 返 し 処 理 を 実 行 する 際 に 利 用 しま す たとえば コレクション 内 のすべての 要 素 を 表 示 したい 場 合 コレクションの iterator メソッドで Iterator オブジェクトを 取 得 し これに 対 して 次 のメソッドを 利 用 して 繰 り 返 し 処 理 を 行 います boolean hasnext() 繰 り 返 し 処 理 で 次 の 要 素 が 存 在 する 場 合 に true を 返 します E next() 繰 り 返 し 処 理 で 次 の 要 素 を 返 します void remove() 繰 り 返 し 処 理 で 最 後 に 返 された 要 素 を 削 除 します ListIerator<E>インタフェース Iterator<E>インタフェースのサブインタフェースです 順 序 を 持 つリストの 繰 り 返 し 処 理 を 行 う 際 に 使 用 します リストの listiterator メソッドで 取 得 します 次 のメソッドを 定 義 しています void add(e e) 指 定 された 要 素 をリストに 挿 入 します boolean hasnext() リストを 順 方 向 に 走 査 するとき 次 の 要 素 がある 場 合 に true を 返 します boolean hasprevious() リストを 逆 方 向 に 走 査 するとき 次 の 要 素 がある 場 合 に true を 返 します 114

115 E next() 次 の 要 素 を 返 します int nextindex() 次 の 要 素 のインデックスを 返 します E previous() 前 の 要 素 を 返 します int previousindex() 前 の 要 素 のインデックスを 返 します void remove() next メソッドまたは previous メソッドが 返 した 最 後 の 要 素 をリストから 削 除 します void set(e e) next メソッドまたは previous メソッドが 返 した 最 後 の 要 素 を 指 定 の 要 素 で 置 き 換 えま す Comparable<T>インタフェースと Comparator<T>インタフェース String クラスや Integer クラスなどの 一 部 のクラスは Comparable<T>インタフェースを 実 装 しています Comparable<T>インタフェースを 実 装 するクラスは 自 然 順 序 付 きで 比 較 できる 機 能 を 持 ち SortedSet や SortedMap などのソート 機 能 付 きのコレクションに 入 れると 自 動 的 にソートされます Comparable<T>インタフェースを 実 装 する 主 なクラスは 次 のとおりです クラス Byte Long Integer Short Double Float BigInteger BigDecimal Char Boolean String Date 比 較 方 法 符 号 付 きの 整 数 符 号 なしの 整 数 Boolean.TRUE は Blooean.FALSE より 大 きい 辞 書 の 順 暦 の 順 Comparable インタフェースを 実 装 していないクラスをソートしようとすると 例 外 が 発 115

116 生 します また 相 互 に 比 較 できないクラス 型 同 士 をソートしようとしたときにも 例 外 が 発 生 します 自 然 順 序 以 外 の 方 法 でソートしたい(SortedSet や SortedMap に 追 加 したい)とき あ るいは Comparable インタフェースを 実 装 していないクラスのオブジェクトをソートした いときには Comparable インタフェースを 実 装 するクラスを 作 成 します Comparable イ ンタフェースは 2 つの 引 数 をとる compare メソッドを 定 義 しているため ここに 2 つのオ ブジェクトを 比 較 して 大 小 を 判 定 する 処 理 を 記 述 します SortedSet インタフェースや SortedMap インタフェースは Comparator オブジェクトを 返 す comparator メソッドを 定 義 しているため 作 成 した Comparator の 実 装 クラスのオブ ジェクトを 返 すように 実 装 します コレクションインタフェースの 汎 用 実 装 コレクションフレームワークでは よく 利 用 されるコレクションとしてコレクションイ ンタフェースの 汎 用 実 装 クラスを 提 供 しています インタフェース ハッシュテーブル サイズが 変 更 バランスツリー リンクリスト ハッシュテーブル+ 可 能 な 配 列 リンクリスト Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Deque ArrayDeque LinkedList Map HashMap TreeMap LinkedHashMap これらの 汎 用 実 装 クラスのうち よく 使 われるものを 取 り 上 げて 説 明 します 各 クラス のサンプルプログラムでは 次 の 処 理 を 実 行 します 4. 各 クラスのオブジェクトを 生 成 する 5. 生 成 したオブジェクトに 要 素 を 追 加 する 6. Iterator オブジェクトを 取 得 し 含 まれる 要 素 をすべて 表 示 する LinkedList<E>クラス リンクリストを 表 します リンクリストでは 要 素 が 前 後 の 要 素 を 示 しています リンク リストの 先 端 および 終 端 での 追 加 や 削 除 の 機 能 を 備 えています 01: import java.util.*; 02: 03: class LinkedListSample { 04: public static void main(string args[]){ 05: // 文 字 列 を 要 素 として 持 つ LinkedList を 生 成 116

117 06: LinkedList<String> list = new LinkedList<String>(); 07: // add メソッドで 要 素 を 追 加 08: list.add("abc"); 09: list.add("def"); 10: list.add("def"); 11: list.add("ghi"); 12: list.add(null); 13: list.addlast("jkl"); // 末 尾 に 追 加 14: list.addfirst("abc"); // 先 頭 に 追 加 15: list.add("mno"); 16: 17: // 要 素 数 を 取 得 する 18: System.out.println("サイズ:" + list.size()); 19: // ListIterator オブジェクトを 取 得 する 20: ListIterator i = list.listiterator(); 21: 22: // 繰 り 返 し 処 理 23: while(i.hasnext()){ 24: System.out.println(i.next()); 25: } 26: } 27: } 13 行 目 で addlast メソッドでリストの 末 尾 に 14 行 目 で addfirst メソッドでリストの 先 端 に 要 素 を 追 加 しています また List インタフェースを 実 装 しているため 20 行 目 で listiterator メソッドで ListIterator オブジェクトを 取 得 しています 実 行 結 果 は 次 のとおりです サイズ:8 ABC ABC DEF DEF GHI null JKL MNO ArrayList<E>クラス 通 常 の 配 列 は 一 度 要 素 数 分 の 領 域 を 確 保 したら 変 更 はできませんが ArrayList<E>クラ スはサイズ 変 更 が 可 能 な 配 列 を 表 します 要 素 として null を 追 加 でき 要 素 の 重 複 も 許 可 します LinkedList クラスと 同 様 に ListIterator オブジェクトを 利 用 できます 01: import java.util.*; 02: 03: class ArrayListSample { 04: public static void main(string args[]){ 05: // 文 字 列 を 要 素 として 持 つ ArrayList を 生 成 117

118 06: ArrayList<String> list = new ArrayList<String>(); 07: // add メソッドで 要 素 を 追 加 08: list.add("mno"); 09: list.add("abc"); 10: list.add("null"); 11: list.add("def"); 12: list.add("ghi"); 13: list.add(null); 14: list.add("jkl"); 15: list.add("abc"); 16: 17: // 要 素 数 を 取 得 する 18: System.out.println("サイズ:" + list.size()); 19: // ListIterator オブジェクトを 取 得 する 20: ListIterator i = list.listiterator(); 21: 22: // 繰 り 返 し 処 理 23: while(i.hasnext()){ 24: System.out.println(i.next()); 25: } 26: } 27: } 実 行 結 果 は 次 のとおりです サイズ:8 MNO ABC null DEF GHI null JKL ABC HashSet<E>クラス ハッシュ 値 をもとに 要 素 を 格 納 するセットを 表 します 要 素 として null を 許 容 しますが 要 素 の 重 複 は 許 容 しません 01: import java.util.*; 02: 03: class HashSetSample { 04: public static void main(string args[]){ 05: // 文 字 列 を 要 素 として 持 つ HashSet を 生 成 06: HashSet<String> set = new HashSet<String>(); 07: // add メソッドで 要 素 を 追 加 08: set.add("mno"); 09: set.add("def"); 10: set.add("def"); 11: set.add("ghi"); 12: set.add("abc"); 13: set.add(null); 118

119 14: set.add("jkl"); 15: set.add("abc"); 16: 17: // 要 素 数 を 取 得 する 18: System.out.println("サイズは:"+set.size()); 19: // Iterator オブジェクトを 取 得 する 20: Iterator i = set.iterator(); 21: 22: // 繰 り 返 し 処 理 23: while(i.hasnext()){ 24: System.out.println(i.next()); 25: } 26: } 27: } 実 行 結 果 は 次 のとおりです サイズは:6 null ABC MNO DEF JKL GHI 要 素 を 8 個 追 加 しましたが 重 複 は 許 容 されないため 6 個 しか 格 納 されていない 点 に 注 意 してください TreeSet<E>クラス SortedSet<E>インタフェースを 実 装 しており 要 素 が 自 動 的 にソートされます 要 素 と して null を 許 容 せず 要 素 の 重 複 も 許 容 しません add メソッドで null を 追 加 すると 実 行 時 に 例 外 がスローされます 01: import java.util.*; 02: 03: class TreeSetSample { 04: public static void main(string args[]){ 05: // 文 字 列 を 要 素 として 持 つ TreeSet を 生 成 06: TreeSet<String> set = new TreeSet<String>(); 07: // add メソッドで 要 素 を 追 加 08: set.add("mno"); 09: set.add("def"); 10: set.add("mno"); 11: set.add("ghi"); 12: set.add("abc"); 13: set.add("def"); 14: set.add("jkl"); 15: set.add("abc"); 16: 119

120 17: // 要 素 数 を 取 得 する 18: System.out.println("サイズは:"+set.size()); 19: // Iterator オブジェクトを 取 得 する 20: Iterator i = set.iterator(); 21: 22: // 繰 り 返 し 処 理 23: while(i.hasnext()){ 24: System.out.println(i.next()); 25: } 26: } 27: } 実 行 結 果 は 次 のとおりです サイズは:5 ABC DEF GHI JKL MNO HashMap<K,V>クラス ハッシュテーブルをベースとした Map インタフェースの 実 装 クラスです キーおよび 値 に null を 使 用 できません また キーの 重 複 は 許 容 されず 同 じキーを 指 定 された 場 合 は 既 存 の 値 を 上 書 きします 01: import java.util.*; 02: 03: class HashMapSample { 04: public static void main(string args[]){ 05: // キーと 値 に 文 字 列 を 使 う HashMap を 生 成 06: HashMap<String, String> map = new HashMap<String, String>(); 07: // put メソッドでキーと 値 のペアを 追 加 08: map.put("100", "MNO"); 09: map.put("050", "DEF"); 10: map.put("020", "DEF"); 11: map.put("010", "GHI"); 12: map.put("200", "ABC"); 13: map.put("200", "DEF"); 14: map.put("001", "JKL"); 15: map.put("300", "ABC"); 16: 17: // キーと 値 のペアの 数 を 取 得 する 18: System.out.println("サイズは:"+ map.size()); 19: 20: // すべてのキーを 含 むセットを 取 得 する 21: Set set = map.keyset(); 22: // Iterator オブジェクトを 取 得 する 23: Iterator i = set.iterator(); 24: 120

121 25: // 繰 り 返 し 処 理 26: while(i.hasnext()){ 27: String key = (String)i.next(); 28: System.out.println(key + " = " + map.get(key)); 29: } 30: } 31: } マップの 場 合 keset メソッドですべてのキーを 含 むセットを 取 得 し そのセットから Iterator オブジェクトを 取 得 して 繰 り 返 し 処 理 を 行 います 実 行 結 果 は 次 のとおりです サイズは:7 300 = ABC 010 = GHI 200 = DEF 020 = DEF 050 = DEF 001 = JKL 100 = MNO TreeMap<K,V>クラス SortedMap<E>インタフェースを 実 装 しており キーをもとに 自 動 的 にソートされます 01: import java.util.*; 02: 03: class TreeMapSample { 04: public static void main(string args[]){ 05: // キーと 値 のペアの 数 を 取 得 する 06: TreeMap<String, String> map = new TreeMap<String, String>(); 07: // put メソッドでキーと 値 のペアを 追 加 08: map.put("100", "MNO"); 09: map.put("050", "DEF"); 10: map.put("020", "DEF"); 11: map.put("010", "GHI"); 12: map.put("200", "ABC"); 13: map.put("200", "DEF"); 14: map.put("001", "JKL"); 15: map.put("300", "ABC"); 16: 17: // キーと 値 のペアの 数 を 取 得 する 18: System.out.println("サイズは:"+ map.size()); 19: 20: // すべてのキーを 含 むセットを 取 得 する 21: Set set = map.keyset(); 22: // Iterator オブジェクトを 取 得 する 23: Iterator i = set.iterator(); 24: 25: // 繰 り 返 し 処 理 26: while(i.hasnext()){ 27: String key = (String)i.next(); 121

122 28: System.out.println(key + " = " + map.get(key)); 29: } 30: } 31: } 実 行 結 果 は 次 のとおりです サイズは:7 001 = JKL 010 = GHI 020 = DEF 050 = DEF 100 = MNO 200 = DEF 300 = ABC 拡 張 for 文 各 コレクションクラスの 要 素 を 表 示 する 処 理 では Iterator オブジェクトを 使 いました コレクションから 要 素 を 1 つずつ 取 り 出 して 処 理 を 行 う 際 には Iterator オブジェクトを 使 わずに 拡 張 for 文 を 使 うことができます 01: LinkedList<String> list = new LinkedList<String>(); 02: 03: list.add("abc"); 04: list.add("def"); 05: list.add("def"); 06: 07: // 拡 張 for 文 08: for(string temp : list){ 09: System.out.println(temp); 10: } 演 習 問 題 各 汎 用 実 装 クラスを 利 用 し String クラス 以 外 を 要 素 に 持 つコレクションを 生 成 して 要 素 をすべ て 表 示 するプログラムを 作 成 しなさい 繰 り 返 し 処 理 で Iterator オブジェクトを 使 うプログラムと 拡 張 for 文 を 使 うプログラムを 作 成 しなさ い 122

123 Chapter 15 例 外 処 理 [シラバス No. 06] 目 的 例 外 とは 何 かを 理 解 する 例 外 の 処 理 方 法 を 理 解 する 例 外 とは 例 外 のスロー 次 のサンプルプログラムは 実 行 時 に 指 定 されたコマンドライン 引 数 を 画 面 に 表 示 しま す 01: class ArraysExceptionSample { 02: public static void main(string[] args) { 03: System.out.println("Option: " + args[0]); 04: } 05: } コマンドライン 引 数 を 指 定 せずにこのサンプルプログラムを 実 行 すると 次 のような 実 行 時 エラーが 発 生 します Exception in thread "main" java.lang.arrayindexoutofboundsexception: 0 at ArraysExceptionSample.main(ArraysExceptionSample.java:3) プログラムの 実 行 時 にコマンドライン 引 数 を 指 定 すると その 値 が main メソッドに 引 数 として 渡 される 配 列 args に 格 納 されます コマンドライン 引 数 を 指 定 しないと 配 列 が 確 保 されず 3 行 目 で args[0]を 参 照 できません そのため システムが Java の 規 約 への 違 反 が 発 生 したことを 通 知 し プログラムを 強 制 終 了 したのです この 通 知 が 例 外 です なお 3 行 目 の 文 はコマンドライン 引 数 を 指 定 したときには 問 題 なく 処 理 されるため コンパイル エラーは 発 生 しません プログラムの 強 制 終 了 を 通 知 することを 例 外 をスローする といいます このサンプ ル プ ロ グ ラ ム で は 配 列 の イ ン デ ッ ク ス が 不 正 で あ る こ と を 示 す ArrayIndexOutOfBoundsException という 例 外 がスローされています 例 外 がスローされるのは 次 のような 場 合 です 式 の 評 価 が Java の 仕 様 に 違 反 した(0 による 除 算 配 列 のインデックスが 不 正 など) プログラムのロードやリンクのエラーが 発 生 した メモリ 不 足 といった 資 源 超 過 など Java のシステムが 異 常 な 実 行 状 態 を 検 出 した throw 文 による 例 外 のスローが 実 行 された 123

124 Thread クラスの stop メソッドが 呼 び 出 された Java のシステムで 内 部 エラーが 発 生 した 例 外 の 種 類 次 に 標 準 入 力 ( 一 般 にキーボード)から 1 文 字 の 入 力 を 受 け 取 るサンプルプログラム を 示 します 01: class CheckedSample { 02: public static void main(string[] args) { 03: char c = 0; 04: c = (char)system.in.read(); // キーボードから 1 文 字 入 力 05: System.out.print("Input: " + c); 06: } 07: } このサンプルプログラムは 次 のようなエラーになります CheckedSample.java:4: 例 外 java.io.ioexception は 報 告 されません スローするに は キャッチまたは スロー 宣 言 をしなければなりません c = (char)system.in.read(); // キーボードから 1 文 字 入 力 ^ エラー 1 個 これは IOException という 例 外 がスローされる 可 能 性 があるからプログラム 内 で 処 理 しなさいという 意 味 です Java で 扱 う 例 外 は java.lang.throwable クラスを 継 承 するサブクラスになります し かし 大 きく 2 種 類 に 分 けられます 1 つは サンプルプログラム ArraysExceptionSample のように コンパイル 時 にはエラ ーにならずに 実 行 時 に 発 生 するものです これを 非 検 査 例 外 といいます もう 1 つは サンプルプログラム CheckedSample のように コンパイル 時 にチェックさ れ エラーになるものです これを 検 査 例 外 といいます 例 外 を 表 すクラスは Throwable クラスをトップにして 継 承 の 階 層 を 形 成 します Error クラスと Exception クラスは Trhowable クラスの 直 接 のサブクラスです さらに Exception クラスには RuntimeException クラスというサブクラスがあります 124

125 Throwable Error Exception RuntimeException IOException 非 検 査 例 外 検 査 例 外 Error クラスとそのサブクラス RuntimeException クラスのサブクラスは 非 検 査 例 外 で コンパイル 時 にチェックされません Exception クラスのサブクラスで RuntimeException クラスとそのサブクラス 以 外 のものは 検 査 例 外 になり コンパイル 時 にチェックされます 検 査 例 外 は 何 らかの 方 法 で 処 理 しなければなりません 例 外 処 理 には 例 外 の 捕 捉 と 伝 播 があります スタックトレース java コマンドでアプリケーションを 実 行 する 際 にクラス 名 を 間 違 えると 次 のようなエ ラーになります Exception in thread "main" java.lang.noclassdeffounderror: ArraysExceptionSample/class Caused by: java.lang.classnotfoundexception: ArraysExceptionSample.class at java.net.urlclassloader$1.run(unknown Source) at java.security.accesscontroller.doprivileged(native Method) at java.net.urlclassloader.findclass(unknown Source) at java.lang.classloader.loadclass(unknown Source) at sun.misc.launcher$appclassloader.loadclass(unknown Source) at java.lang.classloader.loadclass(unknown Source) Could not find the main class: ArraysExceptionSample.class. Program will exit. これは 実 行 するクラスが 見 つからないことを 示 す NoClassDefFoundError という 例 外 がスローされたからです このように 実 行 時 に 例 外 がスローされると 例 外 とともに 例 外 がスローされるまでに 呼 び 出 されたメソッドの 履 歴 が 表 示 されます これをスタック トレースといいます 125

126 Throwable クラスの printstacktrace メソッドを 使 えば プログラムからスタックトレ ースを 表 示 することができます 例 外 の 捕 捉 try 文 /catch 文 サンプルプログラム CheckedSample で 利 用 している read メソッドは InputStream ク ラスで 次 のように 定 義 されています public abstract int read() throws IOException throws IOException は 例 外 として IOException という 例 外 をスローする 可 能 性 が あることを 意 味 します throws キーワードで 例 外 を 指 定 しているメソッドは try 文 のブ ロック 内 で 呼 び 出 し 発 生 する 可 能 性 がある 例 外 を catch 文 で 捕 捉 します try { 例 外 をスローする 可 能 性 があるメソッドの 呼 び 出 し } catch( 例 外 クラス 変 数 名 ) { 例 外 がスローされたときに 実 行 する 処 理 } CheckedSample で 言 えば read メソッドの 呼 び 出 しを try 文 のブロックに 記 述 します catch 文 は catch(ioexception e) のように 記 述 します try 文 のブロックで 実 行 した 処 理 が 例 外 をスローすると スローされた 例 外 と catch 文 に 指 定 された 例 外 クラスの 比 較 が 行 われます 同 じクラスか スローされた 例 外 が catch 文 の 例 外 のサブクラスである 場 合 catch 文 のブロックに 指 定 された 処 理 が 実 行 されます try 文 のブロックで 例 外 がスローされなかった 場 合 catch 文 は 無 視 され その 次 の 処 理 に 制 御 が 移 ります 1 例 外 がスローされな かった catch 文 は 無 視 され 次 の 処 理 へ 例 外 try { IOException // 例 外 をスローする 可 能 性 のある 処 理 } catch (IOException e) { // 例 外 がスローされたときに 実 行 する 処 理 return; } // 次 の 処 理 2 例 外 がスローされた catch 文 との 比 較 が 行 われ 一 致 すれば 処 理 が 実 行 される CheckedSample に 例 外 処 理 を 追 加 してみましょう IOExcetion は java.io パッケージの 126

127 クラスであるため import 文 を 追 加 します 01: import java.io.*; 02: 03: class CheckedSample { 04: public static void main(string[] args) { 05: char c = 0; 06: 07: try { 08: c = (char)system.in.read(); // キーボードから 1 文 字 入 力 09: } 10: catch(ioexception e) { 11: e.printstacktrace(); 12: return; 13: } 14: System.out.print("Input: " + c); 15: } 16: } これでコンパイルできるようになります 実 行 結 果 は 次 のとおりです >javac CheckedSample.java >java CheckedSample A Input: A try 文 でエラーが 発 生 したときには スタックトレースが 表 示 されます java.io.ioexception at CheckedSample.main(CheckedSample.java:8) 複 数 の catch 文 InputStream クラスには byte 型 配 列 を 引 数 として 受 け 取 るする read メソッドもあり ます この read メソッドは IOException 以 外 にも 引 数 として 受 け 取 った byte 型 配 列 に 関 連 して NullPointerException をスローする 可 能 性 があります try 文 のブロックで 実 行 する 処 理 が 複 数 の 例 外 をスローする 可 能 性 があり その 例 外 の 種 類 によって 異 なる 処 理 を 実 行 したい 場 合 には 次 のように catch 文 を 複 数 記 述 します 01: byte[] b = new byte[10]; 02: try { 03: System.in.read(b); 04: } 05: catch (IOException e1) { 06: IOException がスローされた 場 合 の 処 理 07: } 08: catch (NullPointerException e2) { 09: NullPointerException がスローされた 場 合 の 処 理 127

128 10: } 逆 に 例 外 が 複 数 あっても catch 文 で 実 行 する 処 理 が 1 つである 場 合 catch 文 にそれら の 例 外 クラスのスーパークラス(この 場 合 は Exception クラス)を 指 定 します 01: byte[] b = new byte[10]; 02: try { 03: System.in.read(b); 04: } 05: catch (Exception e) { 06: e.printstacktrace(); 07: return; 08: } メモ ここで 例 に 挙 げたNullPointerException クラスは RuntimeException クラスのサブクラスで 非 検 査 例 外 になります NullPointerException は 主 にプログラミングのミスにより 発 生 する 例 外 です プ ログラム 中 の 例 外 処 理 で 対 処 するのではなく プログラムをよくテストして 実 行 時 に 発 生 しないよ うにする 必 要 があります try 文 /catch 文 /finally 文 例 外 がスローされ それ 以 上 処 理 を 続 行 できなくなったときに catch 文 で 例 外 処 理 の 後 にプログラム 自 体 を 終 了 する 場 合 もあります プログラムを 終 了 する 前 に 後 処 理 を 実 行 し なければならない 場 合 その 処 理 を finally 文 のブロックに 記 述 します try { 例 外 をスローする 可 能 性 のある 処 理 } catch( 例 外 クラス 変 数 名 ) { 例 外 がスローされたときに 実 行 する 処 理 return; // プログラムの 終 了 } finally { 例 外 がスローされたかどうかに 関 係 なく 実 行 すべき 処 理 } finally 文 のブロックの 処 理 は 必 ず 実 行 されます try 文 のブロックで 実 行 した 処 理 が 例 外 をスローし それが catch 文 で 捕 捉 されて catch 文 のブロックの 処 理 が 実 行 されると その 後 に finally 文 のブロックの 処 理 が 実 行 されます もし catch 文 のブロックに return 文 があっても return 文 の 前 にに finally 文 のブロック が 実 行 されます try 文 のブロックで 例 外 がスローされなかった 場 合 catch 文 は 無 視 され finally 文 のブ ロックの 処 理 が 実 行 されます 128

129 1 例 外 がスローされな かった catch 文 は 無 視 され finally 文 の 処 理 へ 例 外 try { IOException // 例 外 をスローする 可 能 性 のある 処 理 } catch (IOException e) { // 例 外 がスローされたときに 実 行 する 処 理 return; } finally { // 例 外 に 関 係 なく 必 ず 実 行 すべき 処 理 } 2 例 外 がスローされた catch 文 との 比 較 が 行 われ 一 致 すれば 処 理 が 実 行 される その 後 finally 文 の 処 理 へ 例 外 の 伝 播 try 文 /catch 文 を 使 わない 場 合 は 例 外 を 呼 び 出 し 元 に 伝 播 することで 処 理 します 再 度 コンパイルエラーが 発 生 したサンプルプログラムを 見 てみましょう 01: class CheckedSample { 02: public static void main(string[] args) { 03: char c = 0; 04: c = (char)system.in.read(); // キーボードから 1 文 字 入 力 05: System.out.print("Input: " + c); 06: } 07: } IOException をスローする 可 能 性 がある read メソッドを 呼 び 出 しているため このまま ではコンパイルできません しかし 2 行 目 の main メソッドの 宣 言 に throws IOException を 追 加 すると コンパイルできるようになります 01: class CheckedSample { 02: public static void main(string[] args) throws IOException { 03: char c = 0; 04: c = (char)system.in.read(); // キーボードから 1 文 字 入 力 05: System.out.print("Input: " + c); 06: } 07: } メソッドの 宣 言 に throws 例 外 クラス を 指 定 すると このメソッドは 指 定 した 例 外 を スローする 可 能 性 があることを 示 します つまり スローする 例 外 をメソッド 内 で 処 理 せ ずに メソッドの 呼 び 出 し 元 に 委 ねるという 意 味 です 例 外 の 処 理 を 呼 び 出 し 元 に 任 せる ことを 例 外 の 伝 播 といいます 129

130 例 外 を 宣 言 することでメソッド 内 では 例 外 を 処 理 しない mymethod() throws IOException { main() { char c = System.in.read(); } try { mymethod(); } catch (IOException e) { // 例 外 処 理 return; } } 例 外 IOException 例 外 の 処 理 を 呼 び 出 し 元 に 委 ねる = 例 外 の 伝 播 メソッドを 呼 び 出 した 状 況 によって 例 外 発 生 時 の 対 処 が 異 なります プログラムを 強 制 終 了 したり 例 外 を 無 視 してそのまま 処 理 を 継 続 してもよいこともあります そのよう な 場 合 は メソッド 内 で 例 外 処 理 を 行 わずに メソッドの 宣 言 に throws キーワードでスロ ーする 可 能 性 がある 例 外 を 指 定 し 例 外 の 伝 播 によって 呼 び 出 し 元 にその 判 断 を 任 せます メモ クラスを 継 承 し スーパークラスのメソッドをオーバーライドする 場 合 throws キーワードに 指 定 されている 例 外 と 同 じ 例 外 が そのサブクラスに 当 たる 例 外 をメソッドの 宣 言 に 指 定 する 必 要 があ ります たとえば スーパークラスのメソッドで throws IOException が 指 定 されている 場 合 IOException かそのサブクラス(FileNotFoundException など)を 指 定 します オーバーライドするメソッドで 異 なる 例 外 (サブクラス 以 外 )を 指 定 すると コンパイルエラーにな ります 例 外 のスロー プログラム 中 で 明 示 的 に 例 外 をスローすることもできます 例 外 のスローには throw 文 を 使 います たとえば IOException の 場 合 次 のように 記 述 します throw new IOException(); throw new IOException(" 例 外 に 関 するメッセージ"); コンストラクタに 指 定 できる 引 数 は 例 外 によって 異 るため 詳 細 は JDK 6 ドキュメント を 確 認 してください throw 文 で 例 外 をスローする 場 合 でも 例 外 処 理 を 行 うか メソッドの 宣 言 での 例 外 の 指 定 が 必 要 です 130

131 演 習 問 題 標 準 入 力 から 文 字 を 入 力 するプログラムを 作 成 して 実 行 し IOException をスローするような 操 作 を 行 って catch 文 の 処 理 が 実 行 されていることを 確 認 しなさい finally 文 を 記 述 し 例 外 がスローされた 場 合 およびスローされなかった 場 合 に finally 文 の 処 理 が 実 行 されていることを 確 認 しなさい 131

132 Chapter 16 入 出 力 処 理 ~その 1 [シラバス No. 07] 目 的 入 出 力 ストリームの 概 要 を 理 解 する java.io パッケージの 概 要 を 理 解 する 標 準 入 出 力 を 活 用 する 入 出 力 ストリームの 概 要 ストリームとは 入 出 力 処 理 とは 外 部 からデータを 受 け 取 ったり 外 部 へデータを 出 力 したりする 処 理 の ことです キーボードから 入 力 して 処 理 結 果 を 画 面 に 表 示 する ファイルからデータを 読 み 取 って 処 理 結 果 を 別 のファイルに 書 き 込 む ネットワークからデータを 受 信 して 処 理 結 果 をネットワークに 送 信 する などさまざまな 入 出 力 処 理 があります Java では 入 出 力 処 理 を ストリーム に 基 づいて 行 います ストリーム(stream)は 直 流 れ という 意 味 です つまり 媒 体 やデータの 種 類 に 関 係 なく データの 流 れに 対 し て 読 み 取 りや 書 き 込 みを 行 って 入 出 力 を 実 現 します 入 出 力 処 理 の 手 順 入 出 力 処 理 の 基 本 的 な 手 順 は 次 のとおりです 7. ストリームオブジェクトを 生 成 し ストリームをオープンする 8. ストリームオブジェクトに 対 し 読 み 取 りや 書 き 込 みを 行 う 9. ストリームをクローズする 入 出 力 を 行 う 対 象 はさまざまですが 基 本 的 な 手 順 は 変 わりません 対 象 に 適 した 入 出 力 ストリームとメソッドを 利 用 することで 簡 単 に 入 出 力 処 理 を 実 行 できます Java では ストリームを 大 きく 2 種 類 に 分 けています 1 つはバイト 単 位 で 入 出 力 を 行 うためのバイトストリームで もう 1 つは 文 字 単 位 で 入 出 力 を 行 うための 文 字 ストリーム です これらのストリームを 表 すクラスやインタフェースは java.io パッケージに 含 まれて います java.io パッケージの 概 要 java.io パッケージは 入 出 力 ストリームを 表 すクラスやインタフェース 入 出 力 に 関 す る 例 外 クラスなどを 提 供 しています java.io パッケージに 含 まれる 主 要 なクラスを 見 てい きましょう 132

133 InputStream クラス 入 力 バイトストリームを 表 す 抽 象 クラスです 入 力 バイトストリームはすべてこのクラ スを 継 承 します InputStream クラスでは 次 のようなメソッドを 提 供 しています int read() 入 力 ストリームから 次 のバイトを 読 み 取 って 返 します ストリームの 終 わりを 検 出 した 場 合 には-1 を 返 します int read(byte[] b) int read(byte[] b, int off, int len) 入 力 ストリームから 最 大 b.length バイトまたは len バイトを 読 み 取 り byte 型 配 列 b に 格 納 します off はバイトを 格 納 する byte 型 配 列 の 開 始 位 置 です 戻 り 値 は 読 み 取 ったバイ ト 数 ですが ストリームの 終 わりを 検 出 した 場 合 には-1 を 返 します void close() ストリームをクローズします InputStream クラスは 抽 象 クラスであるため 実 際 には 入 力 バイトストリームとして 次 のサブクラスのオブジェクトを 生 成 して 利 用 します クラス 説 明 FileInputStream ファイルからデータを 読 み 込 む ByteArrayInputStream バイト 配 列 からデータを 読 み 込 む SequenceInputStream 2 つの 入 力 バイトストリームを 連 結 する FilterInputStream 他 の 入 力 バイトストリームをラップし 追 加 機 能 を 提 供 する BufferedInputStream バッファ 付 きの 入 力 機 能 を 提 供 する(FilterInputStream クラス のサブクラス) DataInputStream データ 型 による 読 み 取 り 機 能 を 提 供 する(FilterInputStream ク ラスのサブクラス) OutputStream クラス 出 力 バイトストリームを 表 す 抽 象 クラスです 出 力 バイトストリームはすべてこのクラ スを 継 承 します OutputStream クラスでは 次 のようなメソッドを 提 供 しています 133

134 void write(int i) 指 定 されたバイトを 出 力 ストリームに 書 き 込 みます void write(byte[ ] b) void write(byte[ ] b, int off, int len) byte 型 配 列 b に 格 納 されている 最 大 b.length バイトまたは len バイトを 出 力 ストリーム に 書 き 込 みます off は 出 力 するバイトを 格 納 している byte 型 配 列 の 開 始 位 置 です void flush( ) 出 力 ストリームをフラッシュし バッファに 残 っているデータを 強 制 的 に 書 き 込 みます void close( ) 出 力 ストリームをクローズします InputStream クラスは 抽 象 クラスであるため 実 際 には 入 力 バイトストリームとして 次 のサブクラスのオブジェクトを 生 成 して 利 用 します クラス 説 明 FileOutputStream ファイルにデータを 書 き 込 む ByteArrayOutputStream バイト 配 列 にデータを 書 き 込 む PipedOutputStream パイプにより 入 力 ストリームと 連 結 する FilterOutputStream 他 の 出 力 バイトストリームをラップし 追 加 機 能 を 提 供 する BufferedOutputStream バッファ 付 きの 出 力 機 能 を 提 供 する(FilterOutputStream ク ラスのサブクラス) DataOutputStream データ 型 による 書 き 込 み 機 能 を 提 供 する(FilterOutputStream クラスのサブクラス) PrintStream データ 型 による 書 き 込 み 機 能 を 提 供 する(FilterOutputStream クラスのサブクラス) Reader クラス 入 力 文 字 ストリームを 表 す 抽 象 クラスです 入 力 文 字 ストリームはすべてこのクラスを 継 承 します Reader クラスでは 次 のようなメソッドを 提 供 しています int read( ) 134

135 入 力 ストリームから 次 の 1 文 字 を 読 み 取 って 返 します ストリームの 終 わりを 検 出 した 場 合 には-1 を 返 します int read(char[ ] c) int read(char[ ] c, int off, int len) 入 力 ストリームから 最 大 c.length 文 字 または len 文 字 を 読 み 取 り char 型 配 列 c に 格 納 します off は 文 字 を 格 納 する char 型 配 列 の 開 始 位 置 です 戻 り 値 は 読 み 取 った 文 字 数 です が ストリームの 終 わりを 検 出 した 場 合 には-1 を 返 します void close() ストリームをクローズします Reader クラスは 抽 象 クラスであるため 実 際 には 入 力 文 字 ストリームとして 次 のサブク ラスのオブジェクトを 生 成 して 利 用 します クラス 説 明 CharArrayReader 文 字 配 列 からデータを 読 み 取 る StringReader 文 字 列 からデータを 読 み 取 る BufferedReader バッファ 付 きの 入 力 機 能 を 提 供 する FilterReader 他 の 入 力 文 字 ストリームをラップし 追 加 機 能 を 提 供 する InputStreamReader バイトストリームと 文 字 ストリームの 仲 介 役 を 担 う FileReader ファイルからデータを 読 み 取 る(InputStreamReader クラスのサブ クラス) Writer クラス 出 力 文 字 ストリームを 表 す 抽 象 クラスです 出 力 文 字 ストリームはすべてこのクラスを 継 承 します Writer クラスでは 次 のようなメソッドを 提 供 しています void write(int c) 指 定 された 文 字 を 出 力 ストリームに 書 き 込 みます void write(char[ ] c) void write(char[ ] c, int off, int len) char 型 配 列 c に 格 納 されている 最 大 c.length 文 字 または len 文 字 を 出 力 ストリームに 書 き 込 みます off は 出 力 する 文 字 を 格 納 している char 型 配 列 の 開 始 位 置 です 135

136 void write(string s) 指 定 された 文 字 列 を 出 力 ストリームに 書 き 込 みます void write(string str, int off, int len) 文 字 列 s の 開 始 位 置 (off)から len 文 字 のデータを 出 力 ストリームに 書 き 込 みます void flush( ) 出 力 ストリームをフラッシュし バッファに 残 っているデータを 強 制 的 に 書 き 込 みます void close( ) 出 力 ストリームをクローズします Writer クラスは 抽 象 クラスであるため 実 際 には 出 力 文 字 ストリームとして 次 のサブク ラスのオブジェクトを 生 成 して 利 用 します クラス 説 明 FileWriter ファイルへデータを 書 き 込 む PrintWriter データ 型 および 書 式 化 による 書 き 込 み 機 能 を 提 供 する BufferedWriter バッファ 付 きの 出 力 機 能 を 提 供 する CharArrayWriter 文 字 配 列 へデータを 書 き 込 む StringWriter 文 字 列 へデータを 書 き 込 む FilterWriter 他 の 出 力 文 字 ストリームをラップし 追 加 機 能 を 提 供 する OutputStreamWriter 文 字 ストリームとバイトストリームの 仲 介 役 を 担 う 標 準 入 出 力 の 活 用 java.lang.system クラスの in フィールドは 標 準 入 力 (キーボード) out フィールドは 標 準 出 力 ( 画 面 )を 表 します public static final InputStream in public static final PrintStream out System.in フィールドは InputStream クラス 型 System.out フィールドは PrintStream クラス 型 で どちらもバイトストリームです しかし PrintStream クラスにはプリミテ ィブ 型 や 文 字 列 を 出 力 する print メソッドおよび 改 行 付 きで 出 力 する println メソッドがあ り 画 面 への 出 力 を 容 易 に 行 えます 一 方 InputStream クラスは 入 力 をバイト 単 位 で 行 136

137 うメソッドのみを 提 供 しています Chapter 15 では 標 準 入 力 から 1 バイトを 読 み 取 るサンプルプログラムを 作 成 しました ここでは 標 準 入 力 から 複 数 バイトを 読 み 取 るサンプルプログラムと 文 字 列 を 読 み 取 るサン プルプログラムを 作 成 します 標 準 入 力 からの 複 数 バイトの 読 み 取 り 標 準 入 力 から 複 数 バイトを 読 み 取 るには InputStream クラスの 次 のメソッドを 使 いま す int read(byte[] b) この read メソッドは 入 力 ストリームから 最 大 b.length バイトを 読 み 取 り 読 み 取 ったバ イト 数 を 返 します では サンプルプログラムを 見 てみましょう 01: import java.io.*; 02: 03: class StandardByteSample { 04: public static void main(string[] args) { 05: byte[] b = new byte[100]; 06: int cnt = 0; 07: 08: System.out.println(" 文 字 列 を 入 力 してください"); 09: 10: try { 11: // byte 型 配 列 に 複 数 バイトを 読 み 取 る 12: cnt = System.in.read(b); 13: // 読 み 取 ったバイト 数 から 改 行 文 字 のバイト 数 を 引 く 14: cnt -= (System.getProperty("line.separator")).length(); 15: // byte 型 配 列 から 文 字 列 を 取 得 して 出 力 する 16: System.out.println(" 入 力 された 文 字 列 : " + 17: new String(b, 0, cnt)); 18: } 19: catch(ioexception e) { 20: e.printstacktrace(); 21: return; 22: } 23: } 24: } 5 行 目 で 100 個 の 要 素 を 持 つ すなわち 100 バイトの byte 型 配 列 b を 確 保 しています 実 際 に 読 み 取 りを 行 っているのは 12 行 目 です read メソッドは 読 み 取 ったバイト 数 を 戻 り 値 として 返 します ただし このバイト 数 に は 入 力 の 終 わりを 示 す 改 行 文 字 のバイト 数 も 含 まれるため その 分 を cnt から 引 きます System クラスの getproperty メソッドは システムのプロパティを 表 す 文 字 列 を 返 します 137

138 取 得 します line.separator は 改 行 文 字 を 表 すプロパティです String クラスの length メソッドを 使 えば 改 行 文 字 のバイト 数 がわかります 17 行 目 は String クラスのコンストラクタを 使 って byte 型 配 列 b から 取 り 出 したバイ トを 文 字 列 に 変 換 しています コンストラクタには byte 型 配 列 開 始 位 置 (0) 取 り 出 すバイト 数 (cnt)を 指 定 します 実 行 結 果 は 次 のとおりです 文 字 列 を 入 力 してください あいうえお 入 力 された 文 字 列 : あいうえお 標 準 入 力 からの 文 字 列 の 読 み 取 り 標 準 入 力 から 入 力 したデータは 多 くの 場 合 文 字 列 として 扱 います であれば 最 初 から 文 字 列 として 読 み 取 るほうが 便 利 です そのためには InputStreamReader クラスと BufferedReader クラスを 使 います InputStreamReader クラスは 入 力 バイトストリームを 入 力 文 字 ストリームとして 扱 え るようにします 具 体 的 には コンストラクタに 標 準 入 力 を 指 定 して InputStreamReader クラスのオブジェクトを 生 成 します(9 行 目 ) BufferedReader クラスは 行 単 位 での 入 力 を 行 い それを 文 字 列 として 返 す readline メソッドを 定 義 しています BufferedReader クラスを 利 用 するには コンストラクタに 生 成 した InputStreamReader クラスのオブジェクトを 指 定 して BufferedReader クラスの オブジェクトを 生 成 します(11 行 目 ) 01: import java.io.*; 02: 03: class StandardStrSample { 04: public static void main(string[] args) { 05: String input = null; 06: System.out.println(" 文 字 列 を 入 力 してください"); 07: 08: // 標 準 入 力 を InputStreamReader でラップする 09: InputStreamReader sin = new InputStreamReader(System.in); 10: // さらに BufferedReader でラップする 11: BufferedReader in = new BufferedReader(sin); 12: try { 13: // 文 字 列 を 読 み 取 る 14: input = in.readline(); 15: System.out.println(" 入 力 された 文 字 列 : " + input); 16: } 17: catch(ioexception e) { 18: e.printstacktrace(); 19: return; 20: } 21: } 22: } 138

139 14 行 目 で BufferedReader クラスの readline メソッドを 使 って 標 準 入 力 から 文 字 列 を 読 み 取 っています 実 行 結 果 は StandardByteSample と 同 じです 入 出 力 処 理 では ストリームを 別 のストリームをラップする( 内 包 する)ことで さま ざまな 機 能 を 使 用 できるようにします 演 習 問 題 JDK 6 ドキュメントで java.io パッケージのストリームクラスの 仕 様 を 確 認 しなさい 標 準 入 力 から END という 文 字 列 が 入 力 されるまで 入 力 された 文 字 列 を 表 示 するプログラム を 作 成 しなさい 139

140 Chapter 17 入 出 力 処 理 ~その 2 [シラバス No. 07] 目 的 バイトストリームを 使 ったファイルの 入 出 力 を 理 解 する 文 字 ストリームを 使 ったファイルの 入 出 力 を 理 解 する バイトストリームを 使 ったファイルの 入 出 力 バイトストリームは 画 像 や 音 声 など 文 字 と 認 識 されないデータの 入 出 力 に 使 用 しま す ここでは バイトストリームを 使 ってファイルをコピーするサンプルプログラムを 作 ってみましょう サンプルプログラムの 処 理 の 手 順 このサンプルプログラムでは 次 の 手 順 で 処 理 を 行 います 10. コピー 元 のファイル 名 とコピー 先 のファイル 名 は 標 準 入 力 から 入 力 する 11. コピー 元 のファイル 名 から FileInputStream クラスのオブジェクトを 生 成 する 12. コピー 先 のファイル 名 から FileOutputStream クラスのオブジェクトを 生 成 する 13. FileInputStream オブジェクトから 1 バイトを 読 み 取 る 14. FileOutputStream オブジェクトに 読 み 取 った 1 バイトを 書 き 込 む と 5 の 手 順 を FileInputStream オブジェクトの 読 み 取 りの 結 果 が-1(ファイルの 終 わ り)になるまで 繰 り 返 す 16. FileInputStream オブジェクトと FileOutputStream オブジェクトをクローズする ファイル 名 の 入 力 ファイル 名 の 入 力 は Chapter 16 のサンプルプログラム StandardStrSample を 改 良 し 次 のクラスの static メソッドで 行 うようにします 01: import java.io.*; 02: 03: public class FileNameSample { 04: public static String inputfilename(string message) 05: throws IOException { 06: 07: System.out.println(message); 08: 09: // 標 準 入 力 を InputStreamReader でラップする 10: InputStreamReader sin = new InputStreamReader(System.in); 11: // さらに BufferedReader でラップする 12: BufferedReader in = new BufferedReader(sin); 140

141 13: return in.readline(); 14: } 15: } inputfilename メソッドは 引 数 として 受 け 取 った 文 字 列 を 画 面 に 表 示 し 標 準 入 力 か ら 入 力 された 文 字 列 を 戻 り 値 として 返 します 例 外 処 理 は 行 わずに throws IOException を 指 定 して 例 外 を 伝 播 しています FileInputStream クラスと FileOutputStream クラス FileInputStream クラスはファイルからバイト 単 位 で 読 み 取 りを 行 うためのバイトスト リームです 同 様 に FileOutputStream クラスはファイルへバイト 単 位 で 書 き 込 みを 行 う ために 使 います FileInputStream クラスと FileOutputStream クラスは それぞれファイル 名 を 受 け 取 るコンストラクタを 定 義 しています public FileInputStream(String name) throws FileNotFoundException public FileOutputStream(String name) throws FileNotFoundException こ れ ら の コ ン ス ト ラ ク タ を 使 っ て そ れ ぞ れ の オ ブ ジ ェ ク ト を 生 成 し ま す FileInputStream クラスのコンストラクタは 指 定 された 名 前 のファイルが 存 在 しないと きなどに FileNotFoundException をスローします FileOutputStream クラスのコンスト ラクタは ファイルが 存 在 しないときには 自 動 で 作 成 しますが 何 らかの 理 由 で 作 成 でき ない 場 合 などにこの 例 外 をスローします read メソッドと write メソッド FileInputStream オブジェクトからの 読 み 取 りは 次 の read メソッドで 行 います public int read() throws IOException FileOutputStream オブジェクトへの 書 き 込 みは 次 の write メソッドで 行 います public void write(int b) throws IOException close メソッド 処 理 の 終 了 後 close メソッドでストリームをクローズします コンストラクタやメソッ ドから 例 外 がスローされた 場 合 でもストリームがクローズされるように finally 文 を 使 用 します 141

142 サンプルプログラム 01: import java.io.*; 02: 03: public class CopyByteSample { 04: public static void main(string[] args) { 05: String inputname = null; // コピー 元 のファイル 名 06: String outputname = null; // コピー 先 のファイル 名 07: FileInputStream inobj = null; // 入 力 ストリーム 08: FileOutputStream outobj = null; // 出 力 ストリーム 09: int b = 0, cnt = 0; // コピーしたバイト 数 の 計 算 用 10: 11: try { 12: // ファイル 名 の 入 力 13: inputname = FileNameSample.inputFileName( 14: "コピー 元 のファイル 名 を 入 力 してください"); 15: outputname = FileNameSample.inputFileName( 16: "コピー 先 のファイル 名 を 入 力 してください"); 17: } 18: catch(ioexception e) { 19: e.printstacktrace(); 20: System.out.println("エラー:ファイル 名 の 入 力 "); 21: return; 22: } 23: 24: // ファイル 名 の 確 認 : 未 入 力 の 場 合 は 終 了 25: if (inputname.equals("") outputname.equals("")) { 26: System.out.println("ファイル 名 を 入 力 してください"); 27: return; 28: } 29: 30: try { 31: // ストリームオブジェクトの 生 成 32: inobj = new FileInputStream(inputName); 33: outobj = new FileOutputStream(outputName); 34: 35: // 読 み 取 りと 書 き 込 みのループ 36: while ((b = inobj.read())!= -1) { // 1 バイトを 読 み 取 る 37: outobj.write(b); // 1 バイトを 書 き 込 む 38: cnt++; // コピーしたバイト 数 の 計 算 39: } 40: } 41: catch (IOException e) { // 例 外 処 理 42: e.printstacktrace(); 43: System.out.println("エラー: 入 出 力 "); 44: return; 45: } 46: finally { // ストリームのクローズ 47: try { 48: if (inobj!= null) { 49: inobj.close(); 50: } 142

143 51: if (outobj!= null) { 52: outobj.close(); 53: } 54: } 55: catch (IOException e) { // 例 外 処 理 56: e.printstacktrace(); 57: System.out.println("エラー:クローズ"); 58: return; 59: } 60: } 61: System.out.println(" n コピー 完 了 "); 62: System.out.println("コピー 元 :" + inputname); 63: System.out.println("コピー 先 :" + outputname); 64: System.out.println("バイト 数 :" + cnt); 65: } 66: } 13 行 目 15 行 目 FileNameSample.inputFileName メソッドでコピー 元 とコピー 先 のファイル 名 を 入 力 し ます 18 行 目 FileNameSample.inputFileName メソッドが 例 外 をスローしたときにここで 捕 捉 します 25 行 目 コピー 元 とコピー 先 のファイル 名 が 入 力 されているかどうかを 確 認 します それぞれの ファイル 名 を 表 す inputname または outputname の 保 持 する 文 字 列 が 空 の 文 字 列 ( ) と 等 しい すなわちファイル 名 が 未 入 力 である 場 合 は 処 理 を 終 了 します 32 行 目 33 行 目 FileInputStream オブジェクト FileOutputStream オブジェクトを 生 成 します 36~39 行 目 1 バイトずつ 読 み 取 って 書 き 込 むループ 処 理 を 実 行 します このとき コピーしたバイト 数 をカウントします 41 行 目 各 クラスのコンストラクタ read メソッド write メソッドの 例 外 をここで 捕 捉 します 46~60 行 目 finally 文 でストリームをクローズします close メソッドも IOException をスローする 可 能 性 があるため try 文 を 使 います 実 行 結 果 Android.png をコピーしてみましょう 143

144 >java CopyByteSample コピー 元 のファイル 名 を 入 力 してください Android.png コピー 先 のファイル 名 を 入 力 してください AndroidCopy.png コピー 完 了 コピー 元 :Android.png コピー 先 :AndroidCopy.png バイト 数 :8288 ペイントなどのソフトウェアを 使 って コピー 元 とコピー 先 が 同 じ 画 像 であることを 確 認 しましょう サンプルプログラムの 改 良 のヒント CopyByteSample では 1 バイトずつ 入 出 力 を 行 っていました 次 のクラスとメソッドを 使 えば 複 数 バイトの 入 出 力 を 行 い さらに 処 理 の 効 率 が 良 くなります BufferedInputStream クラス public int read(byte[] b) throws IOException BufferedOutputStream クラス public int read(byte[] b) throws IOException BufferedInputStream クラスを 使 用 するには ファイル 名 を 指 定 して 生 成 した FileInputStream オブジェクトをコンストラクタに 指 定 してオブジェクトを 生 成 します BufferedOutputStream ク ラ ス も 同 様 に フ ァ イ ル 名 を 指 定 し て 生 成 し た FileOutputStream オブジェクトをコンストラクタに 指 定 してオブジェクトを 生 成 します BufferedInputStream クラスと BufferedOutputStream クラスは バッファを 利 用 する ことで 読 み 取 りや 書 き 込 みの 効 率 を 向 上 します そのため 書 き 込 み 時 にはストリームを クローズする 前 に flush メソッドでバッファ 内 のデータを 強 制 的 に 出 力 する 必 要 がありま す 文 字 ストリームを 使 ったファイルの 入 出 力 文 字 ストリームは Java のソースコートファイルなど 内 容 を 文 字 と 認 識 できるデータの 入 出 力 に 使 用 します ここでは 文 字 ストリームを 使 ってファイルをコピーするサンプル プログラムを 作 ってみましょう 144

145 サンプルプログラムの 処 理 の 手 順 このサンプルプログラムでは 次 の 手 順 で 処 理 を 行 います 17. コピー 元 のファイル 名 とコピー 先 のファイル 名 は 標 準 入 力 から 入 力 する 18. コピー 元 のファイル 名 から FileReader クラスのオブジェクトを 生 成 する 19. コピー 先 のファイル 名 から FileWriter クラスのオブジェクトを 生 成 する 20. FileReader オブジェクトから 1 文 字 を 読 み 取 る 21. FileWriter オブジェクトに 読 み 取 った 1 文 字 を 書 き 込 む と 5 の 手 順 を FileReader オブジェクトの 読 み 取 りの 結 果 が-1(ファイルの 終 わり)にな るまで 繰 り 返 す 23. FileReader オブジェクトと FileWriter オブジェクトをクローズする 使 用 するクラスが 違 うだけで バイトストリームの 場 合 の 手 順 と 同 じです ファイル 名 の 入 力 ファイル 名 の 入 力 は FileNameSample.inputFileName メソッドは 引 数 として 受 け 取 った 文 字 列 を 画 面 に 表 示 し 標 準 入 力 から 入 力 された 文 字 列 を 戻 り 値 として 返 します 例 外 処 理 は 行 わずに throws IOException を 指 定 して 例 外 を 伝 播 しています FileReader クラスと FileWriter クラス FileReader クラスはファイルから 文 字 単 位 で 読 み 取 りを 行 うための 文 字 ストリームです 同 様 に FileWriter クラスはファイルへ 文 字 単 位 で 書 き 込 みを 行 うために 使 います FileReader クラスと FileWriter クラスは それぞれファイル 名 を 受 け 取 るコンストラク タを 定 義 しています public FileReader(String name) throws FileNotFoundException public FileWriter(String name) throws FileNotFoundException これらのコンストラクタを 使 ってそれぞれのオブジェクトを 生 成 します FileReader ク ラ ス の コ ン ス ト ラ ク タ は 指 定 さ れ た 名 前 の フ ァ イ ル が 存 在 し な い と き な ど に FileNotFoundException をスローします FileWriter クラスのコンストラクタは ファイ ルが 存 在 しないときには 自 動 で 作 成 しますが 何 らかの 理 由 で 作 成 できない 場 合 などにこ の 例 外 をスローします read メソッドと write メソッド 145

146 FileReader オブジェクトからの 読 み 取 りは 次 の read メソッドで 行 います public int read() throws IOException FileWriter オブジェクトへの 書 き 込 みは 次 の write メソッドで 行 います public void write(int c) throws IOException close メソッド 処 理 の 終 了 後 close メソッドでストリームをクローズします コンストラクタやメソッ ドから 例 外 がスローされた 場 合 でもストリームがクローズされるように finally 文 を 使 用 します サンプルプログラム 01: import java.io.*; 02: 03: public class CopyCharSample { 04: public static void main(string[] args) { 05: String inputname = null; // コピー 元 のファイル 名 06: String outputname = null; // コピー 先 のファイル 名 07: FileReader inobj = null; // 入 力 ストリーム 08: FileWriter outobj = null; // 出 力 ストリーム 09: int b = 0, cnt = 0; // コピーしたバイト 数 の 計 算 用 10: 11: try { 12: // ファイル 名 の 入 力 13: inputname = FileNameSample.inputFileName( 14: "コピー 元 のファイル 名 を 入 力 してください"); 15: outputname = FileNameSample.inputFileName( 16: "コピー 先 のファイル 名 を 入 力 してください"); 17: } 18: catch(ioexception e) { 19: e.printstacktrace(); 20: System.out.println("エラー:ファイル 名 の 入 力 "); 21: return; 22: } 23: 24: // ファイル 名 の 確 認 : 未 入 力 の 場 合 は 終 了 25: if (inputname.equals("") outputname.equals("")) { 26: System.out.println("ファイル 名 を 入 力 してください"); 27: return; 28: } 29: 30: try { 31: // ストリームオブジェクトの 生 成 32: inobj = new FileReader(inputName); 146

147 33: outobj = new FileWriter(outputName); 34: 35: // 読 み 取 りと 書 き 込 みのループ 36: while ((b = inobj.read())!= -1) { // 1 文 字 を 読 み 取 る 37: outobj.write(b); // 1 文 字 を 書 き 込 む 38: cnt++; // コピーした 文 字 数 の 計 算 39: } 40: } 41: catch (IOException e) { // 例 外 処 理 42: e.printstacktrace(); 43: System.out.println("エラー: 入 出 力 "); 44: return; 45: } 46: finally { // ストリームのクローズ 47: try { 48: if (inobj!= null) { 49: inobj.close(); 50: } 51: if (outobj!= null) { 52: outobj.close(); 53: } 54: } 55: catch (IOException e) { // 例 外 処 理 56: e.printstacktrace(); 57: System.out.println("エラー:クローズ"); 58: return; 59: } 60: } 61: 62: System.out.println(" n コピー 完 了 "); 63: System.out.println("コピー 元 :" + inputname); 64: System.out.println("コピー 先 :" + outputname); 65: System.out.println(" 文 字 数 :" + cnt); 66: } 67: } このサンプルプログラムは 使 用 するクラスが FileReader クラスと FileWriter クラスで あることと 表 示 するメッセージが 違 うことを 除 けば CopyByteSample とほぼ 同 じです このように 入 出 力 処 理 では 選 択 するストリームが 異 なるだけで ほぼ 同 じ 手 順 で 処 理 を 記 述 できます 実 行 結 果 CopyCharSample.java をコピーしてみましょう >java CopyCharSample コピー 元 のファイル 名 を 入 力 してください CopyCharSample.java コピー 先 のファイル 名 を 入 力 してください CopyCharSample_Copy.java 147

148 コピー 完 了 コピー 元 :CopyCharSample.java コピー 先 :CopyCharSample_Copy.java 文 字 数 :2126 サンプルプログラムの 改 良 のヒント CopyCharSample では 1 文 字 ずつ 入 出 力 を 行 っていました 次 のクラスとメソッドを 使 えば 行 単 位 の 入 出 力 を 行 い さらに 処 理 の 効 率 が 良 くなります BufferedReader クラス public void println(string x) throws IOException PrintWriter クラス public void println(string x) throws IOException BufferedReader クラスを 使 用 するには ファイル 名 を 指 定 して 生 成 した FileReader オ ブジェクトをコンストラクタに 指 定 してオブジェクトを 生 成 します PrintWriter クラスを 使 用 するには ファイル 名 を 指 定 して 生 成 した FileWriter オブジェクトをコンストラクタ に 指 定 して BufferedWriter クラスのオブジェクトを 生 成 します このオブジェクトを PrintWriter クラスのコンストラクタに 指 定 してオブジェクトを 生 成 します BufferedReader クラスと BufferedWriter クラスは バッファを 利 用 することで 読 み 取 りや 書 き 込 みの 効 率 を 向 上 します そのため 書 き 込 み 時 にはストリームをクローズする 前 に flush メソッドでバッファ 内 のデータを 強 制 的 に 出 力 する 必 要 があります 演 習 問 題 サ ン プ ル プ ロ グ ラ ム の 改 良 の ヒ ン ト を も と に BufferedInputStream ク ラ ス と BufferedOutputStream クラスを 使 ってバイト 単 位 でのコピーを 行 うプログラムを 作 りなさい サンプルプログラムの 改 良 のヒントをもとに BufferedReader クラスと PrintWriter クラス(および BufferedWriter クラス)を 使 って 行 単 位 でのコピーを 行 うプログラムを 作 りなさい 148

149 Chapter 18 GUI プログラミング~その 1 [シラバス No. 08] 目 的 Java の GUI プログラミングの 概 要 を 理 解 する フレームを 表 示 し ボタンとラベルを 配 置 する Java の GUI プログラミングの 概 要 テキストや 画 像 を 表 示 したり ボタンやメニューなどのクリックに 応 じて 処 理 を 行 うこ とを GUI(Graphical User Interface)プログラミングといいます Java アプリケーショ ンでは GUI プログラミングに Swing というツールキットを 使 います GUI プログラミングの 用 語 最 初 に GUI プログラミングで 用 いる 基 本 的 な 用 語 を 理 解 してください コンポーネント 画 面 を 構 成 する UI 部 品 (java.awt.component クラスのサブクラス)のことです コンテナ コンポーネントを 配 置 できる UI 部 品 (java.awt.container クラスのサブクラス)のこと です レイアウトマネージャ コンテナへのコンポーネントの 配 置 方 法 を 制 御 するオブジェクトのことです イベント マウスによるクリックなどの 操 作 を 表 すオブジェクトのことです イベントリスナー 発 生 したイベントを 捕 捉 して 処 理 を 行 うためのオブジェクトのことです イベント 処 理 特 定 のイベントの 発 生 に 応 じて 何 らかの 処 理 を 行 うことを 指 します Swing と AWT Swing は GUI プログラミングに 必 要 な 機 能 を javax.swing パッケージとそのサブパッ 149

150 ケージにより 提 供 します Swing が 提 供 するコンポーネントは JComponent クラスのサ ブクラスです( 例 外 もあります) JComponent クラスは java.awtパッケージの Component クラスと Container クラスのサブクラスです したがって JComponent クラスとそのサ ブクラスは UI 部 品 を 表 すコンポーネントですが 同 時 に 他 のコンポーネントを 配 置 できる コンテナでもあります java.awt パッケージは AWT が 提 供 するパッケージです AWT も GUI プログラミング 用 のツールキットで Java 1.0 で 導 入 されました しかし コンポーネントの 種 類 が 少 な く 動 作 が 遅 いために AWT を 拡 張 した Swing が JDK 1.2 で 導 入 されました Swing の 機 能 は AWT をベースとしているため コンテナ レイアウトマネージャ イベ ント 処 理 などを 扱 う 際 には javax.swing パッケージおよび java.awt パッケージとそのサ ブパッケージのクラスやインタフェースが 必 要 になります Swing の 主 なコンポーネント javax.swing パッケージには 次 のようなコンポーネントが 含 まれています いずれも JComponent のサブクラスになります クラス JLabel JButton JTextField JPasswordField JTextArea JCheckbox JRadioButton JMenu JMenuBar JMenuItem 説 明 テキストや 画 像 を 表 示 するラベル ボタン 1 行 のテキストフィールド パスワード 用 のテキストフィールド 複 数 行 のテキスト 領 域 チェックボックス ラジオボタン メニュー メニューバー メニューアイテム また 次 のコンポーネントは java.awt パッケージのクラスを 継 承 しています これら のコンポーネントは 特 別 にトップレベルコンテナと 呼 ばれます クラス JFrame JWindow JDialog 説 明 Frame クラスを 継 承 する タイトルや 操 作 ボタンを 持 つフレーム Window クラスを 継 承 する タイトルや 操 作 ボタンを 持 たないウィンドウ Dialog クラスを 継 承 する フレームから 表 示 されるダイアログ 150

151 18-02 フレーム ラベル ボタンの 表 示 ユーザ 画 面 を 構 築 するには まず 土 台 となるコンテナを 用 意 し そこにラベルやボタン などを 配 置 していきます コンテナにはフレームを 表 す JFrame クラスやウィンドウを 表 す JWindow クラスを 利 用 します フレームの 表 示 フレームとは タイトル 全 画 面 表 示 やクローズなどのボタンを 持 つウィンドウのこと です フレームの 表 示 は 次 の 手 順 で 行 います 24. JFrame クラスのコンストラクタを 呼 び 出 して JFrame クラスのオブジェクトを 生 成 する 25. 生 成 したオブジェクトにサイズなどを 設 定 する 26. JFrame オブジェクトの setvisible メソッドを 呼 び 出 し フレームを 表 示 状 態 にする JFrame クラスは 次 のようなコンストラクタを 提 供 しています public JFrame() public JFrame(String title) 初 期 状 態 で 非 表 示 のフレームを 表 すオブジェクトを 生 成 します 文 字 列 を 指 定 すると タイトルに 設 定 されます 生 成 したオブジェクトに 対 して 次 のメソッドにより 設 定 を 行 います public void setsize(int width, int height) フレームのサイズ( 幅 と 高 さ)を 設 定 します java.awt.window クラスから 継 承 したメ ソッドです public void setdefaultcloseoperation(int op) 右 上 の[ ]ボタンをクリックしたときの 操 作 を 設 定 します 引 数 には WindowConstants インタフェースの 定 数 を 指 定 できます EXIT_ON_CLOSE のみ JFrame クラスで 定 義 され ています 定 数 説 明 DO_NOTHING_ON_CLOSE 処 理 を 何 も 行 わない HIDE_ON_CLOSE 登 録 されている WindowListener オブジェクトを 呼 び 出 した 後 フ レームを 隠 す(デフォルト) DISPOSE_ON_CLOSE 登 録 されている WindowListener オブジェクトを 呼 び 出 した 後 フ 151

152 EXIT_ON_CLOSE レームを 隠 す(デフォルト) アプリケーションを 終 了 する 最 後 に 次 のメソッドでフレームを 表 示 します public void setvisible(boolean b) true を 指 定 すると 表 示 され false を 指 定 すると 非 表 示 になります 01: import javax.swing.*; 02: 03: class JFrameSample { 04: public static void main(string[] args) { 05: // JFrame クラスのオブジェクトを 生 成 する 06: JFrame frame = new JFrame("Java for Android"); 07: // サイズを 設 定 する 08: frame.setsize(400, 300); 09: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 10: frame.setdefaultcloseoperation(jframe.exit_on_close); 11: // フレームを 表 示 する 12: frame.setvisible(true); 13: } 14: } このサンプルプログラムを 実 行 すると 次 のようなフレームが 表 示 されます [ ]ボタ ンをクリックすると フレームが 閉 じられ アプリケーションが 終 了 します コンポーネントの 配 置 方 法 フレームにコンポーネントを 配 置 する 手 順 は 次 のとおりです 152

153 27. JFrame クラスのコンストラクタを 呼 び 出 し オブジェクトを 生 成 する 28. 生 成 したオブジェクトにサイズなどを 設 定 する 29. 配 置 するコンポーネントのコンストラクタを 呼 び 出 し オブジェクトを 生 成 する 30. JFrame クラスのの add メソッドで 生 成 したコンポーネントのオブジェクトをフレームに 配 置 する 31. JFrame オブジェクトの setvisible メソッドを 呼 び 出 し フレームを 表 示 状 態 にする ラベルの 配 置 ラベルは 文 字 列 や 画 像 を 表 示 するコンポーネントで JLabel クラスによって 表 されます JLabel クラスには 次 のようなコンストラクタがあります public JLabel() public JLabel(String text) public JLabel(Icon image) 指 定 された 文 字 列 または 画 像 を 持 つラベルオブジェクトを 生 成 します 何 も 指 定 しない と 文 字 列 も 画 像 も 持 たないオブジェクトが 生 成 されます 画 像 を 指 定 する 場 合 には javax.swing.imageicon クラスを 使 用 します ImageIcon クラ スは javax.swing.icon インタフェースを 実 装 しているため JLabel クラスのコンストラク タに 引 数 として 渡 すことができます JLabel クラスのオブジェクトを 生 成 したら JFrame クラスの add メソッドでフレーム に 配 置 します public Component add(component c) public Component add(component c, int index) Component クラス 型 の 引 数 c は 配 置 するコンポ ネント int 型 の 引 数 index はコンテ ナ 内 の 位 置 を 示 すインデックスです 戻 り 値 として 配 置 したコンポーネントを 返 します 次 のサンプルプラグラムでは JLabel(Icon image)と add(component c)を 使 って 画 像 (Android.png)を 持 つラベルをフレームに 配 置 します 01: import javax.swing.*; 02: 03: class JLabelSample { 04: public static void main(string[] args) { 05: // JFrame クラスのオブジェクトを 生 成 する 06: JFrame frame = new JFrame("Java for Android"); 07: // サイズを 設 定 する 08: frame.setsize(400, 300); 153

154 09: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 10: frame.setdefaultcloseoperation(jframe.exit_on_close); 11: // JLabel クラスのオブジェクトを 生 成 する 12: JLabel label = new JLabel(new ImageIcon("Android.png")); 13: // add メソッドでラベルを 配 置 する 14: frame.add(label); 15: // フレームを 表 示 する 16: frame.setvisible(true); 17: } 18: } ラベルに 画 像 を 表 示 する 場 合 ImageIcon クラスのコンストラクタに 画 像 のファイル 名 を 指 定 してオブジェクトを 生 成 し それを JLabel クラスのコンストラクタに 指 定 します 実 行 結 果 は 次 のとおりです 画 像 を 持 つラベルは フレームと 同 じサイズまで 広 がって 配 置 されます ボタンの 配 置 最 もよく 使 うボタンは [OK]や[キャンセル]などのプッシュボタンです プッシュ ボタンは JButton クラスで 表 されます その 他 にもチェックボックス(JCheckBox クラス) やラジオボタン(JRadioButton クラス)などがあります JButton クラスには 次 のようなコンストラクタがあります public JButton() public JButton(String text) public JButton(Icon icon) public JButton(String text, Icon icon) 154

155 指 定 された 文 字 列 または 画 像 (または 両 方 )を 持 つボタンオブジェクトを 生 成 します 何 も 指 定 しないと 文 字 列 も 画 像 も 持 たないオブジェクトが 生 成 されます 画 像 を 指 定 する 場 合 には javax.swing.imageicon クラスを 使 用 します JButton(Icon icon)と add(component c)を 使 って 画 像 (Android.png)を 持 つボタンを フレームに 配 置 するサンプルプロジェクトを 作 成 します 01: import javax.swing.*; 02: 03: class JButtonSample { 04: public static void main(string[] args) { 05: // JFrame クラスのオブジェクトを 生 成 する 06: JFrame frame = new JFrame("Java for Android"); 07: // サイズを 設 定 する 08: frame.setsize(400, 300); 09: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 10: frame.setdefaultcloseoperation(jframe.exit_on_close); 11: // JLabel クラスのオブジェクトを 生 成 する 12: JButton button = new JButton(new ImageIcon("Android.png")); 13: // add メソッドでラベルを 配 置 する 14: frame.add(button); 15: // フレームを 表 示 する 16: frame.setvisible(true); 17: } 18: } JLabel クラスが JButton クラスに 変 わっただけで ほぼ 同 じです 実 行 結 果 は 次 のよう になります 一 見 ラベルのようですが クリックすればボタンであることがわかります ボタンもフ レームと 同 様 に フレームいっぱいに 広 がって 配 置 されます コンポーネントをフレーム 155

156 にどのように 配 置 するかはレイアウトマネージャを 使 って 制 御 します 演 習 問 題 JLabel クラスの JLabel(String text, Icon icon, int horizontalalignment)というコンストラクタを 使 っ て 文 字 列 と 画 像 を 持 つラベルをフレームに 配 置 するプログラムを 作 りなさい JButton クラスの JButton(String text, Icon icon)というコンストラクタを 使 って 文 字 列 と 画 像 を 持 つボタンをフレームに 配 置 するプログラムを 作 りなさい チェックボックスやラジオボタンなどをフレームに 配 置 するプログラムを 作 りなさい 156

157 Chapter 19 GUI プログラミング~その 2 [シラバス No. 08] 目 的 レイアウトマネージャの 概 要 を 理 解 する BorderLayout FlowLayout GridLayout を 利 用 する レイアウトマネージャの 概 要 複 数 のコンポーネントの 配 置 Chapter 18 のサンプルプログラムを 応 用 して 文 字 列 を 持 つラベルと 画 像 を 持 つボタン をフレームに 配 置 してみましょう 次 のように 単 純 に 両 方 のオブジェクトを 生 成 してフ レームに 配 置 します // JLabel クラスのオブジェクトを 生 成 する JLabel label = new JLabel("This is Android"); // add メソッドでラベルを 配 置 する frame.add(label); // JButton クラスのオブジェクトを 生 成 する JButton button = new JButton(new ImageIcon("Android.png")); // add メソッドでボタンを 配 置 する frame.add(button); しかし 実 行 すると 画 像 を 持 つボタンだけが 表 示 され 文 字 列 を 持 つテキストは 表 示 されません これは 位 置 を 指 定 しないと コンポーネントはフレームの 中 央 にフレームのサイズい っぱいに 広 げられて 配 置 されるようになっているからです ラベルもボタンも 位 置 をして 157

158 いないため ラベルが 中 央 に 配 置 された 後 にボタンが 上 書 きする 形 で 配 置 され このよう な 実 行 結 果 になります コンポーネントをコンテナにどう 配 置 するかを 制 御 するには レイアウトマネージャで 制 御 します レイアウトマネージャの 種 類 レイアウトマネージャは java.awt パッケージで 定 義 されています 主 なレイアウトマネ ージャは 次 のとおりです クラス BorderLayout FlowLayout GridLayout 説 明 コンテナの 上 (NORTH) 下 (SOUTH) 中 央 (CENTER) 左 (WEST) 右 (EAST) にコンポーネントを 1 つずつ 配 置 する コンテナにコンポーネントを 左 から 右 へ(またはその 逆 に) 順 番 に 配 置 す る コンテナにコンポーネントを 行 列 の 形 式 で 配 置 する レイアウトマネージャの 利 用 レイアウトマネージャは 次 のように 利 用 します 32. レイアウトマネージャのコンストラクタを 呼 び 出 し オブジェクトを 生 成 する 33. コンテナの setlayout メソッドで レイアウトマネージャのオブジェクトをコンテナに 設 定 す る 34. コンポーネントのオブジェクトを 生 成 し コンテナの add メソッドで 配 置 する このとき 必 要 に 応 じて 配 置 位 置 などを 指 定 する コンテナによってデフォルトのレイアウトマネージャが 決 まっています そのため デ フォルトのレイアウトマネージャを 利 用 する 場 合 には 1 と 2 の 手 順 は 不 要 です BorderLayout コンテナの 上 下 左 右 中 央 の 5 ヵ 所 にコンポーネントを 配 置 するレイアウトマネ ージャです JFrame クラスでは デフォルトで BorderLayout を 利 用 します そのため 次 のように 位 置 を 指 定 しないと 中 央 に 配 置 されます frame.add(button); BorderLayout クラスは 次 のコンストラクタを 提 供 しています 158

159 public BorderLayout() 間 隔 を 置 かずにコンポーネントを 配 置 する BorderLayout オブジェクトを 生 成 します public BorderLayout(int h, int v) 水 平 方 向 に h 垂 直 方 向 に v だけ 間 隔 を 置 いてコンポーネントを 配 置 する BorderLayout オブジェクトを 生 成 します JFrame クラスでは デフォルトで 間 隔 を 置 かずに 配 置 する BorderLayout が 使 用 されま す( 左 側 ) 間 隔 を 置 いて 配 置 したい 場 合 には 間 隔 を 指 定 して 生 成 した BorderLayout オ ブジェクトを setlayout メソッドで 設 定 します 右 側 は 水 平 方 向 と 垂 直 方 向 の 間 隔 に 10 を 指 定 した 例 です public void add(component c, Object o) コンポーネントを 配 置 する 際 に Object クラス 型 の 制 約 オブジェクトを 指 定 します BorderLayout を 利 用 する 場 合 制 約 オブジェクトとして BorderLayout クラスの 次 の 定 数 を 指 定 できます 定 数 BorderLayout.NORTH BorderLayout.SOUTH BorderLayout.WEST BorderLayout.EAST BorderLayout.CENTER 説 明 コンポーネントをコンテナの 上 端 に 配 置 する コンポーネントをコンテナの 下 端 に 配 置 する コンポーネントをコンテナの 左 端 に 配 置 する コンポーネントをコンテナの 右 端 に 配 置 する コンポーネントをコンテナの 中 央 に 配 置 する(デフォルト) では フレームの 上 にラベルを 中 央 にボタンを 配 置 するサンプルプログラムを 作 って みましょう 159

160 01: import java.awt.*; 02: import javax.swing.*; 03: 04: class BorderLayoutSample { 05: public static void main(string[] args) { 06: // JFrame クラスのオブジェクトを 生 成 する 07: JFrame frame = new JFrame("Java for Android"); 08: // サイズを 設 定 する 09: frame.setsize(400, 300); 10: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 11: frame.setdefaultcloseoperation(jframe.exit_on_close); 12: // ラベルを 生 成 して 配 置 する 13: JLabel label = new JLabel("ラベル"); 14: frame.add(label, BorderLayout.NORTH); 15: // ボタンを 生 成 して 配 置 する 16: JButton button = new JButton(new ImageIcon("Android.png")); 17: frame.add(button, BorderLayout.CENTER); 18: 19: // フレームを 表 示 する 20: frame.setvisible(true); 21: } 22: } 実 行 結 果 は 次 のとおりです 上 または 下 に 配 置 したコンポーネントは 左 または 右 にコンポーネントが 配 置 されてい ない 場 合 に 水 平 方 向 にサイズが 調 整 されます 左 または 右 に 配 置 したコンポーネントは 上 または 下 にコンポーネントが 配 置 されていない 場 合 に 垂 直 方 向 にサイズが 調 整 されま す 中 央 に 配 置 されたコンポーネントは 他 の 場 所 にコンポーネントが 配 置 されていない 場 合 に 水 平 方 向 垂 直 方 向 にサイズが 調 整 されます 160

161 FlowLayout コンポーネントを 水 平 方 向 に 左 から 右 (または 右 から 左 )に 順 番 に 配 置 するレイアウト マネージャです FlowLayout クラスは 次 のようなコンストラクタを 提 供 しています public FlowLayout() デフォルトの 間 隔 中 央 揃 えで 配 置 する FlowLayout オブジェクトを 生 成 します public FlowLayout(int align) デフォルトの 間 隔 指 定 された align で 配 置 する FlowLayout オブジェクトを 生 成 します public FlowLayout(int align, int h, int v) 指 定 された align 指 定 された 間 隔 で 配 置 する FlowLayout オブジェクトを 生 成 します align には FlowLayout クラスの 定 数 を 指 定 できます 定 数 FlowLayout.LEFT FlowLayout.RIGHT FlowLayout.CENTER 左 揃 え 右 揃 え 中 央 揃 え 説 明 FlowLayout の 場 合 add メソッドにはコンポーネントだけを 指 定 します では 文 字 列 を 持 つボタンを 3 つ 左 揃 えで 配 置 するサンプルプログラムを 作 成 してみ ましょう 01: import java.awt.*; 02: import javax.swing.*; 03: 04: class FlowLayoutSample { 05: public static void main(string[] args) { 06: // JFrame クラスのオブジェクトを 生 成 する 07: JFrame frame = new JFrame("Java for Android"); 08: // サイズを 設 定 する 09: frame.setsize(400, 300); 10: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 11: frame.setdefaultcloseoperation(jframe.exit_on_close); 12: // FlowLayout クラスのオブジェクトを 生 成 する 13: FlowLayout flow = new FlowLayout(FlowLayout.LEFT); 14: // FlowLayout クラスのオブジェクトをフレームに 設 定 する 15: frame.setlayout(flow); 16: 17: // ボタンを 生 成 して 配 置 する 18: frame.add(new JButton("ボタン 1")); 161

162 19: frame.add(new JButton("ボタン 2")); 20: frame.add(new JButton("ボタン 3")); 21: // フレームの 表 示 22: frame.setvisible(true); 23: } 24: } 実 行 結 果 は 次 のとおりです GridLayout コンテナにコンポーネントを 行 列 の 形 式 で 配 置 します GridLayout 次 のコンストラ クタを 提 供 しています public GridLayout() 1 行 1 列 でコンポーネントを 配 置 する GridLayout クラスのオブジェクトを 生 成 します public GridLayout(int rows, int cols) rows 行 cols 列 でコンポーネントを 配 置 する GridLayout クラスのオブジェクトを 生 成 します public GridLayout(int rows, int cols, int h, int v) rows 行 cols 列 水 平 方 向 の 間 隔 h 垂 直 方 向 の 間 隔 v でコンポーネントを 配 置 する GridLayout クラスのオブジェクトを 生 成 します add メソッドにはコンポーネントだけを 指 定 します 配 置 されるコンポーネントはすべて 同 じサイズに 調 整 されます 行 数 と 列 数 を 指 定 する 162

163 場 合 どちらかを 0 にすると 任 意 の 行 数 1 列 または 1 行 任 意 の 列 数 でコンポーネント を 配 置 できます では 2 行 3 列 でボタンを 配 置 するサンプルプログラムを 作 成 してみましょう 01: import java.awt.*; 02: import javax.swing.*; 03: 04: class GridLayoutSample { 05: public static void main(string[] args) { 06: // JFrame クラスのオブジェクトを 生 成 する 07: JFrame frame = new JFrame("Java for Android"); 08: // サイズを 設 定 する 09: frame.setsize(400, 300); 10: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 11: frame.setdefaultcloseoperation(jframe.exit_on_close); 12: // GridLayout クラスのオブジェクトを 生 成 する 13: GridLayout grid = new GridLayout(2, 3); 14: // GridLayout クラスのオブジェクトをフレームに 設 定 する 15: frame.setlayout(grid); 16: 17: JButton button; 18: int i = 0; 19: // ボタンを 生 成 して 配 置 する 20: while (i < 6) { 21: button = new JButton("ボタン" + ++i); 22: frame.add(button); 23: } 24: // フレームを 表 示 する 25: frame.setvisible(true); 26: } 27: } 実 行 結 果 は 次 のとおりです 163

164 メモ GridLayout クラスでは コンストラクタに 指 定 した 行 数 や 列 数 よりも 実 際 に 配 置 したコンポーネン トの 数 が 優 先 されます たとえば コンストラクタに 2( 行 )と 3( 列 )を 指 定 しても 実 際 にはコンポ ーネントを 4 つしか 追 加 しないと 2 行 2 列 で 配 置 され サイズが 調 整 されます パネルの 活 用 たとえば フレームの 上 部 にラベル 中 央 にボタンを 3 つ 並 べたい 場 合 があります し かし BorderLayout クラスでは 各 領 域 にコンポーネントを 1 つしか 配 置 できません このような 場 合 パネルを 活 用 します パネルにボタンを 3 つ 配 置 し その 後 にパネル をフレームの 中 央 に 配 置 します パネルは JPanel クラスによって 表 されます また JPanel クラスでは FlowLayout ク ラスがデフォルトのレイアウトマネージャになります パネルを 使 って フレームの 上 部 にラベル 中 央 にボタンを 3 つ 配 置 するサンプルプロ グラムを 作 成 してみましょう 01: import java.awt.*; 02: import javax.swing.*; 03: 04: class PanelSample { 05: public static void main(string[] args) { 06: // JFrame クラスのオブジェクトを 生 成 する 07: JFrame frame = new JFrame("Java for Android"); 08: // サイズを 設 定 する 09: frame.setsize(400, 300); 10: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 11: frame.setdefaultcloseoperation(jframe.exit_on_close); 164

165 12: // JPanel クラスのオブジェクトを 生 成 する 13: JPanel panel = new JPanel(); 14: // ボタンを 生 成 してパネルに 配 置 する 15: panel.add(new JButton("ボタン 1")); 16: panel.add(new JButton("ボタン 2")); 17: panel.add(new JButton("ボタン 3")); 18: // パネルをフレームに 配 置 する 19: frame.add(panel, BorderLayout.CENTER); 20: // ラベルを 生 成 してフレームに 配 置 する 21: JLabel label = new JLabel("ラベル"); 22: frame.add(label, BorderLayout.NORTH); 23: // フレームを 表 示 する 24: frame.setvisible(true); 25: } 26: } 10 行 目 で JPanel クラスのオブジェクトを 生 成 し 12~14 行 目 で add メソッドによりボ タンをパネルに 配 置 しています 16 行 目 でパネルをフレームに 配 置 しています 実 行 結 果 は 次 のとおりです 演 習 問 題 BorderLayout を 使 って フレームの 上 下 左 右 中 央 に それぞれの 位 置 を 示 す 文 字 列 のラ ベルを 配 置 するプログラムを 作 成 しなさい FlowLayout を 使 って 複 数 のボタンを 中 央 揃 えまたは 右 揃 えに 配 置 するプログラムを 作 成 しなさ い GridLayout クラスを 使 って 1 行 3 列 3 行 1 列 3 行 3 列 にボタンを 配 置 するプログラムを 作 成 しなさい 165

166 Chapter 20 GUI プログラミング~その 3 [シラバス No. 8] 目 的 イベント 処 理 の 概 要 を 理 解 する イベントリスナーとイベントハンドラメソッドを 利 用 する イベント 処 理 とは Chapter 18 や Chapter 19 では フレームにボタンを 配 置 するサンプルプログラムを 作 成 しました しかし これらのサンプルプログラムを 実 行 し ボタンをクリックしても 何 も 起 こりません これは イベント 処 理 を 行 っていないからです ボタンのクリックなどに 応 じて 何 かを 実 行 したい 場 合 には イベント 処 理 が 必 要 です イベント 処 理 では イベントの 発 生 元 になるコンポーネント(ボタンなど)にあらかじめ イベントリスナーを 登 録 します イベント(ボタンのクリックなど)が 発 生 すると イベ ントリスナーのイベントハンドラメソッドが 呼 び 出 されます そのため イベントが 発 生 したときに 実 行 する 処 理 をイベントハンドラメソッドに 記 述 します イベントとイベントリスナーの 種 類 ボタンのクリックなどのイベントは java.lang.eventobject クラスのサブクラスになり ます また イベントリスナーは java.lang.eventlistenereventlistener インタフェー スを 継 承 します イベントとイベントリスナーは java.awt.event パッケージと javax.swing.event パッケ ージで 定 義 されています java.awt.event パッケージの 基 本 的 なイベントとイベントリス ナーを 次 に 示 します ActionEvent クラス/ActionListener インタフェース ActionEvent クラスはボタンのクリックなどを 表 します ActionEvent が 発 生 すると ActionListener インタフェースの actionperformed メソッドが 呼 び 出 されます 実 装 した ActionListener は AbstractButton クラス(JButton クラスのスーパークラス) などの addactionlistener メソッドでコンポーネントに 追 加 します MouseEvent クラス/MouseListener インタフェース MouseEvent クラスはマウスの 操 作 に 関 連 するイベントを 表 します マウスのクリック マウスを 押 す 放 す マウスがコンポーネントの 領 域 に 入 る 領 域 から 出 るといったイベ ントが 発 生 すると MouseListener イ ンタフェースのイベントハンドラメソッド (mouseclicked mousepressed mousereleased mouseentered mouseexited)が 呼 166

167 び 出 されます 実 装 した MouseListener は java.awt.component クラス(すべてのコンポーネントの スーパークラス)の addmouselistener メソッドでコンポーネントに 追 加 します MouseEvent クラス/MouseMotionListener インタフェース MouseEvent クラスはマウスの 操 作 を 表 しますが マウスのドラッグや 移 動 が 行 われる と MouseMotionListener インタフェースのイベントハンドラメソッド(mouseDragged mousemoved)が 呼 び 出 されます 実 装 し た MouseMotionListener は java.awt.component ク ラ ス の addmousemotionlistener メソッドでコンポーネントに 追 加 します ItemEvent クラス/ItemListener インタフェース ItemEvent クラスはチェックボックスやリストなどでの 項 目 の 選 択 などを 表 します ItemEvent が 発 生 すると ItemListener インタフェースの itemselected メソッドが 呼 び 出 されます 実 装 した ItemListener は AbstractButton クラス(JCheckBox クラスのスーパークラ ス)などの additemlistener メソッドでコンポーネントに 追 加 します KeyEvent クラス/KeyListener インタフェース KeyEvent クラスはキーの 入 力 を 表 します キーを 押 す 離 す キーを 入 力 すると KeyListener インタフェースのイベントハンドラメソッド(keyPressed keyreleased keytyped)メソッドが 呼 び 出 されます 実 装 した KeyListener は javax.swing.text.jtextcomponent クラス(JTextField クラ スと JTextArea クラスのスーパークラス)の addkeylistener メソッドでコンポーネント に 追 加 します イベントリスナーとイベントハンドラメソッドの 利 用 では イベント 処 理 を 行 ってみましょう ここでは ボタンがクリックされたらボタン にクリックされた 回 数 を 表 示 するサンプルプログラムを 作 成 します 使 用 するクラスとイ ンタフェースは 次 のとおりです 発 生 するイベント:ActionEvent クラス(ボタンのクリック) 使 用 するイベントリスナー:ActionListener インタフェース イベントハンドラメソッド:actionPerformed メソッド イ ベ ン ト リ ス ナ ー を 登 録 す る メ ソ ッ ド : JButton ク ラ ス の addactionlistener メ ソ ッ ド (AbstractButton クラスから 継 承 ) 167

168 イベント 処 理 の 手 順 イベント 処 理 は 次 の 手 順 で 行 います 35. ActionListener インタフェースを 実 装 するクラスを 定 義 する 36. actionperformed メソッドで JButton クラスの settext メソッドを 呼 び 出 し クリックされた 回 数 を 表 す 文 字 列 を 設 定 する 37. フレームとボタンを 生 成 し ボタンをフレームに 配 置 する 38. JButton クラスの addactionlistener メソッドで 1 で 作 成 したクラスのオブジェクトをボタ ンに 登 録 する 39. フレームを 表 示 する 01: import java.awt.*; 02: import java.awt.event.*; 03: import javax.swing.*; 04: 05: class ActionEventSample implements ActionListener { 06: private static JButton button; 07: private static int cnt = 0; 08: 09: public static void main(string[] args) { 10: // JFrame クラスのオブジェクトを 生 成 する 11: JFrame frame = new JFrame("Java for Android"); 12: // サイズを 設 定 する 13: frame.setsize(400, 300); 14: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 15: frame.setdefaultcloseoperation(jframe.exit_on_close); 16: // FlowLayout の 設 定 17: frame.setlayout(new FlowLayout()); 18: // ボタンの 生 成 と 配 置 19: button = new JButton("ボタン"); 20: frame.add(button); 21: // イベントリスナーの 登 録 22: button.addactionlistener(new ActionEventSample()); 23: // フレームの 表 示 24: frame.setvisible(true); 25: } 26: 27: // イベントハンドラメソッド 28: public void actionperformed(actionevent e) { 29: button.settext(++cnt + " 回 目 "); 30: } 31: } このサンプルプログラムでは アプリケーションのクラス 自 体 に ActionListener インタ フェースを 実 装 します(5 行 目 ) そのため main メソッドの 他 にイベントハンドラメソッ ドを 記 述 します(28~29 行 目 ) 168

169 フレームに 配 置 するボタンのオブジェクトを 格 納 する 変 数 (6 行 目 )とボタンのクリック の 回 数 (7 行 目 )は actionperformed メソッドからも 参 照 できるように private フィール ドとして 定 義 します レイアウトマネージャとして FlowLayout を 使 います(17 行 目 ) デフォルトコンストラ クタを 使 用 しているため ボタンは 中 央 に 表 示 されます addactionlistener メソッドによりボタンに ActionListener を 登 録 します ここでは ActionEventSample クラスが ActionListener インタフェースを 実 装 しているため 自 クラ スのオブジェクトを 生 成 して 渡 します イベントハンドラメソッドでは JButton クラスの settext メソッドを 使 って ボタンに クリックの 回 数 を 設 定 します 実 行 結 果 は 次 のとおりです ボタンをクリックするたびに 回 数 が 更 新 されることを 確 認 してください イベントリスナーを 別 クラスとして 作 成 する 最 初 に main メソッドを 持 つクラスに ActionListener インタフェースを 実 装 するサンプ ルプログラムを 作 成 しました 続 いて 独 立 したイベントリスナーを 利 用 するサンプルプ ログラムを 作 成 します 01: import java.awt.*; 02: import java.awt.event.*; 03: import javax.swing.*; 04: 05: class ActionEventOtherSample { 06: public static void main(string[] args) { 07: // JFrame クラスのオブジェクトを 生 成 する 08: JFrame frame = new JFrame("Java for Android"); 09: // サイズを 設 定 する 10: frame.setsize(400, 300); 11: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 12: frame.setdefaultcloseoperation(jframe.exit_on_close); 169

170 13: // FlowLayout の 設 定 14: frame.setlayout(new FlowLayout()); 15: // ボタンの 生 成 と 配 置 16: JButton button = new JButton("ボタン"); 17: frame.add(button); 18: // イベントリスナーの 登 録 19: button.addactionlistener(new ActionSampleListener()); 20: // フレームの 表 示 21: frame.setvisible(true); 22: } 23: } 24: 25: class ActionSampleListener implements ActionListener { 26: private int cnt = 0; 27: 28: // イベントハンドラメソッド 29: public void actionperformed(actionevent e) { 30: JButton button = (JButton)e.getSource(); 31: button.settext(++cnt + " 回 目 "); 32: } 33: } こ の サ ン プ ル プ ロ グ ラ ム で は ActionListener イ ン タ フ ェ ー ス を 実 装 す る ActionSampleListener クラスを 定 義 しています(25 行 目 ) また クリックの 回 数 を 保 持 する int 型 フィールドはこのクラスで 宣 言 しています(26 行 目 ) actionperformed メソッドでは 引 数 として 受 け 取 った ActionEvent クラス 型 の 変 数 e に 対 して getsource メソッドを 呼 び 出 し イベントが 発 生 したボタンを 取 得 しています(30 行 目 ) EventObject クラスは 発 生 したイベントに 関 する 情 報 を 取 得 するためのメソッドを 提 供 しており イベントの 発 生 元 のオブジェクトを 返 す getsource メソッドもその 1 つで す ActionEvent クラスではこれらのメソッドを 継 承 しています ボタンにはイベントリスナーとして ActionSampleListener クラスのオブジェクトを 登 録 しています(19 行 目 ) サンプルプログラムを 実 行 し 実 行 結 果 が 同 じになることを 確 認 してください イベントリスナーを 匿 名 の 内 部 クラスとして 作 成 する 独 立 したイベントリスナーを 作 成 すると 他 のアプリケーションでも 再 利 用 可 能 になり ます 一 方 で 用 途 がその 場 限 りで 他 に 再 利 用 する 機 会 がない 場 合 は 匿 名 の 内 部 クラ スとして 実 装 する 方 法 が 便 利 です 01: import java.awt.*; 02: import java.awt.event.*; 03: import javax.swing.*; 04: 05: class ActionEventInnerSample { 06: private static JButton button; 07: private static int cnt = 0; 170

171 08: 09: public static void main(string[] args) { 10: // JFrame クラスのオブジェクトを 生 成 する 11: JFrame frame = new JFrame("Java for Android"); 12: // サイズを 設 定 する 13: frame.setsize(400, 300); 14: // [ ]ボタンのクリック 時 の 操 作 を 設 定 する 15: frame.setdefaultcloseoperation(jframe.exit_on_close); 16: // FlowLayout の 設 定 17: frame.setlayout(new FlowLayout()); 18: // ボタンの 生 成 と 配 置 19: button = new JButton("ボタン"); 20: frame.add(button); 21: 22: // イベントリスナーの 登 録 23: button.addactionlistener(new ActionListener() { 24: // イベントハンドラメソッド 25: public void actionperformed(actionevent e) { 26: button.settext(++cnt + " 回 目 "); 27: } 28: }); 29: 30: // フレームの 表 示 31: frame.setvisible(true); 32: } 33: } addactionlistener メ ソ ッ ド で ボ タ ン に ActionListener を 登 録 す る 際 に new ActionListener() {... }という 形 で ActionListener インタフェースを 実 装 する 匿 名 の 内 部 ク ラスを 定 義 します(23~28 行 目 ) addactionlistener メソッドの 引 数 としてクラスを 定 義 してオブジェクトを 渡 すため 最 後 に 引 数 リストを 閉 じるかっことセミコロンを 忘 れない ように 注 意 してください サンプルプログラムを 実 行 し 実 行 結 果 が 同 じになることを 確 認 してください 演 習 問 題 フレームにボタンを 3 つ 配 置 し 各 ボタンがクリックされたときにそのボタンのクリック 回 数 を 表 示 するプログラムを 作 成 しなさい MouseEvent クラスと MouseListener インタフェースなど 他 のイベントとイベントリスナーを 使 っ て ボタンやラベルに 表 示 されている 文 字 列 を 変 えるプログラムを 作 成 しなさい 171

172 Chapter 21 HTTP 通 信 [シラバス No. 26] 目 的 HTTP の 基 本 を 理 解 する HttpURLConnection クラスを 使 って HTTP 通 信 を 実 行 する HTTP とは HTTP の 概 要 HTTP(Hypertext Transfer Protocol)は インターネット 上 で Web サーバとブラウザ 間 の 通 信 に 使 われるプロトコルです TCP/IP をベースとしており HTML 画 像 音 声 な どのデータをやりとりします TCP/IP は 4 階 層 からなるプロトコルです HTTP はそのアプリケーション 層 に 位 置 しま す TCP/IP の 階 層 アプリケーション 層 トランスポート 層 インターネット 層 ネットワークインタフェース 層 HTTP DNS SMTP など TCP UDP IP イーサネット HTTP では まずクライアント(ブラウザ)から Web サーバに HTTP リクエストという メッセージを 送 ります Web サーバは HTTP リクエストに 設 定 されているメソッドに 応 じた 処 理 を 実 行 し その 結 果 を HTTP レスポンスというメッセージで 返 します メソッド は どのような 処 理 を 要 求 するかを 示 すものです 詳 細 については 後 述 します HTTP は 基 本 的 にはステートレスなプロトコルです クライアントとサーバのやりとり は 基 本 的 に 1 回 で 終 了 します サーバではクライアントの 状 態 を 保 持 しないため 複 雑 な 処 理 を 必 要 としません 一 方 で 1 回 にやりとりするデータ 量 が 多 くなり ネットワークに 負 荷 がかかります メモ HTTP では ユーザ 関 連 の 情 報 を Cookie に 格 納 し ブラウザを 介 してクライアントのコンピュータ に 一 時 的 に 保 存 することで ユーザの 認 識 やアクセスの 状 態 を 保 持 できます HTTP リクエスト クライアントからサーバに 送 られる HTTP リクエストは 次 のような 構 造 になります 172

173 各 行 の 最 後 には 改 行 が 入 ります UDP UDP UDP 1 行 目 リクエスト 行 メソッド URL HTTP のバージョン(HTTP/1.1) 2 行 目 ~n 行 目 HTTP ヘッダ HTTP リクエストのサイズ 種 類 文 字 セットなどの 情 報 n+1 行 目 空 白 行 HTTP ヘッダと HTTP のボディを 区 切 る 目 的 で 挿 入 され た 空 白 行 n+2 行 目 HTTP ボディ (オプション) Web サーバに 送 るデータ(フォームに 入 力 するデータ など) HTTP メソッド HTTP メソッドとは Web サーバにどのような 処 理 を 要 求 するかを 示 します 次 の 8 種 類 を 利 用 できます メソッド GET POST PUT HEAD DELETE OPTIONS TRACE CONNECT 説 明 URL で 指 定 されたリソースを 取 得 する URL で 指 定 された 場 所 にクライアントからデータを 送 信 する(フォームの 入 力 など) URL で 指 定 された 場 所 にクライアントから 送 ったデータを 配 置 する GET メソッドで 要 求 したデータのうち HTTP ヘッダだけを 取 得 する URL で 指 定 されたデータを 削 除 する オプション 情 報 (サーバがサポートしているバージョン)を 取 得 する サーバまでのネットワークの 経 路 を 診 断 する プロキシサーバ 経 由 の SSL 通 信 などを 要 求 する これらのメソッドのうち 最 もよく 使 われるのが GET メソッドと POST メソッドです 次 節 では GET メソッドと POST メソッドを 使 って HTTP 通 信 を 行 う 方 法 を 説 明 します URL インターネット 上 のリソース(HTML や 画 像 など)の 位 置 は URL(Uniform Resource Locator)により 指 定 します URL の 形 式 は 次 のようになります 冒 頭 の は HTTP プロトコルを 使 うことを 示 すスキーム 名 です 名 [:ポート 番 号 ]/[パス 名 ][?クエリ 文 字 列 ] 173

174 コンピュータ 名 :ホスト 名 ( IP アドレス( XXX.XXX)を 指 定 す る ポート 番 号 :HTTP のデフォルトのポート 番 号 (80) 以 外 を 利 用 する 際 に 指 定 する パス 名 : 指 定 したコンピュータ 上 のフォルダやファイル 名 (index.html など)を 指 定 する クエリ 文 字 列 :CGI などのサーバ 側 に 渡 す 引 数 などを 指 定 する Java プログラムでは java.net.url クラスを 使 って URL を 指 定 します メモ インターネット 上 のリソースはすべて URI(Uniform Resource Identifier)で 識 別 できます URL は URL の 一 種 です HTTP レスポンス サーバからクライアントに 返 される HTTP レスポンスは 次 のような 構 造 になります 各 行 の 最 後 には 改 行 が 入 ります 行 要 素 内 容 1 行 目 ステータス 行 HTTP のバージョン(HTTP/1.1) ステータスコード ス テータスコードに 応 じたメッセージ 2 行 目 ~n 行 目 HTTP ヘッダ HTTP レスポンスのサイズ 種 類 文 字 セットなどの 情 報 n+1 行 目 空 白 行 HTTP ヘッダと HTTP のボディを 区 切 る 目 的 で 挿 入 され た 空 白 行 n+2 行 目 HTTP ボディ (オプション) Web サーバから 送 られるデータ(HTML ドキュメントな ど) ステータスコード HTTP レスポンスには Web サーバでの 処 理 結 果 を 示 す 3 桁 のステータスコードが 含 ま れています 主 なステータスコードは 次 のとおりです 174

175 分 類 主 なコード 意 味 1XX 処 理 中 100 Continue サーバが 処 理 中 2XX 完 了 200 OK 成 功 3XX リダイレクト 301 Moved Permanently リソースが 恒 久 的 に 移 動 302 Found リソースが 一 時 的 に 移 動 303 See Other 別 の URL を 参 照 4XX クライアントエラー 401 Unauthorized 認 証 が 必 要 403 Forbidden アクセス 禁 止 404 Not Found リソースが 見 つからない 5XX サーバエラー 500 Internal Server Error サーバの 内 部 エラー HttpURLConnection クラスを 使 った HTTP 通 信 HTTP 通 信 の 手 順 java.net パッケージは 通 信 やネットワークを 行 うためのクラスやインタフェースを 定 義 しています これらのうち クライアントから Web サーバに 対 して HTTP 通 信 を 行 うには URL を 使 っ た HTTP 接 続 を 表 す HttpURLConnection ク ラ ス と URL を 表 す HttpURLConnection クラスを 使 用 します GET メソッドを 使 用 する 場 合 を 例 に 手 順 を 示 します 40. アクセスする URL を 表 す 文 字 列 を 指 定 して URL クラスのコンストラクタを 呼 び 出 し オブジェク トを 生 成 する 41. URL クラスの openconnection メソッドを 呼 び 出 して 指 定 した URL への 接 続 をオープンし HttpURLConnection クラスのオブジェクトを 取 得 する 42. HttpURLConnection クラスの setrequest メソッドを 呼 び 出 し HTTP リクエストに GET メソッド を 設 定 する 43. 必 要 に 応 じて HTTP ヘッダ HTTP ボディを 設 定 する 44. HttpURLConnection クラスの connect メソッドを 呼 び 出 し URL への 接 続 を 確 立 する 45. 必 要 に 応 じて HTTP レスポンスのステータスコードや HTTP ヘッダなどを 取 得 する 46. HttpURLConnection クラスの getinputstream メソッドを 呼 び 出 し HTTP レスポンスの HTTP ボ ディを 得 るための 入 力 ストリームを 取 得 する 47. 入 力 ストリームから HTTP ボディの 内 容 を 読 み 取 る 48. close メソッドで 入 力 ストリームをクローズする 49. HttpURLConnection クラスの disconnect メソッドで URL への 接 続 を 切 断 する 175

176 HttpURLConnection クラスの 主 なメソッドを 次 に 示 します public void connect() throws IOException URL 接 続 を 確 立 します public void disconnect() URL 接 続 を 切 断 します void setrequestmethod(string method) 指 定 した HTTP メソッドを HTTP リクエストに 設 定 します public InputStream getinputstream() throws IOException HTTP レスポンスのボディを 読 み 取 るための 入 力 ストリームを 取 得 します public OutputStream getoutputstream() throws IOException HTTP リクエストのボディに 書 き 込 むための 出 力 ストリームを 取 得 します public void setdooutput(boolean flg) true を 指 定 すると URL 接 続 への 出 力 が 可 能 になります デフォルトでは 不 可 (false) になっています public int getresponsecode() HTTP レスポンスからステータスコードを 取 得 します public String getresponsemessage() HTTP レスポンスからメッセージを 取 得 します public String getheaderfield(int n) HTTP ヘッダの n 番 目 のフィールドの 値 を 取 得 します URL 接 続 をオープンし 確 立 するには URL クラスのコンストラクタを 利 用 します URL(String url) URL(URL context, String spec) 指 定 された 文 字 列 または 既 存 の URL オブジェクト+ 文 字 列 が 示 す URL オブジェクトを 生 成 します 176

177 また 次 のメソッドにより URL 接 続 をオープンします public URLConnection openconnection() throws IOException URL 接 続 をオープンし URLConnection クラス(HttpURLConnection クラスのスーパ ークラス)のオブジェクトを 返 します GET メソッドを 使 った HTTP 通 信 の 例 では 実 際 に GET メソッドを 使 って HTTP 通 信 を 行 うサンプルプログラムを 作 成 して みましょう このサンプルプログラムでは 指 定 された URL に 接 続 し 取 得 したデータを 標 準 出 力 に 出 力 します 接 続 する URL とデータの 文 字 コードはコマンドライン 引 数 から 取 得 します 01: import java.io.*; 02: import java.net.*; 03: 04: public class HttpGetSample { 05: public static void main(string[] args) { 06: HttpURLConnection connection = null; 07: BufferedReader in = null; 08: 09: try { 10: // URL クラスのインスタンスを 生 成 する 11: URL url = new URL(args[0]); 12: // URL に 接 続 する 13: connection = (HttpURLConnection)url.openConnection(); 14: 15: // HTTP リクエストに GET メソッドを 指 定 する 16: connection.setrequestmethod("get"); 17: // URL への 接 続 を 確 立 する 18: connection.connect(); 19: 20: // ステータスコードを 取 得 する 21: System.out.println("コード:" + 22: connection.getresponsecode()); 23: // メッセージを 取 得 する 24: System.out.println("メッセージ:" + 25: connection.getresponsemessage()); 26: 27: // 入 力 ストリームを 取 得 し BufferedReader にラップする 28: in = new BufferedReader(new InputStreamReader( 29: connection.getinputstream(), args[1])); 30: 31: String s; 32: // 入 力 ストリームから 1 行 ずつ 読 み 取 り 標 準 出 力 に 表 示 33: while ((s = in.readline())!= null) { 34: System.out.println(s); 35: } 177

178 36: } 37: catch(malformedurlexception e) { 38: System.out.println("URL が 不 正 :" + args[0]); 39: } 40: catch(ioexception e) { 41: // 接 続 失 敗 入 力 ストリーム 関 連 42: e.printstacktrace(); 43: } 44: finally { 45: try { 46: // 入 力 ストリームをクローズする 47: if (in!= null) { 48: in.close(); 49: } 50: } 51: catch(ioexception e) { 52: e.printstacktrace(); 53: } 54: // URL への 接 続 を 切 断 する 55: connection.disconnect(); 56: } 57: } 58: } 11 行 目 コマンドライン 引 数 から 受 け 取 った URL を 指 定 して URL クラスのコンストラクタを 呼 び 出 し URL オブジェクトを 生 成 します URL クラスのコンストラクタは URL の 形 式 が 不 正 な 場 合 に MalformedURLException をスローするので 37 行 目 で 例 外 を 捕 捉 してい ます 13 行 目 openconnection メソッドで URL 接 続 をオープンします openconnection メソッドは IOException をスローする 可 能 性 があるため やはり 例 外 処 理 が 必 要 です 16 行 目 setrequestmethod メソッドで GET メソッドを 設 定 します 18 行 目 connect メソッドで 接 続 を 確 立 します このメソッドも IOException をスローする 可 能 性 があります 21 行 目 ~25 行 目 サ ー バ か ら 返 さ れ た HTTP レ ス ポ ン ス か ら getresponsecode メ ソ ッ ド と getresponsemessage メソッドでステータスコードとメッセージを 取 得 します 行 目 HttpURLConnection クラスの getinputstream メソッドで 入 力 ストリームを 取 得 し そ れを InputStreamReader にラップします InputStreamReader クラスのコンストラクタ には 2 番 目 のコマンドライン 引 数 として 受 け 取 った 文 字 コードを 指 定 します 日 本 語 を 扱 178

179 う 際 には 文 字 化 けしないように UTF-8 や EUC-JP を 指 定 します 33~35 行 目 入 力 ストリームから 1 行 単 位 で 読 み 取 った 文 字 列 を 標 準 出 力 に 出 力 します 44~56 行 目 finally 文 のブロックでストリームをクローズし URL 接 続 をクローズします 実 行 結 果 は 次 のとおりです >java HttpGetSample UTF-8 コード:200 メッセージ:OK <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> <META http-equiv="content-type" content="text/html; charset=utf-8"> <title>jdk 6 ドキュメント</title> <meta name="collection" content="reference"> <style type="text/css"> <!-- h1, b { font-family: Arial, Helvetica, sans-serif }.atext,.ahead { font-size: 80%; font-family: Arial, Helvetica, sans-serif; color: black; text-decoration: none;}.atext { font-weight: bold; }.ahead { font-size: 70%; text-align: right; line-height: 90%; }.table { border-width: 0px 0px 0px 0px }.tdbody { padding-left:.4em; padding-right:.4em; line-height: 90%; text-align: center; vertical-align: middle; height: 1.7em; }.tdleftside { padding-left:.25em; text-align: left; border-width: 2px 0px 2px 2px; vertical-align: middle; }.tdrightside { padding-left:.25em; padding-right:.25em; text-align: center; vertical-align: middle; }.tdhead { padding-right:.5em; border-width: 0px 0px 0px 0px; text-align: right; vertical-align: middle; }.TM { font-size: 6px; } --> </style> </head> <!-- style="border-width: 0px 0px 0px 0px; --> <body> <!-- ==================BEGINNING OF TITLE HEADING================= --> <p> ( 略 ) ここではコマンドライン 引 数 に JDK 6 ドキュメントの URL と UTF-8 を 指 定 しています ステータスコードとして 200 が 返 されていることに 注 目 してください 179

180 POST メソッドを 使 った HTTP 通 信 の 例 続 いて POST メソッドを 使 って HTTP 通 信 を 行 うサンプルプログラムを 作 成 します このサンプルプログラムでは 指 定 された URL に 接 続 し データを 送 ります また サ ーバから 送 られたデータを 標 準 出 力 に 出 力 します 接 続 する URL データの 文 字 コード HTTP リクエストのボディに 設 定 するデータはコマンドライン 引 数 から 取 得 します POST メソッドを 使 う 際 には 次 の 処 理 が 必 要 になります HttpURLConnection クラスの setdooutput メソッドにより URL 接 続 への 出 力 を 可 能 にする HTTP リクエストの HTTP ボディに 設 定 するデータを 書 き 込 むための 出 力 ストリームを 取 得 し データを 書 き 込 む これら 以 外 は GET メソッドの 場 合 とほとんど 同 じです 01: import java.io.*; 02: import java.net.*; 03: import java.util.*; 04: 05: 06: public class HttpPostSample { 07: public static void main(string[] args) { 08: HttpURLConnection connection = null; 09: BufferedReader in = null; 10: PrintWriter out = null; 11: 12: try{ 13: // URL クラスのインスタンスを 生 成 する 14: URL url = new URL(args[0]); 15: // URL に 接 続 する 16: connection = (HttpURLConnection)url.openConnection(); 17: // HTTP リクエストに POST メソッドを 指 定 する 18: connection.setrequestmethod("post"); 19: // URL 接 続 への 出 力 をオンに 設 定 する 20: connection.setdooutput(true); 21: 22: // URL への 接 続 を 確 立 する 23: connection.connect(); 24: 25: // 出 力 ストリームを 取 得 し PrintWriter にラップする 26: out = new PrintWriter(new OutputStreamWriter( 27: connection.getoutputstream(), args[1])); 28: 29: // 出 力 ストリームにデータを 書 き 込 む 30: out.println(args[2]); 31: 32: // ステータスコードを 取 得 する 33: System.out.println("コード:" + 34: connection.getresponsecode()); 180

181 35: // メッセージを 取 得 する 36: System.out.println("メッセージ:" + 37: connection.getresponsemessage()); 38: 39: // 入 力 ストリームを 取 得 し BufferedReader にラップする 40: in = new BufferedReader(new InputStreamReader( 41: connection.getinputstream(), args[1])); 42: 43: String s; 44: // 入 力 ストリームから 1 行 ずつ 読 み 取 り 標 準 出 力 に 表 示 45: while ((s = in.readline())!= null) { 46: System.out.println(s); 47: } 48: } 49: catch(malformedurlexception e) { 50: System.out.println("URL が 不 正 :" + args[0]); 51: } 52: catch(ioexception e) { 53: // 接 続 失 敗 ストリーム 関 連 54: e.printstacktrace(); 55: } 56: finally { 57: try { 58: // 出 力 ストリームをクローズする 59: if (out!= null) { 60: out.close(); 61: } 62: // 入 力 ストリームをクローズする 63: if (in!= null) { 64: in.close(); 65: } 66: } 67: catch(ioexception e) { 68: e.printstacktrace(); 69: } 70: // URL への 接 続 を 切 断 する 71: connection.disconnect(); 72: } 73: 74: } 75: } 20 行 目 true を 指 定 して setdooutput メソッドを 呼 び 出 します 行 目 HttpURLConnection クラスの getoutputstream メソッドで 出 力 ストリームを 取 得 し それを OutputStreamWriter にラップします OutputStreamWriter クラスのコンストラ クタには 文 字 コードを 指 定 します 作 成 したオブジェクトをさらに PrintWriter でラップし ます 30 行 目 181

182 コマンドライン 引 数 から 受 け 取 ったデータを PrintWriter クラスの println メソッドで 書 き 込 みます POST メソッドを 使 う 場 合 には サーバ 側 に CGI などデータを 受 け 取 るためのプログラ ムが 必 要 です 演 習 問 題 サンプルプログラムにさまざまな URL を 指 定 し どのようなコンテンツが 返 されるか 試 しなさい HEAD メソッドを 使 って 指 定 した URL から HTTP ヘッダを 取 得 するプログラムを 作 成 しなさい 182

183 Chapter 22 非 同 期 処 理 ~その 1 [シラバス No. 25] 目 的 マルチスレッド 処 理 の 概 要 を 理 解 する Thread クラスと Runnable インタフェースの 使 用 方 法 を 理 解 する 処 理 の 同 期 の 必 要 性 を 理 解 する マルチスレッド 処 理 とは マルチスレッド 処 理 の 必 要 性 Java はマルチスレッド 処 理 に 対 応 しています スレッドとは プログラムにおける 処 理 の 流 れの 単 位 のことで 制 御 の 筋 道 (thread of control)に 由 来 する 言 葉 です プログラ ムは 少 なくとも 1 つのスレッド(=メインスレッド)を 持 ちます メインスレッドで GUI 画 面 の 表 示 や 入 力 を 行 っているとします たとえば ボタンのク リックに 応 じてファイルをダウンロードする 場 合 そのままメインスレッドでダウンロー ド 処 理 を 実 行 すると 完 了 するまで 画 面 はそのままの 状 態 になりユーザの 操 作 を 受 け 付 けな くなります このような 場 合 別 途 ワーカースレッドを 生 成 し そこでファイルのダウンロード 処 理 を 実 行 すれば メインスレッドの GUI 画 面 は 引 き 続 きユーザの 操 作 が 可 能 になります ワ ーカースレッドでのダウンロード 処 理 が 完 了 したときにはその 旨 を 通 知 し ワーカースレ ッドを 終 了 します このように 複 数 のスレッドで 別 々の 処 理 を 行 うことを 非 同 期 処 理 と いいます スレッドのライフサイクル Java では スレッドは Runnable オブジェクトとして 表 されます 具 体 的 には Thread クラスのサブクラスまたは Runnable インタフェースを 実 装 するクラスのオブジェクトで す したがって スレッドも 通 常 のクラスと 同 様 に new キーワードでコンストラクタを 呼 び 出 してオブジェクトを 生 成 するところから 始 めます ただし スレッドは 生 成 してすぐ には 実 行 されません スレッドには 次 に 示 す 状 態 があり メソッドの 呼 び 出 しや 処 理 の 進 捗 状 況 に 応 じて 状 態 を 遷 移 します 新 規 状 態 :new などによって 生 成 された 状 態 で 実 行 されていない スレッドの 実 行 を 開 始 する には スレッドの start メソッドを 呼 び 出 す 実 行 可 能 状 態 :start メソッドが 呼 び 出 された 後 に 実 行 可 能 状 態 に 遷 移 する スレッドを 実 行 す る 順 番 は OS が 決 定 する OS が 実 行 するスレッドを 切 り 替 えると スレッドは 実 行 状 態 に 遷 移 し 183

184 実 行 を 開 始 する ブロック 状 態 :sleep メソッドによりスレッドを 一 時 停 止 させたり wait メソッドの 呼 び 出 しにより 待 機 すると スレッドはブロック 状 態 になる sleep メソッドを 呼 び 出 した 場 合 は 指 定 時 間 が 経 過 す るとブロック 状 態 から 抜 けるが wait メソッドで 待 機 している 場 合 (かつ 時 間 を 指 定 していない 場 合 )は 他 のスレッドで notifyall メソッドが 呼 び 出 されるまでブロック 状 態 にとどまる 終 了 状 態 :スレッドの run メソッドが 最 後 まで 実 行 され 正 常 終 了 した 場 合 あるいは 途 中 で 何 ら かのエラーによって 異 常 終 了 した 場 合 終 了 状 態 になる 実 行 可 能 new start sleep wait 新 規 実 行 ブロック runの 終 了 sleepの 終 了 notifyall 終 了 Java では Thread クラスまたは Runnable インタフェースを 利 用 してマルチスレッド 処 理 を 実 行 できます メモ Java では 多 重 継 承 が 許 可 されていないため すでに 別 のクラスを 継 承 しているクラスをスレッド で 実 行 したい 場 合 には Runnable インタフェースを 使 います Thread クラスと Runnable インタフェース Thread クラス java.lang.thread クラスは 文 字 どおりスレッドを 表 します マルチスレッド 処 理 を 行 うには Thread クラスを 継 承 するサブクラスを 作 成 し run メソッドをオーバーライドし てスレッドで 実 行 する 処 理 を 記 述 します class クラス 名 extends Thread { public void run() { // スレッドで 実 行 する 処 理 を 記 述 する } } 184

185 作 成 したクラスのオブジェクトを 生 成 し start メソッドを 呼 び 出 すと スレッドの 実 行 が 開 始 します( 正 確 には 実 行 可 能 状 態 に 遷 移 します) new クラス 名 ().start(); start メソッドが 呼 び 出 されると その 内 部 で run メソッドが 呼 び 出 されます Thread クラスにはさまざまなコンストラクタがありますが 引 数 としてスレッド 名 を 表 す 文 字 列 を 指 定 できます public Thread(String name) 指 定 された 文 字 列 を 名 前 として 設 定 したスレッドオブジェクトを 生 成 します 指 定 した 名 前 は getname メソッドで 取 得 できます Thread クラスは start や run 以 外 に 次 のようなメソッドを 提 供 しています public void sleep(long millis) 実 行 中 のスレッドを 指 定 された 時 間 (ミリ 秒 )だけ 一 時 的 に 停 止 します public void interrupt() スレッドに 割 り 込 みます public boolean interrupted() public boolean isinterrupted() スレッドが 割 り 込 まれているどうかを 返 します public void join() public void join(long ms) スレッドが 終 了 するまで 待 機 します 最 長 の 待 機 時 間 をミリ 秒 で 指 定 できます public void yield() 現 在 実 行 中 のスレッドを 一 時 的 に 停 止 させ 他 のスレッドを 実 行 できるようにします public String getname() スレッドの 名 前 を 取 得 します public void setname(string name) 185

186 スレッドの 名 前 を 設 定 します public static Thread currentthread() 現 在 実 行 中 のスレッドを 表 す Thread オブジェクトを 返 します では Thread クラスを 使 ってマルチスレッド 処 理 を 実 行 するサンプルプログラムを 作 成 します このサンプルプログラムでは Thread クラスを 継 承 する ThreadSample クラスを 定 義 します ThreadSample クラスの run メソッドでは スレッド 名 を 表 示 してその 後 一 定 時 間 だけ 停 止 する 処 理 を 3 回 繰 り 返 します 2 つのスレッドが 別 々に 動 いていることがわ かるように それぞれのスレッドに 異 なる 停 止 時 間 を 指 定 します 01: class ThreadSample extends Thread { 02: private int stime; 03: 04: public static void main (String[] args) { 05: // スレッドを 生 成 して start()を 呼 び 出 す 06: new ThreadSample("スレッド 1", 500).start(); 07: new ThreadSample("スレッド 2", 100).start(); 08: } 09: 10: // コンストラクタ 11: public ThreadSample(String str, int time) { 12: setname(str); // スレッド 名 を 設 定 する 13: stime = time; // 実 行 時 に 一 時 停 止 する 時 間 を 設 定 する 14: } 15: 16: // run メソッドのオーバーライド 17: public void run() { 18: // 処 理 を 3 回 繰 り 返 す 19: for (int i = 0; i < 3; ) { 20: System.out.println(getName() + ":" + i++ + " 回 目 "); 21: 22: try { 23: // コンストラクタに 指 定 された 時 間 だけ 停 止 する 24: sleep((long)stime); 25: } 26: catch (InterruptedException e) {} // 例 外 処 理 27: } 28: // ループ 終 了 29: System.out.println(getName() + ": 終 了 "); 30: } 31: } スレッドの 一 時 停 止 を 行 う sleep メソッドは 別 のスレッドがこのスレッドに 割 り 込 んだ ときに InterruptedException をスローします そのため 呼 び 出 し 時 には 何 らかの 例 外 処 理 が 必 要 です 186

187 実 行 結 果 は 次 のとおりです スレッド 1:0 回 目 スレッド 2:0 回 目 スレッド 2:1 回 目 スレッド 2:2 回 目 スレッド 2: 終 了 スレッド 1:1 回 目 スレッド 1:2 回 目 スレッド 1: 終 了 Runnable インタフェース Runnable インタフェースは 唯 一 run メソッドのみを 定 義 しています Runnable インタ フェースを 使 う 場 合 Runnable インタフェースを 実 装 するクラスを 作 成 し run メソッド をオーバーライドします class クラス 名 implements Runnable { public void run() { // スレッドで 実 行 する 処 理 を 記 述 する } } Runnable インタフェースの 実 装 クラスを 利 用 するには Thread クラスのコンストラク タに 自 オブジェクトを 指 定 して 呼 び 出 す 必 要 があります Thread t = new Thread(new クラス 名 ()); t.start(); Thread クラスには 次 のようなコンストラクタがあります public Thread(Runnable target) public Thread(Runnable target, String name) Runnable インタフェースのオブジェクトを 指 定 して Thread クラスのオブジェクトを 生 成 します スレッド 名 を 表 す 文 字 列 を 指 定 することもできます では Runnable インタフェースを 利 用 してマルチスレッド 処 理 を 実 行 するサンプルプロ グラムを 作 成 します 処 理 の 内 容 は Thread クラスの 場 合 と 同 じですが 一 時 停 止 時 間 を 同 じにしています 01: class RunnableSample implements Runnable { 02: public static void main (String[] args) { 03: // スレッドを 生 成 して start()を 呼 び 出 す 187

188 04: new Thread(new RunnableSample(), "スレッド 1").start(); 05: new Thread(new RunnableSample(), "スレッド 2").start(); 06: } 07: 08: // run メソッドのオーバーライド 09: public void run() { 10: // 現 在 実 行 中 のスレッドオブジェクトを 取 得 する 11: Thread t = Thread.currentThread(); 12: 13: // 処 理 を 3 回 繰 り 返 す 14: for (int i = 0; i < 3; ) { 15: System.out.println(t.getName() + ":" + i++ + " 回 目 "); 16: try { 17: // 100 ミリ 秒 時 間 だけ 停 止 する 18: t.sleep(100l); 19: } 20: catch (InterruptedException e) {} // 例 外 処 理 21: } 22: // ループ 終 了 23: System.out.println(t.getName() + ": 終 了 "); 24: } 25: } Runnable インタフェースには run 以 外 のメソッドはありません しかし Thread クラ スにラップされているため Thread.currentThread メソッドで 現 在 実 行 中 の Thread オブ ジェクトを 取 得 して sleep メソッドや getname メソッドを 利 用 しています 実 行 結 果 は 次 のとおりです スレッド 1:0 回 目 スレッド 2:0 回 目 スレッド 1:1 回 目 スレッド 2:1 回 目 スレッド 2:2 回 目 スレッド 1:2 回 目 スレッド 1: 終 了 スレッド 2: 終 了 メモ sleep メソッドに 指 定 する 一 時 停 止 時 間 を 同 じにしても 2 つのスレッドが 必 ずしも 同 じタイミング で 実 行 されるわけではありません スレッドの 処 理 は スレッドの 優 先 順 位 や 稼 働 するプラットフォ ームのスレッド 処 理 機 能 などに 依 存 します スレッドの 同 期 同 期 の 必 要 性 マルチスレッド 処 理 では 複 数 のスレッドから 1 つのデータやファイルにアクセスしな ければならない 場 合 が 少 なくありません 2 つ 以 上 のスレッドが 1 つのオブジェクトに 対 し 188

189 て 同 時 にアクセスしようとした 結 果 競 合 が 発 生 したり オブジェクトの 内 容 が 不 整 合 に なったりする 可 能 性 があります そのため 複 数 のスレッドを 使 う 場 合 には 同 期 が 重 要 に なります 次 に 示 すのは 同 期 を 行 っていない 場 合 の 例 です 01: class NoSyncSample extends Thread{ 02: private static int count1 = 100; 03: private static int count2 = 100; 04: 05: public static void main (String[] args) { 06: // スレッドを 生 成 して start()を 呼 び 出 す 07: new NoSyncSample("スレッド 1").start(); 08: new NoSyncSample("スレッド 2").start(); 09: } 10: 11: // コンストラクタ 12: public NoSyncSample(String str) { 13: setname(str); // スレッド 名 を 設 定 する 14: } 15: 16: // run メソッドのオーバーライド 17: public void run() { 18: for (int i = 0; ; i++) { // 無 限 ループ 19: NoSyncSample.count1 -= 10; // count1 から 10 を 減 算 20: NoSyncSample.count2 += 10; // count2 に 10 を 加 算 21: NoSyncSample.count1 += 10; // count1 に 10 を 加 算 22: NoSyncSample.count2 -= 10; // count2 から 10 を 減 算 23: 24: // count1 または count2 が 0 なら 終 了 25: if (NoSyncSample.count1 == 0 26: NoSyncSample.count2 == 0) { 27: System.out.println(getName() +" "+i+ " 回 目 -" + 28: "count1:" + NoSyncSample.count1 + 29: " count2:" + NoSyncSample.count2); 30: System.exit(1); // 終 了 31: } 32: } 33: } 34: } このサンプルプログラムでは 2 つのスレッドを 実 行 しています スレッドでは 2 つの static フィールドに 対 して 10 の 加 算 と 減 算 を 繰 り 返 し 行 っています 見 た 目 では 4 回 の 計 算 がこの 順 番 で 行 われると それぞれのフィールドの 値 は 変 わらず 無 限 ループを 終 了 す る どちらかのフィールドが 0 という 条 件 は 絶 対 に 満 たされないように 思 われます しかし このサンプルプログラムの 実 行 結 果 は 次 のようになります スレッド 2 53 回 目 -count1:50 count2:0 スレッド 1 28 回 目 -count1:50 count2:0 189

190 マルチスレッド 処 理 では 複 数 のスレッドが 同 時 に 実 行 されるわけではなく 実 行 する スレッドが 何 度 も 切 り 替 えられることで 見 せかけ 上 は 同 時 に 動 いているように 見 えます どのスレッドをどの 順 番 で 実 行 するかは OS によって 制 御 されるため 必 ずしもプログラム 上 都 合 のよいタイミングで 切 り 替 えられるわけではありません( 実 際 にはできる 限 り 意 図 したとおりに 切 り 替 えられるようにプログラムを 作 ります) スレッドの 切 り 替 えは 1 つの 処 理 と 処 理 の 間 に 起 こります 1 つの 処 理 とは 1 つのメソ ッドの 呼 び 出 しや Java プログラムの 1 文 でもなく マシン 語 レベルで 考 えたときの 処 理 単 位 です そのため 各 スレッドの 計 算 処 理 の 途 中 で 切 り 替 えが 行 われ 加 算 と 減 算 のバラ ンスが 合 わなくなります このような 問 題 が 発 生 しないように 同 期 を 行 います このサンプルプログラムでは 同 期 の 対 象 となる 処 理 を synchronized メソッドとして 定 義 します これにより あるスレッ ドでそのメソッドを 実 行 中 に 別 のスレッドから 同 じメソッドが 呼 び 出 されても 現 在 のス レッドで 最 後 まで 実 行 されることが 保 証 されます 01: class SyncSample extends Thread{ 02: private static int count1 = 100; 03: private static int count2 = 100; 04: 05: public static void main (String[] args) { 06: // スレッドを 生 成 して start()を 呼 び 出 す 07: new SyncSample("スレッド 1").start(); 08: new SyncSample("スレッド 2").start(); 09: } 10: 11: // コンストラクタ 12: public SyncSample(String str) { 13: setname(str); // スレッド 名 を 設 定 する 14: } 15: 16: // run メソッドのオーバーライド 17: public void run() { 18: int i; 19: for (i = 0; i < ; i++) { 20: // synchronized メソッドの 呼 び 出 し 21: SyncSample.count(); 22: 23: // count1 または count2 が 0 なら 終 了 24: if (SyncSample.getCount1() == 0 25: SyncSample.getCount2() == 0) { 26: System.out.println(getName() +" "+i+ " 回 目 -" + 27: "count1:" + SyncSample.getCount1() + 28: " count2:" + SyncSample.getCount2()); 29: System.exit(1); // 終 了 30: } 31: } 32: System.out.println(getName() +" "+i+ " 回 目 -" + 190

191 33: "count1:" + SyncSample.getCount1() + 34: " count2:" + SyncSample.getCount2()); 35: 36: } 37: 38: // synchronized メソッド 39: synchronized static void count() { 40: count1 -= 10; // count1 から 10 を 減 算 41: count2 += 10; // count2 に 10 を 加 算 42: count1 += 10; // count1 に 10 を 加 算 43: count2 -= 10; // count2 から 10 を 減 算 44: } 45: 46: // アクセサメソッド 47: static int getcount1() { 48: return count1; 49: } 50: static int getcount2() { 51: return count2; 52: } 53: } static フィールドの 計 算 処 理 を count メソッドに 記 述 し synchronized を 指 定 します 同 期 が 行 われると 無 限 ループになってしまうので for 文 の 繰 り 返 し 条 件 を 10,000 回 にし ています 実 行 結 果 は 次 のとおりです スレッド 回 目 -count1:100 count2:100 スレッド 回 目 -count1:100 count2:100 10,000 回 実 行 しても static フィールドの 値 は 変 わりません 演 習 問 題 Thread クラスを 使 って 1 から 10 まで 順 に 加 算 する 処 理 を 複 数 のスレッドで 実 行 するプログラム を 作 成 しなさい Runnable インタフェースを 使 って 1 から 10 まで 順 に 加 算 する 処 理 を 複 数 のスレッドで 実 行 する プログラムを 作 成 しなさい 191

192 Chapter 23 非 同 期 処 理 ~その 2 [シラバス No. 25] 目 的 wait/notifyall を 使 った 同 期 処 理 を 理 解 する java.util.concurrent パッケージの 概 要 を 理 解 する wait/notifyall を 使 った 同 期 処 理 スレッドの 待 機 マルチスレッド 処 理 では synchronized メソッドによる 同 期 だけでなく ある 条 件 を 満 たすまでスレッドが 待 機 することで 同 期 処 理 を 行 うことができます たとえば 次 のようなプログラムを 考 えます Counter クラス:int 型 の 値 ( 初 期 値 は 1,000)を 保 持 する スレッド 1 とスレッド 2は 1 つの Counter オブジェクトを 共 有 して 処 理 を 行 う スレッド 1:Counter オブジェクトの 値 を 100 ずつ 加 算 する 処 理 を 10,000 回 繰 り 返 す ただし Counter オブジェクトの 値 が 1,000 より 大 きくなった 場 合 加 算 を 行 わずに 値 が 1,000 以 下 にな るまで 待 機 する スレッド 2:Counter オブジェクトの 値 を 100 ずつ 減 算 する 処 理 を 10,000 回 繰 り 返 す ただし Counter オブジェクトの 値 が 100 より 小 さくなった 場 合 減 算 を 行 わずに 値 が 100 以 上 になる まで 待 機 する スレッド 1 とスレッド 2 は 1 つの Counter オブジェクトに 対 してそれぞれ 加 算 と 減 算 を 行 います スレッド 1 が 加 算 を 行 った 結 果 Counter オブジェクトの 値 が 1,000 より 大 き くなった 場 合 スレッド 1 は 待 機 状 態 に 入 り スレッド 2 が Counter オブジェクトの 値 を 1,000 以 下 にしてくれるのを 待 ちます 逆 にスレッド 2 が 減 算 を 行 った 結 果 Counter オブ ジェクトの 値 が 100 より 小 さくなった 場 合 今 度 はスレッド 2 が 待 機 します スレッドを 待 機 させるには Object クラスの wait メソッドを 使 います また 待 機 状 態 から 抜 けるには 他 のスレッドが Object クラスの notify メソッドまたは notifyall メソッ ドを 呼 び 出 す 必 要 があります public final void wait() throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void wait(long timeout, int nanos) throws InterruptedException 現 在 オブジェクトを 使 用 しているスレッドを 待 機 させます 他 のメソッドがこのオブジ ェクトに 対 して notify メソッドまたは notifyall メソッドを 呼 び 出 すと 待 機 状 態 から 抜 け 192

193 ます 時 間 を 指 定 した 場 合 は その 時 間 が 経 過 したときにも 待 機 状 態 から 抜 けます public final void notify() オブジェクトに 対 して 待 機 中 のスレッドのうち 任 意 の 1 つを 待 機 状 態 から 遷 移 させま す public final void notifyall() オブジェクトに 対 して 待 機 中 のスレッドをすべて 待 機 状 態 から 遷 移 させます wait/notifyall の 使 用 方 法 では サンプルプログラムを 作 成 しながら wait メソッドと notifyall メソッドの 使 い 方 を 理 解 していきましょう まずは Counter クラスを 作 成 します Counter クラスは int 型 の count フィールドと このフィールドの 値 を 返 す getcount メソッド count への 加 算 を 行 うaddCount メソッド 減 算 を 行 う subcount メソッドを 定 義 します addcount メソッドと subcount メソッドは 複 数 のスレッドからアクセスされるため synchronized を 指 定 します 01: class Counter { 02: private int count = 1000; 03: 04: // synchronized メソッド 05: synchronized void addcount(int n) { 06: 07: } 08: 09: // synchronized メソッド 10: synchronized void subcount(int n) { 11: } 12: 13: // アクセサメソッド 14: int getcount() { 15: return count; 16: } 17: } addcount メソッドを 実 装 します count フィールドを 加 算 する 処 理 は 次 のように 記 述 します count += n; しかし 加 算 の 前 に count が 1,000 より 大 きい 場 合 スレッドを 待 機 させる 処 理 を 行 わなければなりません これは 次 のように 記 述 します 193

194 while (count > 1000) { wait(); } count が 1,000 より 大 きいと while 文 に 入 り Counter オブジェクトの wait メソッドが 呼 び 出 されます すると 現 在 実 行 中 のスレッドは 待 機 状 態 になります count が 1,000 以 下 であれば while 文 に 入 らず 加 算 を 行 います while (count > 1000) { wait(); } count += n; 加 算 を 行 うことで count フィールドの 値 が 変 わり 待 機 状 態 にあるスレッド すなわち count が 100 より 小 さい 場 合 に 待 機 するスレッド がこの 条 件 から 抜 け 出 せるかもしれま せん そこで 加 算 に 続 いて notifyall メソッドを 呼 び 出 します while (count > 1000) { wait(); } count += n; notifyall(); subcount メソッドも 同 様 に 次 のように 記 述 します while (count < 100) { wait(); } count -= n; notifyall(); wait メソッドを 呼 び 出 したスレッドは ( 時 間 を 指 定 していない 場 合 は) 自 分 で 待 機 から 抜 け 出 せません 必 ず 他 のスレッドが notifyall メソッドまたは notify メソッドを 呼 び 出 す 必 要 があります(notify メソッドは 待 機 中 のスレッドの 1 つだけ 待 機 状 態 から 解 除 するため 特 別 な 理 由 がない 限 り 使 いません) なお wait メソッドは InterruptedException をスローする 可 能 性 があるため 何 らかの 例 外 処 理 が 必 要 です このサンプルプログラムではそれぞれのメソッドに throws でこの 例 外 を 指 定 し 呼 び 出 し 側 で 例 外 処 理 を 行 うようにします 全 体 では 次 のようになります 01: class WaitSample extends Thread { 02: private boolean flag; 03: private Counter obj; 04: 194

195 05: public static void main (String[] args) { 06: Counter c = new Counter(); 07: // スレッドを 生 成 して start()を 呼 び 出 す 08: new WaitSample("スレッド 1", c, true).start(); 09: new WaitSample("スレッド 2", c, false).start(); 10: 11: } 12: 13: // コンストラクタ 14: public WaitSample(String str, Counter c, boolean f) { 15: setname(str); // スレッド 名 を 設 定 する 16: obj = c; // Counter オブジェクトを 設 定 する 17: flag = f; // フラグを 設 定 する 18: } 19: 20: // run メソッドのオーバーライド 21: public void run() { 22: int i; 23: for (i = 0; i < ; i++) { // 10,000 回 繰 り 返 す 24: try { 25: if (flag) { 26: obj.addcount(100); // スレッド 1 は 100 を 足 す 27: } 28: else { 29: obj.subcount(100); // スレッド 2 は 100 を 引 く 30: } 31: } 32: catch(interruptedexception e) { } 33: } 34: System.out.println(getName() + " 終 了 "); 35: } 36: } 37: 38: class Counter { 39: private int count = 1000; 40: 41: // synchronized メソッド 42: synchronized void addcount(int n) throws InterruptedException { 43: // count が 1,000 より 大 きい 場 合 wait でスレッドを 待 機 させる 44: while (count > 1000) { 45: System.out.println( 46: Thread.currentThread().getName() + " 待 機 "); 47: wait(); 48: } 49: count += n; 50: notifyall(); // 待 機 状 態 のスレッドを 待 機 から 解 除 51: } 52: 53: // synchronized メソッド 54: synchronized void subcount(int n) throws InterruptedException { 55: // count が 100 より 小 さい 場 合 wait でスレッドを 待 機 させる 56: while (count < 100) { 57: System.out.println( 58: Thread.currentThread().getName() + " 待 機 "); 59: wait(); 195

196 60: } 61: count -= n; 62: notifyall(); // 待 機 状 態 のスレッドを 待 機 から 解 除 63: } 64: 65: // アクセサメソッド 66: int getcount() { 67: return count; 68: } 69: } 実 行 結 果 は 次 のとおりです スレッド 2 待 機 スレッド 1 待 機 ( 略 ) スレッド 1 待 機 スレッド 1 待 機 スレッド 1 待 機 スレッド 2 待 機 スレッド 1 待 機 スレッド 1 終 了 スレッド 2 終 了 メモ wait メソッドを 呼 び 出 す 条 件 を while 文 でチェックしているのは 安 全 性 を 確 保 するためです 他 の スレッドの notifyal によって wait メソッドから 戻 っても 待 機 の 条 件 が 変 わっていない 場 合 がありま す while 文 であれば wait メソッドから 戻 った 後 も 条 件 をもう 一 度 チェックしてくれます java.util.concurrent パッケージ java.util.concurrent パッケージの 概 要 Java 5 で 導 入 された java.util.concurrent パッケージは 非 同 期 処 理 をより 簡 単 に 行 うた めのユーティリティクラス インタフェースを 提 供 しています スレッド 処 理 を 簡 単 に 実 行 する 機 能 や 非 同 期 処 理 で 利 用 することを 前 提 としたコレクションクラスなどを 利 用 可 能 です ここでは java.util.concurrent パッケージで 最 も 基 本 的 なクラスとインタフェースを 紹 介 します Executor インタフェース タスク(Runnable オブジェクト)を 非 同 期 に 実 装 する execute メソッドを 定 義 していま す 196

197 ExecutorService インタフェース Executor インタフェースのサブインタフェースで execute メソッドのほか タスクを 終 了 するための shutdown メソッドなどを 定 義 しています Executors クラス Executor インタフェースの 実 装 クラスのオブジェクトを 返 すなど さまざまなユーティ リティメソッドを 提 供 します TimeUnit 列 挙 型 時 間 を 表 す 列 挙 型 です sleep メソッドなど 時 間 に 関 連 するメソッドを 提 供 します Executor インタフェース Executor インタフェースを 使 えば 簡 単 に 非 同 期 処 理 を 実 行 できます 手 順 は 次 のとおり です 50. Runnable インタフェースを 実 装 し run メソッドをオーバーライドして 非 同 期 に 実 行 したい 処 理 を 記 述 する 51. Executors クラスの newsinglethreadexecutor メソッドなどにより Executor インタフェー スを 実 装 するクラスのオブジェクトを 取 得 する 52. 取 得 したオブジェクトの exetute メソッドに Runnable インタフェースの 実 装 クラスのオブジ ェクトを 渡 して 実 行 する Chapter 22 で 作 成 した ThreadSample と 同 様 の 処 理 を 行 うサンプルプログラムを 作 成 し ます 01: import java.util.concurrent.*; 02: 03: class ExecutorSample implements Runnable { 04: private int stime; 05: private String name; 06: 07: public static void main (String[] args) { 08: Executor exec1 = Executors.newSingleThreadExecutor(); 09: Executor exec2 = Executors.newSingleThreadExecutor(); 10: 11: exec1.execute(new ExecutorSample("スレッド 1", 500)); 12: exec2.execute(new ExecutorSample("スレッド 2", 100)); 13: } 14: 15: public ExecutorSample(String str, int time) { 16: name = str; // スレッド 名 を 設 定 する 17: stime = time; // 実 行 時 に 一 時 停 止 する 時 間 を 設 定 する 197

198 18: } 19: 20: // run メソッドのオーバーライド 21: public void run() { 22: // 処 理 を 3 回 繰 り 返 す 23: for (int i = 0; i < 3; ) { 24: System.out.println(name + ":" + i++ + " 回 目 "); 25: 26: try { 27: // コンストラクタに 指 定 された 時 間 だけ 停 止 する 28: TimeUnit.MILLISECONDS.sleep((long)stime); 29: } 30: catch (InterruptedException e) {} // 例 外 処 理 31: } 32: // ループ 終 了 33: System.out.println(name + " : 終 了 "); 34: } 35: } Executors クラスの newsinglethreadexecutor メソッドは 単 一 のワーカースレッドを 使 う Executor オブジェクトを 返 します(8 9 行 目 ) ExecutorSample 自 体 が Runnable インタフェースを 実 装 しているため execute メソッドに 自 オブジェクトを 生 成 して 渡 しま す(11 12 行 目 ) ExecutorSample クラスでは スレッド 名 の 出 力 を 行 った 後 指 定 された 時 間 だけスリー プします そのために TimeUnit.MILLISECONDS.sleep メソッドを 使 っています(28 行 目 ) TimeUnit.MILLISECONDS 型 は 処 理 の 単 位 がミリ 秒 単 位 であることを 表 していま す 実 行 結 果 は 次 のとおりです スレッド 2:0 回 目 スレッド 1:0 回 目 スレッド 2:1 回 目 スレッド 2:2 回 目 スレッド 2 : 終 了 スレッド 1:1 回 目 スレッド 1:2 回 目 スレッド 1 : 終 了 ExecutorService インタフェース Executor インタフェースは execute メソッドしか 定 義 していません execute メソッド でタスクを 実 行 した 後 は 終 了 せずにそのままの 状 態 になってしまいます Executor インタフェースの 代 わりに ExecutorService インタフェースを 使 うことができ ます 使 用 方 法 は 同 じですが Executor インタフェースより 機 能 が 豊 富 です execute メ ソッドの 後 に shutdown メソッドを 呼 び 出 せば スレッドが 処 理 の 完 了 後 に 終 了 します 198

199 01: import java.util.concurrent.*; 02: 03: class ExecutorServiceSample implements Runnable { 04: private int stime; 05: private String name; 06: 07: public static void main (String[] args) { 08: ExecutorService exec1 = Executors.newSingleThreadExecutor(); 09: ExecutorService exec2 = Executors.newSingleThreadExecutor(); 10: 11: exec1.execute(new ExecutorServiceSample("スレッド 1", 500)); 12: exec2.execute(new ExecutorServiceSample("スレッド 2", 100)); 13: 14: exec1.shutdown(); 15: exec2.shutdown(); 16: } 17: 18: public ExecutorServiceSample(String str, int time) { 19: name = str; // スレッド 名 を 設 定 する 20: stime = time; // 実 行 時 に 一 時 停 止 する 時 間 を 設 定 する 21: } 22: 23: // run メソッドのオーバーライド 24: public void run() { 25: // ExecutorSample と 同 じなので 省 略 26: } 27: } 演 習 問 題 5 個 以 上 のスレッドが Counter オブジェクトを 共 有 するサンプルプログラムを 作 成 しなさい その 際 に notifyall メソッドの 代 わりに notify メソッドを 使 用 し notify メソッドの 問 題 点 を 確 認 しなさい java.util.concurrent パッケージの 他 のクラスやインタフェースについて JDK 6 ドキュメントで 確 認 しなさい 199

200 Chapter 24 Eclipse 入 門 [シラバス No. 09] 目 的 Eclipse の 概 要 を 理 解 する Eclipse のインストールと 日 本 語 化 を 行 う Eclipse の 基 本 的 な 使 い 方 を 理 解 する Eclipse とは Eclipse はオープンソースの 統 合 開 発 環 境 です IBM によって Java アプリケーションの 開 発 環 境 として 開 発 され 2001 年 にオープンソース 化 されました そのため 無 償 で 利 用 および 配 布 が 可 能 です 現 在 では 非 営 利 団 体 Eclipse Foundation が Eclipse の 開 発 や コミュニティの 活 性 化 を 支 援 しています Eclipse は Java だけでなく C/C++ PHP JavaScript COBOL などの 言 語 に 対 応 しています また Web アプリケーション 開 発 やクラスの 設 計 などさまざまな 用 途 で 利 用 できます Eclipse では プラグインというしくみにより 多 様 な 機 能 拡 張 が 可 能 になりま す Eclipse は Java で 作 成 されています 同 様 に Java で 作 成 したプラグインを Eclipse の 本 体 に 組 み 込 むと 機 能 を 拡 張 できます Eclipse はプラグインの 開 発 機 能 を 提 供 しているた め プラグイン 自 体 を Eclipse で 開 発 できます Eclipse のインストール Eclipse のインストール Eclipse を 利 用 するには JDK(Java SE Development Kit)を 事 前 にインストールして おく 必 要 があります ここでは Windows 7(32 ビット)に Java SE 6 Update 38 をインストール 済 みである ことを 前 提 に Eclipse のインストール 方 法 を 説 明 します Eclipse は 次 の Web サイトからダウンロードします URL: 200

201 図 Eclipse Classic ( 2013 年 1 月 時 点 での 最 新 版 )の 右 側 にある Windows 32 Bit をクリックして eclipse-sdk win32.zip をダウンロードします このファイルを 任 意 のフォルダ( 以 下 インストールフォルダとします)に 展 開 すれば インストールは 完 了 です Eclipse の 起 動 Eclipse のインストールフォルダ 内 の eclipse.exe を 実 行 します Eclipse のプロジェクト を 保 存 するワークスペースの 場 所 を 指 定 すると Eclipse が 起 動 します Eclipse の 初 期 画 面 で 右 上 の[Workbench]をクリックすると Java アプリケーション の 開 発 を 行 うための Java パースペクティブの 画 面 が 表 示 されます 201

202 Eclipse を 終 了 します Eclipse の 日 本 語 化 Eclipse の 画 面 は 英 語 表 示 ですが Pleiades という 日 本 語 化 プラグインを 組 み 込 めば 画 面 表 示 を 日 本 語 化 できます Pleiades は 次 の Web サイトからダウンロードします URL: 最 新 版 (2013 年 1 月 時 点 )1.3.5 をダウンロードし ダウンロードしたファイルを 任 意 のフォルダに 展 開 します フォルダ 内 の plugins フォルダと features フォルダを Eclipse のインストールフォルダにコピーします Eclipse のインストールフォルダ 内 の eclipse.ini ファイルをテキストエディタなどで 開 き 末 尾 に 次 の 行 を 追 加 します -javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar Eclipse を 実 行 すると メニューなどの 表 示 が 日 本 語 になります 202

203 Java パースペクティブ Eclipse では 特 定 の 用 途 に 用 いる 機 能 をパースペクティブとしてまとめています Java アプリケーションを 開 発 する 際 には Eclipse を 起 動 したときに 表 示 される Java パースペ クティブを 使 います Java パースペクティブは 次 の 画 面 から 構 成 されます 画 面 説 明 パッケージ エクスプローラー プロジェクトを 構 成 するファイルなどを 表 示 する エディタ アプリケーションのソースコードなどを 編 集 する アウトライン プロジェクト 内 のクラスのパッケージ 名 やメソッドなど を 表 示 する ビュー コンソールやログの 出 力 などを 表 示 する Eclipse の 基 本 的 な 使 い 方 Hello Java アプリケーション 簡 単 な Java アプリケーションを Eclipse で 作 ってみましょう ここでは Chapter 02 で 作 成 した Simple クラスを Eclipse で 作 成 します Eclipse で Java アプリケーションを 作 成 するには Java プロジェクトを 作 成 します まず Eclipse を 起 動 し [ファイル]メニューの[ 新 規 ]-[Java プロジェクト]を 選 択 します [プロジェクト 名 ]に HelloJava と 入 力 し [ 完 了 ]ボタンをクリックします 203

204 [パッケージ エクスプローラー]に HelloJava プロジェクトが 作 成 されます HelloJava プロジェクトを 選 択 し [ファイル]メニューの[ 新 規 ]-[クラス]を 選 択 します 204

205 [パッケージ]に com.example [ 名 前 ]に Simple を 入 力 します また [どのメ ソッド スタブを 作 成 しますか?]の[public static void main(string[] args)]チェック ボックスをオンにして [ 完 了 ]ボタンをクリックします HelloJava プロジェクトに Simple.java が 作 成 されます 205

206 main メソッドに 次 のコードを 記 述 し [ファイル]メニューの[ 保 管 ]を 選 択 して 変 更 を 保 存 します HelloJava プロジェクトを 選 択 して[ 実 行 ]メニューの[ 実 行 ]を 選 択 すると HelloJava アプリケーションが 実 行 され [コンソール]ビューに Hello Java と 表 示 されます 演 習 問 題 206

207 Eclipse を 使 って 今 まで 作 成 したサンプルプログラムと 同 じプログラムを 作 成 しなさい 207

208 Chapter 25 XML と JSON [シラバス No. 30] 目 的 XML の 概 要 を 理 解 する JSON の 概 要 を 理 解 する XML とは Java およびAndroid では XML 形 式 のデータをよく 扱 います XML(Extensible Markup Language)とは タグを 使 ってデータの 構 造 や 意 味 を 記 述 するマークアップ 言 語 のことで す 名 前 のとおり 用 途 に 合 わせて 独 自 にタグを 定 義 して 利 用 できます XML の 構 造 XML 形 式 のデータは ツリー 構 造 になります たとえば 次 のようなデータがあったとします 名 前 : 山 田 太 郎 年 齢 :35 メールアドレス:taro@example.com このデータは 次 のように 表 現 できます <person> <name> 山 田 太 郎 </name> <age>35</age> <mail>taro@example.com</mail> </person> <person>タグで 人 物 を 記 述 します そして <name>タグ <age>タグ <mail>タグを ネストして 記 述 し その 人 物 の 個 々の 特 徴 を 表 現 します このとき <person>タグをルー トタグといいます 人 物 を 複 数 表 現 したい 場 合 は 複 数 の<person>タグを 記 述 しますが 次 のような 書 き 方 は 誤 りです <person> <name> 山 田 太 郎 </name> <age>35</age> <mail>taro@example.com</mail> </person> <person> 208

209 <name> 鈴 木 花 子 </name> <age>28</age> </person> <person>t <name> 田 中 次 郎 </name> <age>42</age> </person> XML ではルートタグは 1 つだけ 記 述 できます そのため 次 のように<list>タグを 記 述 し その 中 に<person>タグを 記 述 します <list> <person> <name> 山 田 太 郎 </name> <age>35</age> <mail>taro@example.com</mail> </person> <person> <name> 鈴 木 花 子 </name> <age>28</age> <mail>hanako@example.com</mail> </person> <person> <name> 田 中 次 郎 </name> <age>42</age> <mail>hanako@example.com</mail> </person> </list> XML の 記 述 方 法 XML で 記 述 したファイルは.xml という 拡 張 子 を 付 けます たとえば Android では アプリケーションの 設 定 を AndroidManifest.xml という XML ファイルに 記 述 します 次 に 示 すのは AndroidManifest.xml の 例 です この 例 を 見 ながら XML の 基 本 的 な 記 述 方 法 を 説 明 します 01: <?xml version="1.0" encoding="utf-8"?> 02: <manifest xmlns:android=" 03: package="com.example" 04: android:versioncode="1" 05: android:versionname="1.0" > 06: 07: <uses-sdk 08: android:minsdkversion="8" 09: android:targetsdkversion="10" /> 10: 11: <application 12: android:allowbackup="true" 13: android:icon="@drawable/ic_launcher" 209

210 14: 15: > 16: <activity 17: android:name="com.example.mainactivity" 18: > 19: <intent-filter> 20: <action 21: android:name="android.intent.action.main" /> 22: <category 23: android:name="android.intent.category.launcher" /> 24: </intent-filter> 25: </activity> 26: </application> 27: </manifest> XML 宣 言 1 行 目 は XML 宣 言 で このファイルが XML で 書 かれていることを 示 します 必 ず XML ファイルの 1 行 目 に 書 かなければなりません version="1.0" は XML 宣 言 の 中 に 必 ずこのように 記 述 します encoding="utf-8" はこの XML ファイルが UTF-8 で 書 かれていることを 示 します この 記 述 は 省 略 可 能 です その 他 にもこのファイルがスタンドアロンかどうか( 他 のファイルを 参 照 する 必 要 がある かどうか)などを 記 述 できます 開 始 タグと 終 了 タグ 2 行 目 と 27 行 目 のように 開 始 タグと 終 了 タグを 記 述 し その 中 にコンテンツを 記 述 し ます コンテンツを 持 たない 場 合 は 開 始 タグと 終 了 タグだけを 記 述 します <タグ 名 > コンテンツ </タグ 名 > <タグ 名 > < 子 タグ 名 > </ 子 タグ 名 > </タグ 名 > コンテンツは <name> 山 田 太 郎 </name> のように 通 常 の 文 字 列 で 記 述 するか 子 とな るタグをネストして 記 述 します この 例 では <manifest>タグのコンテンツとして <uses-sdk> タ グ と <application> タ グ を 記 述 し <application> タ グ の コ ン テ ン ツ に <activity>タグを 記 述 しています 終 了 タグの 省 略 コンテンツを 持 たないタグは 終 了 タグを 省 略 して 次 のように 記 述 できます 210

211 <タグ 名 /> この 例 では 7 行 目 の<uses-sdk>タグ 20 行 目 の<action>タグ 22 行 目 の<category> タグをこの 方 法 で 記 述 しています 属 性 開 始 タグの 中 には 属 性 を 次 の 形 式 で 記 述 します 属 性 名 =" 属 性 値 " 属 性 の 値 は 必 ず 二 重 引 用 符 で 囲 みます 開 始 タグの 中 には 複 数 の 属 性 を 記 述 できます ただし 同 じ 名 前 の 属 性 は 1 つだけです また 属 性 はネストして 記 述 できません コメント この 例 にはありませんが XML では <!-- と --> の 間 にコメントを 記 述 できます <!-- コメント --> XML の 解 析 JAXP XML は DOM(Document Object Model)や SAX(Simple API for XML)を 使 って 解 析 します Java では DOM や SAX を 含 め XML を 扱 うための JAXP(Java API for XML Processing)を 標 準 で 提 供 しています たとえば DOM で XML ファイルを 解 析 する 場 合 次 のパッケージを 利 用 します javax.xml.parsers パッケージ XML の 解 析 を 行 うためのクラスを 提 供 します XML ファイルから XML の 解 析 を 可 能 に する DOM オブジェクトを 取 得 する DocumentBuilder クラス DocumentBuilder オブジ ェクトを 取 得 するための DocumentBuilderFactory クラスなどを 定 義 しています org.w3c.dom パッケージ XML を 解 析 する DOM で 使 用 する 要 素 を 提 供 します XML ファイル 内 のタグやコンテ ンツなどをノードとして 表 す Node インタフェース XML ファイル 全 体 を 表 す Document インタフェース タグを 表 す Element インタフェースなどを 定 義 しています XML ファイルの 解 析 の 例 たとえば DOM を 利 用 する 場 合 次 のように XML ファイルを 解 析 することができます 211

212 53. DocumentBuilderFactory クラスから XML 解 析 用 の DocumentBuilder オブジェクトを 取 得 する 54. DocumentBuilder オブジェクトの parse メソッドで XML ファイルを 解 析 し Document オブ ジェクトを 取 得 する 55. Document オブジェクトの getdocumentelement メソッドでルートタグを 取 得 する 56. Element オブジェクトの getchildnodes メソッドですべての 子 ノード(タグおよびタグ 以 外 ) を 含 むリストを 取 得 する 57. リストの 各 ノードからタグとコンテンツを 取 得 する 01: import java.io.*; 02: import javax.xml.parsers.*; 03: import org.w3c.dom.*; 04: 05: class XMLSample { 06: public static void main(string[] args) { 07: try { 08: // XML 解 析 用 の DOM オブジェクトを 取 得 する 09: DocumentBuilderFactory factory 10: = DocumentBuilderFactory.newInstance(); 11: DocumentBuilder builder = factory.newdocumentbuilder(); 12: 13: // 指 定 した XML ファイルを 解 析 し Document オブジェクトを 取 得 する 14: Document doc = builder.parse("main.xml"); 15: // ルートタグを 取 得 する 16: Element root = doc.getdocumentelement(); 17: // すべての 子 ノード(タグおよびタグ 以 外 )のリストを 取 得 する 18: NodeList childnodes = root.getchildnodes(); 19: 20: // 子 ノードのリスト 内 の 個 数 分 だけ 繰 り 返 す 21: for(int i = 0; i < childnodes.getlength(); i++) { 22: // 子 ノードのリストから i 番 目 の 要 素 を 取 得 する 23: Node child = childnodes.item(i); 24: // 取 り 出 した 要 素 はタグか? 25: if(child instanceof Element) { 26: Element childelement = (Element)child; 27: // タグ 名 を 出 力 する 28: System.out.println(childElement.getTagName()); 29: // タグのコンテンツを 出 力 する 30: System.out.println(childElement.getTextContent()); 31: } 32: } 33: } 34: catch(exception e) { 35: // 例 外 処 理 36: } 37: } 38: } 212

213 たとえば 次 の 内 容 の main.xml を 用 意 します <person> <name> 山 田 太 郎 </name> <age>35</age> </person> XMLSample を 実 行 すると 結 果 は 次 のようになります name 山 田 太 郎 age 35 mail JSON とは JSON(JavaScript Object Notation)は JavaScript でデータを 記 述 するための 言 語 で す データの 表 現 が 容 易 であることから JavaScript 以 外 にもさまざまなところで 使 われ ています 近 年 Web アプリケーション 間 でやりとりするデータの 形 式 と 使 われることが 多 いことから Java や Android でも 今 後 利 用 する 機 会 が 増 えていくと 思 われます JSON の 構 造 JSON 形 式 のデータは 名 前 と 値 のペアの 集 合 になります たとえば 次 のようなデータがあったとします 名 前 : 山 田 太 郎 年 齢 :35 メールアドレス:taro@example.com このデータは 次 のように 表 現 できます { "name" : " 山 田 太 郎 ", "age" :35, "mail" : "taro@example.com" } { から } までで 1 つのオブジェクトを 表 します オブジェクト 内 には 名 前 と 値 の ペアを 記 述 します 人 物 を 複 数 表 現 したい 場 合 は 次 のように 記 述 します { { "name" : " 山 田 太 郎 ", "age" : 35, "mail" : "taro@example.com" }, 213

214 { "name" : " 鈴 木 花 子 ", "age" : 28, "mail" : "hanako@example.com" }, { "name" : " 田 中 次 郎 ", "age" : 42, "mail" : "jiro@example.com" } } JSON の 記 述 方 法 JSON で 記 述 したファイルは.json という 拡 張 子 を 付 けます JSON ファイルは 次 のように 記 述 します { " 名 前 ": 値, " 名 前 ": 値,... } オブジェクト { から 始 まり } で 終 わります オブジェクト 内 には 名 前 と 値 のペアを 記 述 します それぞれのペアはカンマ(,)で 区 切 ります 名 前 は 必 ず 二 重 引 用 符 で 囲 みます 値 には 他 のオブジェクト 文 字 列 数 値 真 偽 値 配 列 を 指 定 できます また null を 指 定 することも 可 能 です 文 字 列 "name":" 田 中 次 郎 " のように 二 重 引 用 符 で 囲 んで 指 定 します 数 値 "age":35 のように 10 進 数 の 整 数 または 浮 動 小 数 点 数 を 指 定 します 真 偽 値 "isstudent":true のように 小 文 字 で true または false と 指 定 します 配 列 [ と ] の 間 に 0 個 以 上 の 要 素 をカンマ(,)で 区 切 って 指 定 します [ 要 素, 要 素,...] 要 素 にはオブジェクト 文 字 列 数 値 を 指 定 します [{"name":"taro"}, {"age":25}] ["ABC", "DEF", "GHI"] [10, 20, 30] JSON の 解 析 Java では JSON 解 析 用 の API を 標 準 では 提 供 していません ただし Android では json.org パッケージを 利 用 して JSON 形 式 のデータを 扱 うことができます 214

215 JSONObject クラス JSONObject クラスは 名 前 と 値 のペアで 表 される JSON 形 式 のデータを 表 すオブジェ クトです JSONObjet クラスでは 次 のメソッドを 利 用 できます pulic Iterator keys() JSONObject オブジェクトに 含 まれる 名 前 をすべて 含 む Iterator オブジェクトを 返 しま す public int length() JSONObject オブジェクトに 含 まれる 名 前 と 値 のペアの 数 を 返 す public Object get(string name) public Xxx getxxx(string name) 指 定 された 名 前 に 対 応 する 値 を 返 します getxxx メソッドは String などの 特 定 の 型 の 値 を 返 します JSONObject クラスを 使 えば 次 のように JSON データを 解 析 できます 01: String json = "<ここに JSON 形 式 の 文 字 列 を 指 定 する>"; 02: // JSON 形 式 の 文 字 列 を 指 定 して JSONObject オブジェクトを 生 成 する 03: JSONObject jsonobject = new JSONObject(json); 04: 05: // JSONObject オブジェクトに 含 まれる 名 前 を 取 得 する 06: Iterator i = jsonobject.keys(); 07: 08: // 名 前 と 値 のペアの 数 だけ 繰 り 返 す 09: for(int i = 0; i < jsonobject.length(); i++){ 10: // 名 前 を 取 得 する 11: String name = (String)iterator.next(); 12: // 名 前 をキーに 値 を 取 得 する 13: System.out.println(name + " : " + jsonobject.get(name)); 14: } このコードで 1 行 目 に JSON 形 式 の 文 字 列 として 次 の 文 字 列 を 指 定 したとします 文 字 列 内 では 二 重 引 用 符 (")を でエスケープしていることに 注 意 してください String json = "{ "name ": " 山 田 太 郎 ", "age ":35, "mail ": "taro@example.com "}"; コードを 実 行 すると 次 のような 結 果 になります 215

216 mail : taro@example.com age : 35 name : 山 田 太 郎 演 習 問 題 例 として 取 り 上 げた<person>タグの 例 に 住 所 を 表 す<address>タグと 電 話 番 号 を 表 す<phone> タグを 追 加 して XML データを 記 述 しなさい <address>タグはコンテンツとして 都 道 府 県 を 表 すタ グ 市 町 村 を 表 すタグ 番 地 を 表 すタグを 持 ち <phone>タグは 携 帯 電 話 かどうかを 表 す 属 性 を 持 ち コンテンツとして 電 話 番 号 を 持 つものとする 前 述 の XML データを JSON データとして 記 述 しなさい 216

217 Chapter 26 Android とは [シラバス No. 09 No. 10] 目 的 Android とは 何 かを 理 解 する Android アプリケーションの 開 発 環 境 を 準 備 する Android とは 何 か Android は スマートフォンやタブレットなどの 携 帯 端 末 向 けの OS です 実 際 には ラ イブラリ Android ランタイム 主 要 アプリケーションなどもまとめて 提 供 されています Android アプリケーションの 開 発 を 行 うために 必 要 な Android SDK (Software Development Kit)は 無 償 でダウンロードして 利 用 できます また Android はオープン ソースプロジェクトであるため ソースコードが 公 開 されています Android アプリケーションは Java で 開 発 します 開 発 したアプリケーションは Google Play で 公 開 して 販 売 することができます Android が 普 及 した 経 緯 2007 年 11 月 Google を 中 心 として OHA(Open Handset Alliance)というコンソーシ アムが 結 成 され 携 帯 端 末 向 けプラットフォーム Android の 開 発 を 推 進 することが 発 表 さ れました 2008 年 10 月 Android 1.0 を 搭 載 した 最 初 の Android 端 末 (T-Mobile G1)がリリース されました 2009 年 2 月 には 同 機 種 用 のアップデートとして Android 1.1 がリリースさ れ 同 年 4 月 に Android 月 に 月 に 2.0 とバージョンアップを 重 ねて いきます 同 時 に Android 搭 載 スマートフォンが 市 場 でのシェアを 広 げていきました スマートフ ォンの 世 界 市 場 では 2010 年 第 4 四 半 期 以 降 1 位 を 占 めています 日 本 でも 2010 年 度 通 期 (2010 年 4 月 ~2011 年 3 月 )の 携 帯 電 話 出 荷 台 数 の 半 数 以 上 を Android が 占 め その 後 も 利 用 者 数 が 伸 びています Android は Linux をベースとした OS であり オープンソースであることから 携 帯 端 末 に 限 らずさまざまな 機 器 に 移 植 できます 2012 年 には Android 搭 載 のスマートフォン と 連 動 する 家 電 が 登 場 しました 今 後 もさまざまな 分 野 で 活 用 されていくことでしょう Android のアーキテクチャ Android は 次 に 示 すように 複 数 の 階 層 から 構 成 されます 217

218 ホーム アプリケーション 連 絡 先 電 話 ブラウザ アプリケーションフレームワーク Activity Manager Window Manager Content Providers View System Package Manager Telephony Manager Resource Manager Location Manager Notification Manager Surface Manager ライブラリ Media Framework SQLite OpenGL ES FreeType WebKit SGL SSL libc Android ランタイム コア ライブラリ Dalvik 仮 想 マシン ディスプレイ ドライバ Linuxカーネル カメラ フラッシュメモリ バインダ(IPC) Binder(IPC) ドライバ ドライバ ドライバ キーパッド ドライバ Wi-Fi ドライバ オーディオ ドライバ 電 源 管 理 アプリケーション:メーラー カレンダー 地 図 ブラウザ 連 絡 先 などのコアアプリケーション アプリケーションフレームワーク:アプリケーション 開 発 に 利 用 可 能 な API ライブラリ:C/C++ のライブラリ Android ランタイム:コアライブラリと Dalvik 仮 想 マシン Linux カーネル:Linux 2.6 のセキュリティ メモリ 管 理 プロセス 管 理 ネットワーク ドライバなど のコアシステムサービス Dalvik 仮 想 マシン Android はでは Dalvik 仮 想 マシンを 採 用 しています Dalvik 仮 想 マシンは Google が 開 発 した Java 仮 想 マシンで メモリ 容 量 が 小 さい 携 帯 端 末 環 境 に 最 適 化 されています Android アプリケーションは 主 に Java で 開 発 しますが ソースコード(.java)をコンパ イルして 作 成 された Java バイトコード=クラスファイル(.class)を Dalvik バイトコード (.dex)に 変 換 して Dalvik 仮 想 マシン 上 で 実 行 します 218

219 Androidの ソースコード (.java) コンパイル Java バイトコード (.class) dxツールで 変 換 Dalvik バイトコード (.dex) Android SDK には Java バイトコードを Dalvik バイトコードに 変 換 するツールも 含 ま れています ただし Eclipse を 利 用 する 場 合 には 自 動 的 に 変 換 が 行 われるため この 変 換 を 意 識 する 必 要 はありません Android のバージョンと API Level Android の 各 バージョンには API Level が 割 り 当 てられています API Level とは Android が 提 供 するフレームワーク API を 識 別 する 整 数 値 のことです Android アプリケ ーションでは バージョンではなく API Level で 設 定 を 行 う 場 合 があるため 注 意 してく ださい Android のバージョンと API Level は 次 のとおりです(2013 年 1 月 時 点 ) バージョン API Level コード Android BASE Android BASE_1_1 Android CUPCAKE Android DONUT Android ECLAIR Android ECLAIR_0_1 Android 2.1.x 7 ECLAIR_MR1 Android 2.2.x 8 FROYO Android GINGERBREAD Android GINGERBREAD_MR1 219

220 Android 3.0.x 11 HONEYCOMB Android 3.1.x 12 HONEYCOMB_MR1 Android HONEYCOMB_MR2 Android ICE_CREAM_SANDWICH Android ICE_CREAM_SANDWICH_MR1 Android JELLY_BEAN Android JELLY_BEAN_MR Android アプリケーション 開 発 環 境 の 準 備 Android アプリケーションは Eclipse を 使 って 開 発 します そのために Eclipse に 加 え Android SDK と ADT(Android Development Tools)プラグインが 必 要 です ここでは Windows 7(32 ビット)に Java SE 6 Update 38 Eclipse Pleiades をインストール 済 みであることを 前 提 に Android アプリケーションの 開 発 環 境 を 構 築 する 方 法 を 説 明 します なお 本 教 科 書 では Android 2.3.3(API Level 10)を 使 うものとしま す Android SDK のインストール Android Developers の Get the Android SDK にアクセスします URL: DOWNLOAD FOR OTHER PLATFORMS をクリックし SDK Tools Only で Windows の installer_r windows.exe をクリックします 220

221 Terms and Conditions を 読 み I have read and agree with the above terms and conditions チェックボックスをオンにして Download installer_r windows.exe をクリックします installer_r windows.exe を 任 意 のフォルダにダウンロードして 実 行 すると Android SDK のセットアップが 開 始 します [Next]ボタンをクリックし 画 面 の 指 示 に 従 ってインストールを 行 います 最 後 に[Finish]ボタンをクリックして 完 了 です ADT プラグインのインストール Eclipse に ADT プラグインをインストールします Eclipse を 起 動 し [ヘルプ]メニューの[ 新 規 ソフトウェアのインストール]を 選 択 し [ 追 加 ]ボタンをクリックします 221

222 [ 名 前 ] に ADT プ ラ グ イ ン [ ロ ケ ー シ ョ ン ] に を 入 力 して[OK]ボタンをクリックします [ 使 用 可 能 なソフトウェア] 画 面 で[ 名 前 ] 欄 に 表 示 されている 開 発 ツール をオン にして[ 次 へ]ボタンをクリックします 222

223 [インストール 詳 細 ] 画 面 でインストールされる 開 発 ツールを 確 認 して[ 次 へ]ボタン をクリックします [ライセンスのレビュー] 画 面 で[ 使 用 条 件 の 条 項 に 同 意 します]を 選 択 し [ 完 了 ]ボ タンをクリックするとインストールが 開 始 します 223

224 Eclipse を 再 起 動 します Android SDK のコンポーネントのインストール SDK Manager を 使 って Android SDK のコンポーネントをインストールします Eclipse の[ヘルプ]メニューの[Android SDK マネージャー]を 選 択 します [Android SDK Manager] 画 面 で[Tools]と[Android 2.3.3]をオンにして [Install] ボタンをクリックします [Choose Packages to Install] 画 面 が 表 示 されたら [Accept All] 224

225 を 選 択 して [Install]ボタンをクリックします インストールが 完 了 したら SDK Manager を 終 了 します Android エミュレータと AVD Android アプリケーション 開 発 では Android 端 末 またはエミュレータで 開 発 したアプリ ケーションのデバッグやテストを 行 います Android エミュレータとは パソコン 上 で 実 行 可 能 な 仮 想 端 末 ソフトウェアです エミュレータを 実 行 するには AVD(Android Virtual Device)を 作 成 します AVD の 作 成 Eclipse を 起 動 し [ウィンドウ]メニューの[Android 仮 想 デバイス マネージャー] を 選 択 します 225

226 [ 新 規 ]ボタンをクリックして [ 新 規 Android 仮 想 デバイスの 作 成 (AVD)] 画 面 で 次 のように 入 力 または 選 択 します [ターゲット] 以 外 は 任 意 ですが [ 装 置 ] はタブレットではなくスマートフォンの 画 面 の 解 像 度 を 選 択 してください [ 名 前 ]:JavaForAndroid [ 装 置 ]:4 インチ WVGA など [ターゲット]:Android API Level 10 [SD カード]-[サイズ]:64 [OK]ボタンをクリックすると AVD が 作 成 されま す 作 成 した JavaForAndroid を 選 択 して[ 開 始 ]ボタ ンをクリックし [ 起 動 オプション] 画 面 で[ 起 動 ]ボ タンをクリックすると エミュレータが 起 動 します 226

227 メモ Android Developers サイト( ADT Bundle を 提 供 しています ADT Bundle は Eclipse+ADT プラグインや Android SDK などを 1 つにまとめたもので より 簡 単 に Android アプリケーション 開 発 を 始 められるようにすることを 目 的 としています ADT Bundle をダ ウンロードして 展 開 したフォルダにある eclipse.exe を 実 行 すると Eclipse が 起 動 します 演 習 問 題 Android エミュレータを 起 動 して [MENU]ボタン 各 種 のアプリケーション 設 定 などを 操 作 し ど のような 機 能 を 利 用 できるか 確 認 しなさい 227

228 Chapter 27 Android アプリケーション [シラバス No. 09] 目 的 Android プロジェクトの 作 成 し その 構 造 を 理 解 する AndroidManifest.xml の 概 要 を 理 解 する リソースファイルについて 理 解 する Android プロジェクトの 作 成 と 構 造 Android プロジェクトの 作 成 Eclipse を 使 って 簡 単 な Android アプリケーションを 作 成 してみましょう Eclipse で Android アプリケーションを 作 成 するには Android プロジェクトを 作 成 します Eclipse を 起 動 し [ファイル]メニューの[ 新 規 ]-[プロジェクト]を 選 択 します [ウ ィザードを 選 択 ] 画 面 で[Android]を 展 開 して[Android プロジェクト]を 選 択 し [ 次 へ]ボタンをクリックします [ 新 規 Android アプリケーション] 画 面 でアプリケーション 名 などを 次 のように 入 力 ま たは 選 択 して [ 次 へ]ボタンをクリックします [Application Name]:HelloAndroid [Project Name]:HelloAndroid [Package Name]:com.example [Minimum Required SDK]:API 8: Android 2.2(Froyo)(デフォルト 値 ) [Target SDK]:API 10: Android 2.3.3(Gingerbread) [Compile With]:API 10: Android 2.3.3(Gingerbread) [Theme]:API 10: Android 2.3.3(Gingerbread) 228

229 次 の 画 面 ではデフォルトの 設 定 のまま[ 次 へ]ボタンをクリックします 229

230 最 後 の 画 面 で[ 完 了 ]ボタンをクリックします [パッケージ エクスプローラー]に HelloAndroid プロジェクトが 作 成 されます 230

231 Android プロジェクトの 構 造 Android プロジェクトを 作 成 すると プロジェクト 内 にさまざまなフォルダやファイルが 自 動 的 に 作 成 されます [パッケージ エクスプローラー]で HelloAndroid プロジェクト を 展 開 してみましょう src フォルダ Android アプリケーションを 構 成 する Activity のソースコード(MainActivity.java)が 生 成 されます res フォルダ Android アプリケーションで 利 用 するリソースを 格 納 するフォルダです レイアウト メ ニュー 文 字 列 などのリソースが 自 動 的 に 生 成 されます AndroidManifest.xml Android アプリケーションの 設 定 を 行 うためのファイルです 231

232 Android プロジェクトの 実 行 HelloAndroid プロジェクトを 実 行 してみましょう [パッケージ エクスプローラー]で HelloAndroid プロジェクトを 選 択 し [ 実 行 ]メ ニューの[ 実 行 ]-[Android アプリケーション]を 選 択 します エミュレータが 起 動 し HelloAndroid プロジェクトが 実 行 されます Activity Android プロジェクトを 作 成 する 際 に[アクティビティーの 作 成 ]を 選 択 する(デフォル ト)と 自 動 的 に Activity のソースコードが 生 成 されます Activity は Android アプリ ケーションを 構 成 するコンポーネントの 1 つで UI 画 面 を 持 ちます Android アプリケー ションは 基 本 的 に 1 つ 以 上 の Activity で 構 成 します HelloAndroid プロジェクトでは MainActivity が 自 動 的 に 生 成 されました HelloAndroid プロジェクトを 実 行 すると この MainAtivity が 最 初 に 起 動 されます MainActivity クラ スのコードを 見 てみましょう 01: package com.example; 02: 03: import android.os.bundle; 04: import android.app.activity; 05: import android.view.menu; 06: 07: public class MainActivity extends Activity { 08: 232

233 10: protected void oncreate(bundle savedinstancestate) { 11: super.oncreate(savedinstancestate); 12: setcontentview(r.layout.activity_main); 13: } 14: 16: public boolean oncreateoptionsmenu(menu menu) { 17: // Inflate the menu; 18: getmenuinflater().inflate(r.menu.activity_main, menu); 19: return true; 20: } 21: } 10 行 目 の oncreate メソッドは Activity のライフサイクルメソッドの 1 つです Activity が 起 動 されると 最 初 に oncreate メソッドが 呼 び 出 されます oncreate メソッドでは Android アプリケーションの 実 行 に 必 要 な 処 理 を 行 います 12 行 目 の setcontentview メソッドは レイアウトを 設 定 するメソッドです Activity が 表 示 する 画 面 レイアウトは このメソッドに 指 定 するレイアウトファイル( 詳 細 は 後 述 )に 指 定 します 16 行 目 の oncreateoptionsmenu メソッドは アプリケーションでオプションメニュー を 利 用 する 際 に 必 要 なメソッドです オプションメニューとは [MENU]ボタンを 押 した ときに 表 示 されるメニューのことです HelloAndroid プロジェクトでは 次 のようなメニュ ーが 表 示 されます Activity の 詳 細 については Chapter 30 で 説 明 します 233

234 27-03 AndroidManifest.xml AndroidManifest.xml は Android アプリケーションを 設 定 するためのファイルで XML で 記 述 します Android アプリケーションは 必 ず AndroidManifest.xml を 持 ちます HelloAndroid プロジェクトでは 次 のような AndroidManifest.xml が 生 成 されます 01: <?xml version="1.0" encoding="utf-8"?> 02: <manifest xmlns:android=" 03: package="com.example" 04: android:versioncode="1" 05: android:versionname="1.0" > 06: 07: <uses-sdk 08: android:minsdkversion="8" 09: android:targetsdkversion="10" /> 10: 11: <application 12: android:allowbackup="true" 13: 14: 15: > 16: <activity 17: android:name="com.example.mainactivity" 18: > 19: <intent-filter> 20: <action 21: android:name="android.intent.action.main" /> 22: <category 23: android:name="android.intent.category.launcher" /> 24: </intent-filter> 25: </activity> 26: </application> 27: </manifest> <manifest>タグ AndroidManifest.xml のルートタグで 必 ず 1 つ 記 述 します 複 数 記 述 することはでき ません <manifest>タグの 子 として<application>タグや<uses-sdk>タグなどを 記 述 します <manifest>タグには 次 のような 属 性 を 指 定 します package 属 性 :アプリケーションのパッケージ 名 android:versioncode 属 性 :アプリケーションのバージョンを 示 す 整 数 android:versionname 属 性 :アプリケーションのバージョンを 示 す 文 字 列 (ユーザ 表 示 用 ) <application>タグ Android アプリケーションに 関 する 情 報 を 記 述 します 234

235 <application> タ グ の 子 と し て <activity> タ グ <service> タ グ <provider> タ グ <receiver>タグなどを 記 述 します <application>タグでは 次 のような 属 性 を 指 定 します android:description 属 性 :アプリケーションの 説 明 android:icon 属 性 :アプリケーションのアイコン android:label 属 性 :アプリケーションのラベル android:debuggable 属 性 :ユーザモードでのデバッグの 可 否 android:permission 属 性 :アプリケーションの 実 行 に 必 要 なパーミッション android:theme 属 性 :アプリケーションに 適 用 するテーマ <activity>タグ Activity に 関 する 情 報 を 記 述 します アプリケーションに 複 数 の Activity が 含 まれてい る 場 合 Activity ごとに<activity>タグを 記 述 します <activity>タグの 子 として<intent-filter>タグなどを 記 述 します <activity>タグでは 次 のような 属 性 を 指 定 します android:name 属 性 :Activity のクラス 名 android:icon 属 性 :Activity のアイコン android:label 属 性 :Activity のラベル <intent-filter>タグ Activity などのコンポーネントは Intent という 非 同 期 メッセージをやりとりします <intent-filter>タグは Activity がどの 種 類 の Intent を 受 け 取 るかを 指 定 します 子 として <action>タグ <category>タグ <data>タグを 記 述 します <uses-sdk>タグ <manifest>タグの 子 として 記 述 します android:minsdkversion 属 性 には アプリケー ションが 必 要 とする Android のバージョンを API Level で 指 定 します リソースファイル Android プロジェクトを 作 成 すると プロジェクト 内 に res フォルダが 作 成 されます res フォルダは リソースファイルを 格 納 するフォルダです Android アプリケーションでは 画 面 レイアウト 文 字 列 メニューなどを XML で 定 義 してリソースとして 利 用 します これらのリソースは プログラムや 他 のリソースファイ ルからリソース ID で 参 照 できます 235

236 res フォルダ res フォルダ 内 の 各 フォルダには 次 のようなリソースファイルを 格 納 します res/layout フォルダ:レイアウト res/values フォルダ: 文 字 列 スタイルなど res/menu フォルダ:メニュー res/drawable フォルダ: 画 像 レイアウトファイル 画 面 レイアウトを 定 義 するファイルです HelloAndroid プロジェクトでは res/layout フ ォルダに activity_main.xml というレイアウトファイルが 生 成 されます 01: <RelativeLayout xmlns:android=" 02: xmlns:tools=" 03: android:layout_width="match_parent" 04: android:layout_height="match_parent" 05: tools:context=".mainactivity" > 06: 07: <TextView 08: android:layout_width="wrap_content" 09: android:layout_height="wrap_content" 10: android:layout_centerhorizontal="true" 11: android:layout_centervertical="true" 12: /> 13: 14: </RelativeLayout> <RelativeLayout>タグは 画 面 上 に UI 部 品 をどのように 配 置 するかを 指 定 します <TextView>タグは UI 部 品 の 1 つである TextView を 定 義 します TextView は 文 字 列 を 表 示 するための UI 部 品 です TextView に 表 示 する 文 字 列 は <TextView>タグの android:text 属 性 に 指 定 されていま す android:text="@string/hello_world" "@string/hello_world"は hello_world という 名 前 の 文 字 列 リソースを 参 照 することを 示 します リソースファイルなどの XML ファイルからリソースを 参 照 する 場 合 は 次 のよう に 記 述 種 類 >/<リソース 名 > 236

237 HelloActivity クラスの oncreate メソッドでは setcontentview メソッドでこのレイア ウトファイルを 次 のように 指 定 しています setcontentview(r.layout.activity_main); レイアウトファイルをプログラムから 参 照 する 場 合 は 次 の 形 式 でを 指 定 します R.<リソースの 種 類 >.<リソース 名 > レイアウトファイルの 詳 細 については Chapter 28 で 説 明 します 文 字 列 リソースファイル アプリケーションで 使 う 文 字 列 をリソースファイルとして 定 義 します 画 面 レイアウ トを 定 義 するファイルです HelloAndroid プロジェクトでは res/values フォルダに strings.xml という 文 字 列 リソースファイルが 生 成 されます 01: <?xml version="1.0" encoding="utf-8"?> 02: <resources> 03: 04: <string name="app_name">helloandroid</string> 05: <string name="hello_world">hello world!</string> 06: <string name="menu_settings">settings</string> 07: 08: </resources> 文 字 列 リソースは <string>タグで 定 義 します name 属 性 には 文 字 列 リソースの 名 前 <string>タグのコンテンツに 文 字 列 を 指 定 します 5 行 目 は activity_main.xml で 参 照 している 文 字 列 リソースであることに 注 意 してくだ さい Eclipse で 5 行 目 を 次 のように 変 更 し HelloAndroid プロジェクトを 実 行 してみま しょう <string name="hello_world">hello Android</string> 画 面 に 表 示 される 文 字 列 が 次 のように 変 わります 237

238 演 習 問 題 Android プロジェクトを 作 成 して 実 行 し エミュレータが 動 作 することを 確 認 しなさい Android プロジェクトの 文 字 列 リソースの 内 容 を 変 更 した 後 実 行 して 変 更 した 文 字 列 が 表 示 さ れることを 確 認 しなさい 238

239 Chapter 28 Android の GUI プログラミング~その 1 [シラバス No. 15] 目 的 View と ViewGroup の 概 要 を 理 解 する レイアウトファイルの 作 成 方 法 を 理 解 する View と ViewGroup View とは Android でも Java と 同 様 に 複 数 の UI 部 品 を 配 置 して UI 画 面 を 構 成 します その UI 部 品 のスーパークラスに 当 たるのが android.view.view クラスです Java の GUI プログラ ミングで 使 う JComponent クラスと 同 じ 位 置 付 けです UI 部 品 と 使 用 するのは View クラスを 継 承 するサブクラスです android.widget パッ ケージでは UI 部 品 として 利 用 できる View クラスのサブクラスが 数 多 く 定 義 されていま す これらをウィジェットといいます クラス TextView ImageView Button ImageButton EditText CheckBox RadioButton PopupMenu 説 明 テキスト 表 示 の View 画 像 表 示 用 の View ボタン 画 像 ボタン テキスト 編 集 用 の View チェックボックス ラジオボタン ポップアップメニュー ViewGroup とは ViewGroup は View クラスのサブクラスで ウィジェットなど 他 の View を 配 置 できる 特 別 な View です Java の GUI プログラミングで 使 うコンテナとレイアウトマネージャの 機 能 を 備 え レイアウトと 呼 ばれます 主 なレイアウトは android.widget パッケージで 提 供 されています クラス FrameLayout LinearLayout UI 部 品 を 1 つ 表 示 する 説 明 UI 部 品 を 横 または 縦 に 並 べて 表 示 する 239

240 GridLayout TableLayout RelativeLayout UI 部 品 を 格 子 状 に 表 示 する UI 部 品 を 行 列 の 形 式 で 表 示 する UI 部 品 を 相 互 の 相 対 的 な 位 置 に 基 づいて 表 示 する レイアウトファイルの 作 成 画 面 レイアウトは XML で 定 義 し プロジェクトの res/layout フォルダに 格 納 します テ キストエディタなどで XML を 記 述 することもできますが ここでは Eclipse を 利 用 してレ イアウトファイルを 作 成 してみましょう FrameLayout の 例 Chapter 27 で 作 成 した HelloAndroid を 利 用 し FramLayout に TextView を 配 置 するレ イアウトファイルを 作 成 します Eclipse を 起 動 して[ファイル]メニューの[ 新 規 ]-[その 他 ]を 選 択 します [ウィ ザードを 選 択 ] 画 面 で[Android]を 展 開 して[Android XML レイアウト ファイル]を 選 択 し [ 次 へ]ボタンをクリックします [New Android Layout XML File] 画 面 で[ファイル]に frame_sample.xml と 入 力 し [ルート 要 素 ]で FramLayout を 選 択 します [ 完 了 ]ボタンをクリックします 240

241 [ 完 了 ]ボタンをクリックすると レイアウトエディタが 起 動 し 生 成 された frame_sample.xml が 表 示 されます レイアウトエディタはグラフィカルにレイアウトファ イルを 編 集 できるツールです Android の API Level(Android のアイコンの 横 の 数 字 )を 10 に 変 更 してください [Palette]の[Form Widgets]にある TextView をクリックし Android 画 面 にドラッ グしてドロップします FrameLayout に TextView が 配 置 されます 241

242 配 置 した TextView を 右 クリックして[Edit Text]を 選 択 すると TextView に 表 示 する 文 字 列 を 設 定 する[Resource Chooser] 画 面 が 表 示 されます 画 面 の 下 部 にあるボックスに 表 示 する 文 字 列 を 入 力 して 設 定 することもできますが [New String]ボタンをクリックして 新 しい 文 字 列 リソースを 作 成 してみましょう [Create New Android String] 画 面 で[ストリング]に FrameLayout Sample [New R.string.(R)]に frame_sample_string と 入 力 して[OK]ボタンをクリックします この 文 字 列 リソースは R.string.frame_sample_string という ID で 参 照 されることになり ます 242

243 [Resource Chooser] 画 面 で frame_sample_string を 選 択 し [OK]ボタンをクリ ックします レイアウトエディタの 画 面 に 配 置 した TextView の 文 字 列 が FrameLayout Sample に なります 243

244 [ファイル]メニューの[ 保 管 ]を 選 択 して 変 更 を 保 存 します FrameLayout を 利 用 したレイアウトファイル frame_sample.xml の 内 容 は 次 のようになります 01: <?xml version="1.0" encoding="utf-8"?> 02: <FrameLayout xmlns:android=" 03: android:layout_width="match_parent" 04: android:layout_height="match_parent" > 05: 06: <TextView 07: 08: android:layout_width="wrap_content" 09: android:layout_height="wrap_content" 10: /> 11: 12: </FrameLayout> <FrameLayout>タグ FrameLayout の 定 義 です 子 には 配 置 する View や 別 のレイアウトを 指 定 します <TextView>タグ FrameLayout に 配 置 される TextView の 定 義 です これらのタグには 次 の 属 性 を 指 定 できます android:id 属 性 android:layout_width 値 このレイアウトを 識 別 するための <ID の 文 字 列 > ) レイアウトの 幅 244

245 android:layout_height android:text レイアウトの 高 さ (TextView) 表 示 する 文 字 列 android:layout_width 属 性 および android:layout_height 属 性 には 次 の 値 を 指 定 できま す UI 部 品 のサイズ: 数 値 + 単 位 (dp や px など)を 指 定 する match_parent: 親 の View に 収 まる 最 大 のサイズに 調 整 することを 示 す b: 文 字 列 などが 収 まるサイズに 調 整 することを 示 す <TextView>タグの android:text 属 性 には TextView に 表 示 する 文 字 列 を 指 定 します ここでは 作 成 した 文 字 列 リソースの ID を 指 定 しています android:text="@string/frame_sample_string" レイアウトファイルの 適 用 HelloAndroid プロジェクトの MainActivity クラスで setcontentview メソッドの 呼 び 出 しを 次 のように 変 更 します setcontentview(r.layout.frame_sample); 変 更 を 保 存 し [ 実 行 ]メニューの[ 実 行 ]を 選 択 して HelloAndroid プロジェクトを 実 行 すると 次 のように 表 示 されます 245

246 LinearLayout の 例 続 いて LinearLayout に Button と TextView を 横 に 並 べて 配 置 するレイアウトファイ ルを 作 成 します Eclipse を 起 動 して[ファイル]メニューの[ 新 規 ]-[その 他 ]を 選 択 します [ウィ ザードを 選 択 ] 画 面 で[Android]を 展 開 して[Android XML レイアウト ファイル]を 選 択 し [ 次 へ]ボタンをクリックします [New Android Layout XML File] 画 面 で[ファイル]に linear_sample.xml と 入 力 し [ルート 要 素 ]で LinearLayout を 選 択 します [ 完 了 ]ボタンをクリックします レイアウトエディタが 起 動 し 生 成 された linear_sample.xml が 表 示 されたら Android の API Level を 10 に 変 更 します 画 面 を 右 クリックして[ 向 き]-[ 水 平 方 向 ]を 選 択 します LinearLayout はデフォル トでは 垂 直 方 向 に View を 配 置 します 246

247 [Palette]の[Form Widgets]にある Button をクリックし Android 画 面 にドラッグ してドロップします 同 様 に TextView をドラッグ&ドロップして Button の 横 に 配 置 しま す Button と TextView に 表 示 されている 文 字 列 を 変 更 します 変 更 方 法 は FrameLayout の 例 を 参 照 してください Button: 文 字 列 を ボタン ID を button_string とする 文 字 列 リソースを 作 成 して 設 定 する TextView: 文 字 列 を テキスト ID を textview_string とする 文 字 列 リソースを 作 成 して 設 定 す る 最 終 的 な 画 面 は 次 のようになります [ファイル]メニューの[ 保 管 ]を 選 択 して 変 更 を 保 存 します 247

248 LinearLayout を 利 用 したレイアウトファイル linear_sample.xml の 内 容 は 次 のようになります 01: <?xml version= 1.0 encoding= utf-8?> 02: <LinearLayout xmlns:android=" 03: android:layout_width="match_parent" 04: android:layout_height="match_parent" 05: android:orientation="horizontal" > 06: 07: <Button 08: 09: android:layout_width="wrap_content" 10: android:layout_height="wrap_content" 11: /> 12: 13: <TextView 14: 15: android:layout_width="wrap_content" 16: android:layout_height="wrap_content" 17: /> 18: 19: </LinearLayout> <LinearLayout>タグ LinearLayout の 定 義 です 子 には 配 置 する View や 別 のレイアウトを 指 定 します <LinearLayout> タ グ に は android:orientation 属 性 で 配 置 方 向 を 指 定 します horizontal は 水 平 方 向 vertical は 垂 直 方 向 です <Button>タグ LinearLayout に 配 置 される Button の 定 義 です これらのタグに 指 定 する 属 性 の 意 味 は FrameLayout の 例 と 同 じです レイアウトファイルの 適 用 HelloAndroid プロジェクトの MainActivity クラスで setcontentview メソッドの 呼 び 出 しを 次 のように 変 更 します 変 更 を 保 存 し [ 実 行 ]メニューの[ 実 行 ]を 選 択 して HelloAndroid プロジェクトを 実 行 すると 次 のように 表 示 されます 248

249 レイアウトのネスト LinearLayout などのレイアウトは ネストして 利 用 できます すなわち レイアウトの 子 としてレイアウトを 指 定 することが 可 能 です たとえば 次 の 画 面 は LinearLayout に TextView と LinearLayout を 配 置 し ネスト した LinearLayout にボタンを 3 つ 配 置 しています 演 習 問 題 LinearLayout を 使 って 3 つ 以 上 の View を 垂 直 に 配 置 するレイアウトファイルを 作 成 し 実 行 して 画 面 を 確 認 しなさい 最 後 に 示 した 画 面 を 表 示 するレイアウトファイルを 作 成 し 実 行 して 画 面 を 確 認 しなさい 249

250 Chapter 29 Android の GUI プログラミング~その 2 [シラバス No. 15] 目 的 Android のイベント 処 理 の 概 要 複 数 のイベントへの 対 応 を 考 える Android のイベント 処 理 Chapter 28 で 作 成 したプロジェクトを 実 行 し ボタンをクリックしても 何 も 起 こりませ ん これはイベント 処 理 を 行 っていないからです Android でも Java の GUI プログラミ ングと 同 じようにイベント 処 理 を 行 う 必 要 があります イベント 処 理 の 手 順 Android でのイベント 処 理 の 手 順 は Java の 場 合 とほぼ 同 じです 58. イベントリスナーインタフェースを 実 装 するクラスを 作 成 し イベントハンドラメソッドにイ ベントに 対 応 する 処 理 を 記 述 する 59. イベントリスナーの 実 装 クラスのオブジェクトを 生 成 し ボタンなどの View のオブジェクト に 登 録 する 60. ボタンのクリックなどのイベントが 発 生 すると 登 録 したイベントリスナーのイベントハンド ラメソッドがされる イベントリスナーの 種 類 View で 発 生 するイベントを 捕 捉 するイベントリスナーは android.view パッケージに 含 まれています また イベントリスナーを 登 録 するメソッドは View クラスで 定 義 されて います View.OnClickListener インタフェース/onClick メソッド/setOnClickListener メソッド View へのクリックが 発 生 すると View.OnClickListener インタフェースの onclick メソ ッドが 呼 び 出 されます onclick メソッドには 引 数 としてイベントの 発 生 元 の View が 渡 さ れます View.OnLongClickListener インタフェース/onLongClick メソッド/ setonlongclicklistener メソッド View への 長 押 し(ロングクリック)が 発 生 すると View.OnLongClickListener インタ フェースの onclick メソッドが 呼 び 出 されます onlongclick メソッドには 引 数 としてイ 250

251 ベントの 発 生 元 の View が 渡 されます View.OnTouchListener インタフェース/onTouch メソッド/setOnTouchListener メソッ ド View へのタッチが 発 生 すると View.OnTouckListener インタフェースの ontouch メソ ッドが 呼 び 出 されます ontouch メソッドには 引 数 としてイベントの 発 生 元 の View とイベ ントの 詳 細 情 報 を 含 む MotionEvent が 渡 されます View.OnKeyListener インタフェース/onKey メソッド/setOnKeyListener メソッド View へのキー 入 力 が 発 生 すると View.OnKeyListener インタフェースの onkey メソッ ドが 呼 び 出 されます onkey メソッドには 引 数 として イベントの 発 生 元 の View 押 され たキーを 示 すコード イベントの 詳 細 情 報 を 含 む KeyEvent が 渡 されます ボタンのクリックのイベント 処 理 Chapter 28 でレイアウトファイルを 作 成 した HelloAndroid プロジェクトに ボタンの クリックのイベント 処 理 を 追 加 してみましょう ボタンがクリックされたときに ボタン にクリックされた 回 数 が 表 示 されるようにします 具 体 的 な 手 順 は 次 のとおりです 61. HelloAndroid プロジェクトの MainActivity クラスに View.OnClickListener インタフェースを 実 装 する 62. MainActivity クラスにonClick メソッドを 追 加 し ボタンのクリック 回 数 を 設 定 する 処 理 を 記 述 する 63. MainActivity クラスの oncreate メソッドに setonclicklistener メソッドでイベントリスナー を 登 録 する 処 理 を 記 述 する View.OnClickListener インタフェースの 実 装 MainActivity クラスは 次 のように 定 義 されています public class MainActivity extends Activity { Eclipse で HelloAndroid プロジェクトの MainActivity.java を 開 き extends Activity の うしろに implements On と 入 力 して [ 編 集 ]メニューの[コンテンツ アシスト]- [デフォルト]を 選 択 するか Ctrl キー+スペースキーを 押 します すると 実 装 するイ ンタフェースの 候 補 が 表 示 されるので OnClickListener-android.view.View を 選 択 し ます 251

252 MainActivity クラスの 定 義 の 横 には 赤 い マークが 付 いています これはソースコード 内 にエラーがあるという 意 味 です この マークにカーソルを 合 わせると エラーの 内 容 が 表 示 されます さらに マークをクリックすると その 対 処 方 法 が 表 示 されます 実 装 されていないメソッドの 追 加 を 選 択 すると MainActivity クラスに 次 のように onclick メソッドが 追 加 されます 252

253 02: public void onclick(view v) { 03: // TODO 自 動 生 成 されたメソッド スタブ 04: 05: } onclick メソッドの 記 述 onclick メソッドの 引 数 はイベントが 発 生 した View です この 場 合 は ボタンになりま す ボタンは レイアウトファイル(linear_sample.xml)で 次 のように 定 義 されています 01: <Button 02: android:id="@+id/button1" 03: android:layout_width="wrap_content" 04: android:layout_height="wrap_content" 05: android:text="@string/button_string" /> ボタンは android.widget.button クラスで 表 されます Button クラスの settext メソッ ドを 使 えばボタンの 文 字 列 を 設 定 できます MainActivity クラスにクリック 回 数 を 保 持 する private フィールドを 宣 言 します private int cnt = 0; onclick メソッドに 次 のように 記 述 して クリック 回 数 を 示 す 文 字 列 を 設 定 します Button b = (Button)v; b.settext((++cnt) + " 回 目 "); このように 入 力 すると 最 初 の 行 に Button を 型 に 解 決 できません というエラーメッ セージが 表 示 されます マークをクリックして Button をインポートします (android.widget) を 選 択 すると Button クラスをインポートする import 文 が 追 加 され ます イベントリスナーの 登 録 MainActivity クラスの oncreate メソッドに イベントリスナーを 登 録 するために setonclicklistener メソッドの 呼 び 出 しを 追 加 します public void setonclicklistener(onclicklistener l) setonclicklistener メソッドの 引 数 には View.OnClickListener インタフェースを 実 装 し たクラスのオブジェクトを 渡 します この 場 合 は MainActivity クラス 自 体 を 表 す this で す 253

254 イベントリスナーを 登 録 するのはボタンですが ボタンは linear_sample.xml で 定 義 さ れています そのため このレイアウトファイルから 次 のメソッドでボタンのオブジェク トを 取 得 します public final View findviewbyid(int id) findviewbyid メソッドには レイアウトファイルで 定 義 されているボタンのリソース ID を 指 定 します また 戻 り 値 として View クラス 型 を 返 すため 次 のように 記 述 できます findviewbyid(r.id.button1).setonclicklistener(this); なお メソッド 名 を 入 力 する 際 にも[ 編 集 ]メニューの[コンテンツ アシスト]-[デ フォルト]を 選 択 するか Ctrl キー+スペースキーを 押 すことで Eclipse のコード 補 完 機 能 を 利 用 できます MainActivity クラスは 次 のようになります 01: package com.example; 02: 03: import android.os.bundle; 04: import android.app.activity; 05: import android.view.menu; 06: import android.view.view; 07: import android.view.view.onclicklistener; 08: import android.widget.button; 09: 10: public class MainActivity extends Activity 11: implements OnClickListener { 12: private int cnt = 0; // クリックの 回 数 13: 15: protected void oncreate(bundle savedinstancestate) { 16: super.oncreate(savedinstancestate); 17: setcontentview(r.layout.linear_sample); 18: findviewbyid(r.id.button1).setonclicklistener(this); 19: } 20: // ( 省 略 ) 22: public void onclick(view v) { 23: // TODO 自 動 生 成 されたメソッド スタブ 24: Button b = (Button)v; 25: b.settext((++cnt) + " 回 目 "); 26: } 27: } HelloAndroid プロジェクトを 実 行 し ボタンをクリックして 表 示 が 変 わることを 確 認 し てください 254

255 匿 名 の 内 部 クラス ここでは MainActivity クラスに View.OnClickListener インタフェースを 実 装 しました が 次 のように 匿 名 の 内 部 クラスを 利 用 することもできます 01: public class MainActivity extends Activity { 02: private int cnt = 0; 03: 05: protected void oncreate(bundle savedinstancestate) { 06: super.oncreate(savedinstancestate); 07: setcontentview(r.layout.linear_sample); 08: findviewbyid(r.id.button1).setonclicklistener( 09: new OnClickListener() { 11: public void onclick(view v) { 12: // TODO 自 動 生 成 されたメソッド スタブ 13: Button b = (Button)v; 14: b.settext((++cnt) + " 回 目 "); 15: } 16: }); 17: } 18: } 複 数 のイベントへの 対 応 複 数 のイベントの 発 生 ボタンなどの View をクリックすると 複 数 のイベントが 次 の 順 番 に 発 生 します 64. タッチ( 指 が 画 面 に 触 れた) 65. ロングクリック( 一 定 時 間 以 上 長 押 しした 場 合 ) 66. タッチ( 指 が 画 面 から 離 れた) 255

256 67. クリック これらのイベントはそれぞれ 次 のイベントリスナー/イベントハンドラメソッドで 対 応 します View.OnTouchListener インタフェース/onTouch メソッド(MotionEvent.ACTION_DOWN) View.OnLongClickListener インタフェース/onLongClick メソッド View.OnTouchListener インタフェース/onTouch メソッド(MotionEvent.ACTION_UP) View.OnClickListener インタフェース/onClick メソッド タッチやロングクリックによってイベント 処 理 の 内 容 を 変 える 場 合 には イベントの 発 生 順 に 注 意 する 必 要 があります 複 数 のイベントへの 対 応 では 実 際 にイベントの 発 生 順 を 確 認 してみましょう HelloAndroid プロジェクトに さらに View.OnTouchListener インタフェースと View.OnLongClickListener インタフェースを 実 装 し ontouch メソッドと onlongclick メソッドを 追 加 します 01: public class MainActivity extends Activity 02: implements OnClickListener, 03: OnTouchListener, 04: OnLongClickListener { 05: 06: // ( 略 ) 08: public boolean ontouch(view v, MotionEvent event) { 09: // TODO 自 動 生 成 されたメソッド スタブ 10: return false; 11: } 12: 14: public boolean onlongclick(view v) { 15: // TODO 自 動 生 成 されたメソッド スタブ 16: return false; 17: } 18: } ontouch メソッドと onlongclick メソッドでは android.util.log クラスのメソッドを 使 って Eclipse の[LogCat]ビューにメッセージを 出 力 します Log クラスでは 次 のメソ ッドを 提 供 しています static int d(string tag, String msg) 256

257 [LogCat]ビューにデバッグ 情 報 を 出 力 する 際 に 使 います static int e(string tag, String msg) [LogCat]ビューに 致 命 的 なエラーの 情 報 を 出 力 する 際 に 使 います static int w(string tag, String msg) [LogCat]ビューに 警 告 レベルのエラーの 情 報 を 出 力 する 際 に 使 います static int i(string tag, String msg) [LogCat]ビューにアプリケーション 関 連 の 情 報 を 出 力 する 際 に 使 います static int v(string tag, String msg) [LogCat]ビューに 詳 細 な 情 報 を 出 力 する 際 に 使 います ここでは Log.i メソッドを 使 います 第 1 引 数 はログの 出 力 元 を 示 す 文 字 列 第 2 引 数 は 出 力 するメッセージです 02: public boolean ontouch(view v, MotionEvent event) { 03: // TODO 自 動 生 成 されたメソッド スタブ 04: String[] s = {"ACTION_DOWN", "ACTION_UP"}; 05: Log.i("HelloAndroid", "ontouch - " + s[event.getaction()]); 06: return false; 07: } 08: 10: public boolean onlongclick(view v) { 11: // TODO 自 動 生 成 されたメソッド スタブ 12: Log.i("HelloAndroid", "onlongclick"); 13: return false; 14: } android.view.motionevent クラスでは View を 指 で 押 したことを 示 す ACTION_DOWN と View から 指 を 離 したことを 示 す ACTION_UP という 定 数 が 定 義 されています それ ぞれの 値 は 0 と 1 なので String クラス 型 の 配 列 を 定 義 してその 定 数 を 示 す 文 字 列 をメッ セージに 付 加 しています onclick メソッドにも Log.i メソッドの 呼 び 出 しを 追 加 します Log.i("HelloAndroid", "onclick"); oncreate メソッドには ボタンに View.OnTouchListener View.OnLongClickListener を 登 録 する 次 の 文 を 追 加 します 257

258 findviewbyid(r.id.button1).setontouchlistener(this); findviewbyid(r.id.button1).setonlongclicklistener(this); MainActivity クラスは 次 のようになります 01: package com.example; 02: 03: import android.os.bundle; 04: import android.app.activity; 05: import android.util.log; 06: import android.view.menu; 07: import android.view.motionevent; 08: import android.view.view; 09: import android.view.view.onclicklistener; 10: import android.view.view.onlongclicklistener; 11: import android.view.view.ontouchlistener; 12: import android.widget.button; 13: 14: public class MainActivity extends Activity 15: implements OnClickListener, 16: OnTouchListener, 17: OnLongClickListener { 18: 19: private int cnt = 0; 20: 22: protected void oncreate(bundle savedinstancestate) { 23: super.oncreate(savedinstancestate); 24: setcontentview(r.layout.linear_sample); 25: findviewbyid(r.id.button1).setonclicklistener(this); 26: findviewbyid(r.id.button1).setontouchlistener(this); 27: findviewbyid(r.id.button1).setonlongclicklistener(this); 28: } 29: 30: // ( 略 ) 32: public void onclick(view v) { 33: // TODO 自 動 生 成 されたメソッド スタブ 34: Button b = (Button)v; 35: b.settext((++cnt) + " 回 目 "); 36: Log.i("HelloAndroid", "onclick"); 37: 38: } 39: 41: public boolean ontouch(view v, MotionEvent event) { 42: // TODO 自 動 生 成 されたメソッド スタブ 43: String[] s = {"ACTION_DOWN", "ACTION_UP"}; 44: Log.i("HelloAndroid", "ontouch - " + s[event.getaction()]); 45: return false; 46: } 47: 49: public boolean onlongclick(view v) { 258

259 50: // TODO 自 動 生 成 されたメソッド スタブ 51: Log.i("HelloAndroid", "onlongclick"); 52: return false; 53: } 54: } HelloAndroid プロジェクトを 実 行 します Eclipse の[ウィンドウ]メニューの[ビューの 表 示 ]-[その 他 ]を 選 択 し [LogCat] を 選 択 すると [LogCat]ビューが 表 示 されます [Info]を 選 択 すると HelloAndroid プ ロジェクトのログだけを 表 示 できます クリックのときとロングクリックのときのイベントの 発 生 順 の 違 いを 確 認 してください メモ ontouch メソッドと onlongclick メソッドは 戻 り 値 が boolean 型 です また HelloAndroid プロジェ クトではそれぞれのメソッドが false を 返 しています これは これらのメソッドが 捕 捉 したイベントを 次 のイベントハンドラメソッドに 渡 すことを 意 味 します true を 返 すと そのイベントハンドラメソッド でイベント 処 理 を 終 えたことになり これ 以 上 イベントが 次 のメソッドに 渡 されません 一 方 onclick メソッドは 戻 り 値 が void 型 です これは onclick メソッドが 最 後 に 呼 び 出 され 次 にイベントを 渡 すイベントハンドラメソッドがないことを 意 味 します 演 習 問 題 ボタンを 3 つ 配 置 したレイアウトを 作 成 し 各 ボタンがクリックされたときにそのボタンにクリック 回 数 が 表 示 されるプログラムを 作 成 しなさい 前 述 のプログラムを 匿 名 の 内 部 クラスを 利 用 して 作 成 しなさい 259

260 Chapter 30 Android のアプリケーションコンポーネント [シラバス No. 12] 目 的 アプリケーションコンポーネントと Intent の 概 要 を 理 解 する アプリケーションコンポーネントのライフサイクルを 理 解 する アプリケーションコンポーネントとは アプリケーションコンポーネントとは Android アプリケーションを 開 発 するための 部 品 です 用 途 と 機 能 に 応 じてコンポーネントを 使 い 分 け あるいは 組 み 合 わせることで Android アプリケーションを 開 発 します アプリケーションコンポーネントには Activity Service BroadcastReceiver ContentProvider の 4 つがあります Activity UI 画 面 を 持 つコンポーネントです UI 画 面 を 持 つ Android アプリケーションは 1 つ 以 上 の Activity から 構 成 され そのうちの 1 つがアプリケーションのエントリポイントとし て 最 初 に 呼 び 出 されます Java アプリケーションで main メソッドを 持 つクラスと 同 じで す Activity は android.app.activity クラスを 継 承 するサブクラスを 定 義 して 作 成 します AndroidManifest.xml では<activity>タグで 設 定 します Service バックグラウンド 処 理 を 実 行 するコンポーネントです たとえば ファイルのダウンロ ード 処 理 などを Activity で 実 行 すると 処 理 が 完 了 するまで UI 画 面 を 操 作 できない 状 態 に なります 時 間 のかかる 処 理 は Service に 実 装 してバックグラウンドで 実 行 するようにしま す Service は android.app.service クラスを 継 承 するサブクラスを 定 義 して 作 成 します AndroidManifest.xml では<service>タグで 設 定 します BroadcastReceiver システムで 発 生 したイベントなどの 非 同 期 メッセージを 受 信 するコンポーネントです たとえば バッテリ 残 量 の 低 下 などのイベントを 示 すメッセージを 受 け 取 り それをユー ザに 通 知 するなどの 目 的 で 利 用 します BroadcastReceiver は android.content.broadcastreceiver クラスを 継 承 するサブクラ スを 定 義 して 作 成 します AndroidManifest.xml では<receiver>タグで 設 定 します 260

261 ContentProvider アプリケーション 間 でデータ 共 有 を 行 うためのコンポーネントです Android では アプ リケーションで 作 成 したデータを 異 なるアプリケーションからアクセスすることは 基 本 的 に 禁 止 されています そのため ContentProvider を 作 成 して 自 アプリケーションのデー タを 他 のアプリケーションで 共 有 できるようにします また 連 絡 先 やシステムの 設 定 な どのデータにアクセスするときには Android が 標 準 で 提 供 している ContentProvider を 利 用 します ContentProvider は android.content.contentprovider クラスを 継 承 するサブクラスを 定 義 して 作 成 します AndroidManifest.xml では<provider>タグで 設 定 します Intent とは アプリケーションコンポーネントのうち Activity Service BroadcastReceiver は Intent を 使 って 他 のアプリケーションコンポーネントから 起 動 することができます Intent とは 非 同 期 メッセージを 表 すオブジェクトのことです Intent によるコンポーネントの 起 動 Intent を 使 ってコンポーネントを 起 動 するには 起 動 先 のクラス 名 やアクションなどを 指 定 して Intent オブジェクトを 生 成 し 次 のメソッドに 指 定 して 呼 び 出 します 起 動 先 Activity Service BroadcastReceiver 起 動 に 使 用 するメソッド Context クラスの startactivity メソッド Activity クラスの startactivityforresult メソッド Context クラスの startservice メソッド bindservice メソッド Context クラスの sendbroadcast メソッド sendorderedbroadcast メソッド sendstickybroadcast メソッド Intent に 設 定 する 情 報 Intent オブジェクトを 生 成 する 際 には 次 の 情 報 を 指 定 します 情 報 コンポーネント アクション カテゴリ データ 意 味 Intent を 受 け 取 るコンポーネントのクラス 実 行 する 動 作 または 発 生 したイベントを 表 す 文 字 列 Intent を 受 け 取 るコンポーネントの 種 類 コンポーネントが 処 理 するデータの URI と MIME 型 明 示 的 Intent と 暗 黙 的 Intent 261

262 起 動 先 のコンポーネントを 指 定 して 生 成 した Intent を 明 示 的 Intent といいます 一 方 起 動 先 を 指 定 せず 実 行 する 動 作 や 発 生 したイベントを 示 すアクション(および 関 連 するカテゴリやデータ)のみを 指 定 して 生 成 した Intent を 暗 黙 的 Intent といいます 暗 黙 的 Intent を 利 用 する 場 合 には コンポーネント 側 でどの 種 類 の Intent を 受 け 取 るかを 設 定 しておかなければなりません AndroidManifest.xml の<activity>タグ <service>タ グ <receiver>タグの 配 下 に<intent-filter>タグを 記 述 し <action>タグ <category>タグ <data>タグで 受 け 取 る Intent を 定 義 します アプリケーションコンポーネントのライフサイクル Activity Service BroadcastReceiver はライフサイクルを 持 ち コンポーネントの 起 動 や 終 了 の 際 に 特 定 のライフサイクルメソッドが 呼 び 出 されます アプリケーションコンポ ーネントを 開 発 するには ライフサイクルメソッドがどのタイミングで 呼 び 出 されるかを 理 解 する 必 要 があります Activity のライフサイクル Activity は 起 動 されてから 終 了 するまでの 間 次 の 状 態 を 遷 移 します アクティブ 状 態 ( 実 行 中 ):フォアグラウンド 状 態 で ユーザとのやりとりがある 一 時 停 止 状 態 :フォアグラウンド 状 態 ではない( 別 の Activity がフォアグラウンド 状 態 である)が ユーザに 一 部 が 表 示 されている 停 止 状 態 : 非 表 示 状 態 で ユーザから 完 全 に 見 えない 停 止 状 態 や 一 時 停 止 状 態 の Activity は メモリ 不 足 の 際 にシステムによって 強 制 的 に 終 了 される 場 合 があります Activity では これらの 状 態 を 遷 移 する 際 に 特 定 のライフサイクルメソッドが 呼 び 出 され ます メソッド 呼 び 出 されるとき 次 のメソッド oncreate Activity が 生 成 されるとき onstart onstart Activity がフォアグラウンド 状 態 になると onresume または onstop き(onCreate または onrestart に 続 いて) onrestart Activity が 非 表 示 状 態 からフォアグラウン onstart ド 状 態 になるとき onresume Activity がフォアグラウンド 状 態 になりユ onpause ーザが 操 作 できるようになるとき onpause Activity がフォアグラウンド 状 態 でなくな onresume または onstop 262

263 るとき( 他 の Activity がフォアグラウンド 状 態 になるとき) onstop Activity が 非 表 示 状 態 になる( 他 の Activity onrestart または ondestroy に 完 全 に 隠 される または 終 了 する)とき ondestroy Activity が 終 了 するとき なし 起 動 oncreate プロセス 終 了 onstart onrestart onresume フォアグラウンドに 表 示 されるとき フォアグラウンドに 表 示 されるとき アクティブ 状 態 フォアグラウンドに 表 示 されなくなるとき メモリ 不 足 onpause onstop ondestroy まったく 表 示 されない 状 態 に なるとき Activityが 終 了 するとき またはシステムによって 破 棄 されるとき 終 了 Activity を 作 成 する 際 には 必 要 に 応 じてこれらのライフサイクルメソッドをオーバーラ イドします たとえば Activity の 実 行 に 必 要 な 初 期 処 理 は oncreate メソッドで 実 行 しま す また Activity の 終 了 前 に 実 行 しておかなければならない 処 理 (データの 保 存 など)は onpause メソッドに 記 述 します これは 別 の Activity がフォアグラウンド 状 態 になり 現 在 の Activity で onpause メソッドが 呼 び 出 された 後 は メモリ 不 足 などの 理 由 によりシ ステムによって 強 制 終 了 され onstop メソッドと ondestroy メソッドが 呼 び 出 されない 可 能 性 があるからです Service のライフサイクル Service のライフサイクルは どのように 起 動 されたかによって 異 なります Service が startservice メ ソ ッ ド に よ り 起 動 さ れ る と oncreate メソッド 263

264 onstartcommand メソッドが 呼 び 出 されます stopservice メソッドまたは stopself メソ ッドにより 終 了 するときには ondestroy メソッドが 呼 び 出 されます Service が bindservice メソッドによりバインドされると oncreate メソッド onbind メソッドが 呼 び 出 されます unbindservice によりバインドが 解 除 されると onunbind メ ソッド ondestroy メソッドが 呼 び 出 されます Serviceが startserviceメソッドで 起 動 された 場 合 Serviceが bindserviceメソッドで 起 動 された 場 合 oncreate Serviceが 生 成 済 みの 場 合 はonCreateは 呼 び 出 されない oncreate onstartcommand onbind Serviceの 処 理 の 実 行 Serviceの 処 理 の 実 行 stopservice/stopselfの 呼 び 出 し unbindserviceの 呼 び 出 し Serviceがアクティブと みなされる 期 間 onunbind ondestroy ondestroy 終 了 終 了 BroadcastReceiver のライフサイクル BroadcastReceiver はライフサイクルメソッドとして onreceive メソッドのみを 持 ちま す BroadcastReceiver が 起 動 されると onreceive メソッドが 呼 び 出 されます onreceive メソッドが 呼 び 出 されてから 終 了 するまでの 期 間 のみ BroadcastReceiver はアクティブと みなされます Activity のライフサイクルメソッド サンプルプログラムの 作 成 では Activity のライフサイクルメソッドの 呼 び 出 しを 確 認 するサンプルプログラムを 作 成 してみましょう このサンプルプログラムでは Activity のライフサイクルメソッドをオーバーライドし 各 メソッドが 呼 び 出 されたときにログにメッセージを 出 力 します また LinearLayout を 264

265 使 ってボタンを 1 つ 配 置 し ボタンがクリックされたときに Activity クラスの finish メソ ッドで 自 Activity を 終 了 するようにします LifecycleSample プロジェクトの 作 成 まず Eclipse を 起 動 し [ファイル]メニューの[ 新 規 ]-[プロジェクト]を 選 択 し ます [ウィザードを 選 択 ] 画 面 で[Android]を 展 開 して[Android プロジェクト]を 選 択 し [ 次 へ]ボタンをクリックします [ 新 規 Android アプリケーション] 画 面 でアプリケーション 名 などを 次 のように 入 力 ま たは 選 択 して [ 次 へ]ボタンをクリックします [Application Name]:LifecycleSample [Project Name]:LifecycleSample [Package Name]:com.example [Minimum Required SDK]:API 8: Android 2.2(Froyo)(デフォルト 値 ) [Target SDK]:API 10: Android 2.3.3(Gingerbread) [Compile With]:API 10: Android 2.3.3(Gingerbread) [Theme]:API 10: Android 2.3.3(Gingerbread) [ 次 へ]ボタンをクリックし [ 新 規 ブランク アクティビティー] 画 面 で Activity と レイアウトの 名 前 を 次 のように 指 定 します [Activity Name]:LifecycleSampleActivity [Layout Name]:activity_lifecycle_sample 最 後 の 画 面 で[ 完 了 ]ボタンをクリックします 265

266 ライフサイクルメソッドのオーバーライド LifecycleSampleActivity ク ラ ス に ラ イ フ サ イ ク ル メ ソ ッ ド を 追 加 し ま す LifecycleSampleActivity.java を 開 き [ソース]メニューの[メソッドのオーバーラード / 実 装 ]を 選 択 します Activity のメソッドの 一 覧 が 表 示 されるので ondestroy onpause onresume onstart onstop にチェックを 入 れ [OK]ボタンをクリックします LifecycleSampleActivity クラスにこれらのメソッドが 追 加 されたら 各 メソッドで 次 の ように Log.i メソッドを 呼 び 出 します Log.i("LifecycelSample", "ondestroy"); LifecycleSampleActivity クラスは 次 のようになります 01: package com.example; 02: 03: import android.os.bundle; 04: import android.app.activity; 05: import android.util.log; 06: import android.view.menu; 07: 08: public class LifecycleSampleActivity extends Activity { 10: protected void oncreate(bundle savedinstancestate) { 11: super.oncreate(savedinstancestate); 12: setcontentview(r.layout.activity_lifecycle_sample); 13: Log.i("LifecycleSample", "oncreate"); 14: } 15: 17: protected void onstart() { 18: // TODO 自 動 生 成 されたメソッド スタブ 266

267 19: super.onstart(); 20: Log.i("LifecycleSample", "onstart"); 21: } 22: 24: protected void onresume() { 25: // TODO 自 動 生 成 されたメソッド スタブ 26: super.onresume(); 27: Log.i("LifecycleSample", "onresume"); 28: } 29: 31: protected void onpause() { 32: // TODO 自 動 生 成 されたメソッド スタブ 33: super.onpause(); 34: Log.i("LifecycleSample", "onpause"); 35: } 36: 38: protected void onstop() { 39: // TODO 自 動 生 成 されたメソッド スタブ 40: super.onstop(); 41: Log.i("LifecycleSample", "onstop"); 42: } 43: 45: protected void ondestroy() { 46: // TODO 自 動 生 成 されたメソッド スタブ 47: super.ondestroy(); 48: Log.i("LifecycleSample", "ondestroy"); 49: } 50: // ( 略 ) 51: } LifecycleSample プロジェクトの 実 行 [ 実 行 ]メニューの[ 実 行 ]を 選 択 します エミュレータが 起 動 し LifecycleSample が 開 始 すると [LogCat]ビューに oncreate onstart onresume が 呼 び 出 されたことを 示 すログが 表 示 されます 267

268 エミュレータで[ 戻 る]ボタンを 押 すと LifecycleSample が 終 了 し [LogCat]ビューに onpause onstop ondestroy が 呼 び 出 されたことを 示 すログが 表 示 されます 演 習 問 題 LifecycleSample プロジェクトに onrestart メソッドを 追 加 し LifecycleSample を 実 行 中 に 他 のア プリケーションを 実 行 して 再 度 LifecycleSample に 戻 ったときにライフサイクルメソッドがどのよう に 呼 び 出 されるか 確 認 しなさい LifecycleSample と 同 様 のサンプルプログラムをもう 1 つ 作 成 し LifecycleSample を 実 行 中 にもう 1 つのサンプルプログラムを 実 行 した 際 に それぞれのライフサイクルメソッドがどのように 呼 び 出 されるか 確 認 しなさい 268

プログラミング基礎I(再)

プログラミング基礎I(再) 山 元 進 1 度 は 講 義 を 受 けたことを 念 頭 に 置 いて 講 義 遠 慮 なく 質 問 せよ 質 問 で 授 業 を 止 めたくないならば TA の 人 を 呼 んで 質 問 すると 良 い 前 期 講 義 の 欠 席 者 は 特 に 注 意 せよ 4 限 座 学 +5 限 演 習 出 席 をとる( 前 期 同 様 のシステム) 中 間 試 験 を 行 う 期 末 試 験 の 範 囲

More information

1

1 Excelファイルアクセス 1. 概 要 Excel ファイルアクセスコンポーネントは Microsoft Excel のファイルを 開 いてセルの 値 や 書 式 を 取 得 変 更 したり テーブル 全 体 を 新 しいファイルと して 保 存 したりするために 用 います Excel ファイルアクセスコンポーネントは アプリケーションビルダーのメニューから 以 下 のように 選 びます [コンポーネント

More information

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2 目 次 動 作 環 境 特 長 方 法 方 法 起 動 終 了 方 法 方 法 操 作 方 法 使 方 使 方 使 方 詳 細 設 定 使 方 KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2 KINGSOFT Office 2016 特 長 主 特 長 以

More information

目 次 JAVIS Appli の 基 本 機 能... 3 JAVIS Appli について... 3 音 声 確 認 機 能 JAVIS Appli( 有 償 版 )の 機 能... 4 音 声 で 読 みの 確 認 をする... 4 辞 書 機 能... 5 単 語 を 登 録 する... 5

目 次 JAVIS Appli の 基 本 機 能... 3 JAVIS Appli について... 3 音 声 確 認 機 能 JAVIS Appli( 有 償 版 )の 機 能... 4 音 声 で 読 みの 確 認 をする... 4 辞 書 機 能... 5 単 語 を 登 録 する... 5 アドイン 版 ********************************************* 操 作 説 明 書 ********************************************* 目 次 JAVIS Appli の 基 本 機 能... 3 JAVIS Appli について... 3 音 声 確 認 機 能 JAVIS Appli( 有 償 版 )の 機 能...

More information

Microsoft Word - tb01.doc

Microsoft Word - tb01.doc 第 1 章 プログラムを 動 かそう 概 要 ここでは 情 報 処 理 センターの 計 算 機 環 境 を 使 用 してプログラミングを 勉 強 するために 覚 えておかなければならな い 種 々のソフトウェアの 使 用 方 法 について 学 びます また C 言 語 を 用 いて 書 いたプログラムのソースコードをコンパイルし 実 行 する 方 法 について 学 びます この 章 の 目 標 テキストエディタを

More information

目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13

目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13 積 算 内 訳 書 の 作 成 マニュアル 平 成 26 年 1 形 県 県 整 備 部 建 設 企 画 課 目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 )

More information

スライド 1

スライド 1 Android 版 目 視 録 運 用 操 作 マニュアル 作 成 2012/03/22 更 新 2014/09/26 目 視 録 とは 携 帯 またはパソコンで 施 工 写 真 を 登 録 確 認 できるシステムです ご 利 用 の 為 にはIDとパスワードが 必 要 です TEG ログインID ( ) パスワード ( ) https://teg.mokusiroku.com/

More information

1. 表 から 値 を 抽 出 する 説 明 1.1. 表 から 値 を 抽 出 するための 関 数 について 説 明 します LOOKUP VLOOKUP HLOOKUP 関 数 は 検 索 値 に 対 応 する 値 を 検 索 値 を 含 む 一 覧 表 から 抽 出 し てくれる 関 数 です

1. 表 から 値 を 抽 出 する 説 明 1.1. 表 から 値 を 抽 出 するための 関 数 について 説 明 します LOOKUP VLOOKUP HLOOKUP 関 数 は 検 索 値 に 対 応 する 値 を 検 索 値 を 含 む 一 覧 表 から 抽 出 し てくれる 関 数 です Lookup 関 数 Vlookup 関 数 Index 関 数 等 で 表 からデータを 抽 出 する1 目 次 Rev070924 こうすればできる 研 究 所 1. 表 から 値 を 抽 出 する 説 明... 3 2. Lookup 関 数 1( 検 査 値 配 列 を 選 択 )... 5 3. Lookup 関 数 2 検 査 値 検 査 範 囲 対 応 範 囲 を 選 択 して 扶 養

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 1 履 修 履 歴 データベースの 仕 組 み 学 生 が 履 修 履 歴 を 登 録 して 企 業 へデータを 送 信 すると 企 業 担 当 者 が 履 修 履 歴 データを 見 られるようになります 不 特 定 の 企 業 に 履 修 履 歴 データが 閲 覧 されるわけではありません < 基 本 的 な 流 れ> A 社 データ ベース 応 募 企 業 へ データを 送 信 学 生 A 専

More information

<4D6963726F736F667420576F7264202D20457863656C97F195CF8AB72091808DEC90E096BE8F912091E6312E313294C52E646F63>

<4D6963726F736F667420576F7264202D20457863656C97F195CF8AB72091808DEC90E096BE8F912091E6312E313294C52E646F63> Excel 列 変 換 Ver.1.0.3 操 作 説 明 書 第 1.1 版 Copyright (C) 2008 株 式 会 社 恒 河 沙 変 更 履 歴 版 作 成 日 作 成 者 主 な 変 更 点 第 1.0 版 2008/10/29 ( 株 ) 恒 河 沙 東 野 貴 行 新 規 作 成 第 1.1 版 2008/11/04 ( 株 ) 恒 河 沙 東 野 貴 行 - 2 - 目 次

More information

iStorage ソフトウェア VMware vSphere Web Client Plug-in インストールガイド

iStorage ソフトウェア VMware vSphere Web Client Plug-in インストールガイド istorage ソフトウェア VMware vsphere Web Client Plug-in インストールガイド はじめに このインストールガイドでは WebSAM Storage VMware vsphere Web Client Plug-in のインストールに 関 して 説 明 しています 本 製 品 は VMware vcenter Server VMware vsphere Web

More information

<4D6963726F736F667420576F7264202D2030322090AC90D1955D92E8977697CC82CC895E9770816990DD8C76939995D2816A2E646F63>

<4D6963726F736F667420576F7264202D2030322090AC90D1955D92E8977697CC82CC895E9770816990DD8C76939995D2816A2E646F63> 土 木 部 建 築 設 計 及 び 工 事 監 理 等 委 託 業 務 成 績 評 定 要 領 の 運 用 ( 建 築 設 計 等 委 託 業 務 編 ) ( 評 定 の 方 法 ) 第 1 評 定 者 は 評 定 を 行 おうとする 業 務 ( 以 下 対 象 業 務 という )について 別 添 の 採 点 表 により 評 定 を 行 うものとし 評 価 項 目 評 価 の 視 点 及 び 評 価

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 関 数 この 章 では 日 付 と 時 刻 を 扱 う 関 数 や 検 索 条 件 に 一 致 するデータを 取 り 出 す 関 数 の 使 い 方 また 複 数 の 関 数 を 組 み 合 わせてエラー 値 を 非 表 示 にする 方 法 を 学 習 します STEP 1: 日 付 / 時 刻 関 数 TODAY 関 数 NOW 関 数 TODAY 関 数 は パソコンの 内 蔵 時

More information

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 改 訂 の 要 因 旧 新 (2013 年 4 月 版 ) 文 言 削 除 p.11(1. 基 本 事 項 ) (2) 保 証 すべき 実 数 の 精 度 p.5(1. 基 本 事 項 ) (2) 保 証 すべき 実 数 の 精 度 1. 用 紙 系 ( 線 種 ピッチ 等 用 紙 上 の 大 きさで

More information

計算式の取り扱い

計算式の取り扱い 4.データ 入 力 と 表 計 算 4-1 計 算 式 の 取 り 扱 い 1) 数 式 の 基 本 Excelのような 表 計 算 ソフトでは セルに 入 力 されたデータ( 定 数 )を 計 算 式 ( 数 式 )によって 計 算 することで さまざまな 処 理 が 行 えます 数 式 バーには 数 式 の 内 容 が 表 示 されます セルには 計 算 結 果 が 表 示 されます 数 式 の

More information

<4D6963726F736F667420576F7264202D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A83858341838B8169342E33566572816A2E646F63>

<4D6963726F736F667420576F7264202D20819C486F70658F6F93588ED297708AC7979D89E696CA837D836A83858341838B8169342E33566572816A2E646F63> 商 品 管 理 商 品 管 理 を 行 うためのメニューです 4.1 商 品 管 理 のサイドメニュー 商 品 管 理 には 以 下 のサイドメニューがあります 商 品 一 覧 登 録 済 みの 商 品 の 一 覧 を 表 示 します 既 に 登 録 済 みの 商 品 の 検 索 検 索 した 商 品 を 編 集 する 際 に 使 用 します 新 規 作 成 商 品 を 新 規 登 録 する 画 面

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 創 薬 基 盤 推 進 研 究 事 業 (4 次 公 募 ) H27 年 度 公 募 に 係 る 府 省 共 通 研 究 開 発 管 理 システム (e-rad)への 入 力 方 法 について 1 目 次 1.はじめに 2. 実 際 の 応 募 手 続 き 3. 応 募 手 続 き 完 了 の 確 認 2 1-a. はじめに1 注 意 事 項 1. 平 成 27 年 度 の 創 薬 基 盤 推 進

More information

Flash基礎Chapter1_3稿.indd

Flash基礎Chapter1_3稿.indd Chapter 1 Flashの 概 要 PREPARATION Chapter1 で 使 用 するフォルダー 本 講 座 で 使 用 するデータは 映 像 教 材 ページからダウンロードしてください ダウンロードしたデータは 展 開 し デスクトップに 用 意 してください Flas hの 概 要 Chapter 1 1-1 Flashとは Flash は アニメーションや RIA を 作 成 することができるアプリケーションです

More information

新・明解Java入門

新・明解Java入門 537,... 224,... 224,... 32, 35,... 188, 216, 312 -... 38 -... 38 --... 102 --... 103 -=... 111 -classpath... 379 '... 106, 474!... 57, 97!=... 56 "... 14, 476 %... 38 %=... 111 &... 240, 247 &&... 66,

More information

Gmail 利用者ガイド

Gmail 利用者ガイド Gmail 利 用 者 ガイド 目 次 1. はじめに... 1 2. Gmail を 利 用 する 前 に... 2 3. 初 めてのログイン... 4 3.1. ログイン... 4 3.2. CAPTCHA の 入 力... 5 4. メールボックスの 説 明... 8 5. メールの 受 信... 9 6. メールの 送 信 返 信... 10 6.1. メールの 新 規 作 成... 10

More information

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド 本 書 では 管 理 者 向 けに MetaMoJi ClassRoom/ゼミナールで 年 度 更 新 を 実 施 する 手 順 について 説 明 して います 管 理 者 ガイドと 合 わせてご 覧 ください Excelは 米 国 Microsoft Corporationの 米 国 およびその 他 の 国 における 登 録 商 標 または 商 標 です Apache OpenOffice Apache

More information

目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あ

目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あ 大 学 情 報 データベースシステム EXCEL 一 括 登 録 マニュアル 目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あり)... 5 1.2.3.EXCEL

More information

PowerPoint Presentation

PowerPoint Presentation データを 圧 縮 する 大 量 のデータを 小 さく 収 納 するには? 国 立 情 報 学 研 究 所 定 兼 邦 彦 0 年 月 日 データとは データ 圧 縮 とは 数 値 の 集 まり,.5, 00, 3.4, 意 味 のあるデータが 情 報 文 字, 画 像, 音 声, 動 画 など コンピュータ 中 では, 全 てのデータは0,の 列 で 表 される 圧 縮 とは ビット データを 表

More information

WebMail ユーザーズガイド

WebMail ユーザーズガイド ニフティクラウド ビジネスメール メール 共 有 サービス ユーザーズガイド 第 1.1 版 平 成 26 年 5 月 19 日 ニフティ 株 式 会 社 目 次 はじめに... 3 1. 共 有 メールボックスとは... 4 2. 共 有 メールボックスを 表 示 する... 5 3. 閲 覧 履 歴 操 作 履 歴 を 表 示 する... 8 4. 共 有 メールボックスからメールを 送 信 する...

More information

Ver 改 訂 日 付 改 訂 内 容 1

Ver 改 訂 日 付 改 訂 内 容 1 大 学 評 価 データベースシステム 一 括 登 録 マニュアル ( 第 1.00 版 ) SRA 東 北 Ver 改 訂 日 付 改 訂 内 容 1 目 次 1. 大 学 評 価 データベースの 使 用 方 法 について...3 1.1.データ 一 括 登 録...3 1.1.1. 一 括 登 録 の 目 的...3 1.1.2. 一 括 登 録 の 利 用 上 での 注 意 点...3 1.1.3.

More information

R4財務対応障害一覧

R4財務対応障害一覧 1 仕 訳 入 力 仕 訳 入 力 時 摘 要 欄 で. + Enter を 押 すと アプリケーションでエラーが 発 生 しまインデックスが 配 列 の 境 界 外 です が 出 る 場 合 がある 問 題 に 対 応 しま 2 仕 訳 入 力 仕 訳 入 力 主 科 目 と 補 助 科 目 を 固 定 にすると2 行 目 以 降 の 補 助 科 目 コピーが 動 作 しない 問 題 に 対 応

More information

確 定 申 告 書 作 成 システム 操 作 手 順 書 ~ 個 人 利 用 者 向 け 操 作 説 明 書 ~ 平 成 27 年 1 月 JA 長 野 県 営 農 センター ( 株 ) 長 野 県 協 同 電 算 目 次 1.システムの 起 動... 1 ... 1 ... 2 2.ログインとログアウト... 2 ... 3 ...

More information

年齢別人数計算ツールマニュアル

年齢別人数計算ツールマニュアル 年 齢 別 人 数 計 算 ツールの 使 用 手 引 本 ツールは 学 校 基 本 調 査 の 調 査 項 目 である 年 齢 別 入 学 者 数 を 学 生 名 簿 等 の 既 存 データを 利 用 して 集 計 するものです < 対 象 となる 調 査 票 > 1 学 校 調 査 票 ( 大 学 ) 学 部 学 生 内 訳 票 ( 様 式 第 8 号 ) 2 学 校 調 査 票 ( 短 期 大

More information

GRIDY SFA カスタム 項 目 操 作 ガイド 用 本 書 はに 必 要 な 操 作 を 解 説 しております は GRIDY SFA ののことです GRIDY SFA へ 申 し 込 み 最 初 に 登 録 を 行 った 方 がそのままとなります カスタム 項 目 はの 方 のみ 操 作 可

GRIDY SFA カスタム 項 目 操 作 ガイド 用 本 書 はに 必 要 な 操 作 を 解 説 しております は GRIDY SFA ののことです GRIDY SFA へ 申 し 込 み 最 初 に 登 録 を 行 った 方 がそのままとなります カスタム 項 目 はの 方 のみ 操 作 可 GRIDY SFA カスタム 項 目 操 作 ガイド 2016 年 1 月 20 日 ナレッジスイート 株 式 会 社 1 GRIDY SFA カスタム 項 目 操 作 ガイド 用 本 書 はに 必 要 な 操 作 を 解 説 しております は GRIDY SFA ののことです GRIDY SFA へ 申 し 込 み 最 初 に 登 録 を 行 った 方 がそのままとなります カスタム 項 目 はの

More information

C.1 共 有 フォルダ 接 続 操 作 の 概 要 アクセスが 許 可 されている 研 究 データ 交 換 システムの 個 人 用 共 有 フォルダまたは メーリングリストの 共 有 フォルダに 接 続 して フォルダを 作 成 したり ファイル をアップロードまたはダウンロードしたりすることがで

C.1 共 有 フォルダ 接 続 操 作 の 概 要 アクセスが 許 可 されている 研 究 データ 交 換 システムの 個 人 用 共 有 フォルダまたは メーリングリストの 共 有 フォルダに 接 続 して フォルダを 作 成 したり ファイル をアップロードまたはダウンロードしたりすることがで C.1 共 有 フォルダ 接 続 操 作 の 概 要 C.2 Windows から 接 続 操 作 する C.3 Mac OS X から 接 続 操 作 する 67 C.1 共 有 フォルダ 接 続 操 作 の 概 要 アクセスが 許 可 されている 研 究 データ 交 換 システムの 個 人 用 共 有 フォルダまたは メーリングリストの 共 有 フォルダに 接 続 して フォルダを 作 成 したり

More information

ことばを覚える

ことばを覚える 業 務 部 門 の 担 当 者 による 担 当 者 のための 業 務 アプリケーションの 作 り 方 (その1) 設 定 ウィザードを 用 いた 受 注 伝 票 管 理 ツールの 構 築 コンテキサー 操 作 演 習 コンテキサー チュートリアル(バージョン2.2 用 ) 20121113 コンテキサーのバージョンは 2.2.09 以 降 で 行 ってください 目 次 ステップ1 受 注 伝 票 パネルの

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション インターネット 出 願 手 引 き (システムWAKABA 継 続 入 学 申 請 手 引 き) 目 次 1.システムWAKABAトップ 画 面 2 2. 学 生 種 選 択 画 面 3 3. 出 願 申 請 画 面 (1) 全 科 履 修 生 の 場 合 4 (2) 全 科 履 修 生 以 外 の 場 合 6 4.オンライン 授 業 8 5. 科 目 登 録 申 請 画 面 (1) 授 業 種 別

More information

<4D6963726F736F667420576F7264202D208CA990CF96BE8DD78F918EAE82CC95CF8D583230313131313130>

<4D6963726F736F667420576F7264202D208CA990CF96BE8DD78F918EAE82CC95CF8D583230313131313130> 平 成 23 年 11 月 10 日 協 力 会 社 の 皆 様 へ 西 松 建 設 株 式 会 社 見 積 明 細 書 書 式 の 変 更 について 平 成 23 年 6 月 より 新 業 務 システム(RN21 システム)を 導 入 しておりますが 運 用 を 円 滑 なものとするため 提 出 いただく 見 積 明 細 書 の 書 式 を 変 更 いたしました 以 下 に 取 り 扱 い 要 領

More information

目 次 電 子 申 請 を 使 用 した 申 請 の 流 れ 1ページ 申 請 書 ( 概 算 保 険 料 申 告 書 )の 作 成 2ページ 作 成 した 申 請 書 の 送 信 31ページ 状 況 照 会 電 子 納 付 を 行 う 62ページ 返 送 書 類 の 取 得 75ページ お 問 い

目 次 電 子 申 請 を 使 用 した 申 請 の 流 れ 1ページ 申 請 書 ( 概 算 保 険 料 申 告 書 )の 作 成 2ページ 作 成 した 申 請 書 の 送 信 31ページ 状 況 照 会 電 子 納 付 を 行 う 62ページ 返 送 書 類 の 取 得 75ページ お 問 い 概 算 保 険 料 の 申 告 ( 継 続 ) 手 続 電 子 申 請 操 作 マニュアル 平 成 28 年 4 月 1 日 Ver.1.3 目 次 電 子 申 請 を 使 用 した 申 請 の 流 れ 1ページ 申 請 書 ( 概 算 保 険 料 申 告 書 )の 作 成 2ページ 作 成 した 申 請 書 の 送 信 31ページ 状 況 照 会 電 子 納 付 を 行 う 62ページ 返 送 書

More information

Microsoft PowerPoint - 04_H26material_practice_No3-3.pptx

Microsoft PowerPoint - 04_H26material_practice_No3-3.pptx 参 考 : 届 書 作 成 プログラムによる 届 出 データの 作 成 方 法 (1) 事 前 準 備 1 被 保 険 者 データの 入 手 (ターンアラウンドCDを 利 用 する 場 合 ) 当 プログラムでは 提 出 先 の 年 金 事 務 所 が 保 有 している 被 保 険 者 のデータを 利 用 して 電 子 申 請 用 データを 作 成 することができます(これを ターンアラウンドCD

More information

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合 TIPS 目 次 TIPS 項 目 棚 割 りを 開 始 するまで 商 品 画 像 の 追 加 方 法 商 品 情 報 の 一 括 更 新 登 録 方 法 棚 割 情 報 の 連 携 方 法 小 売 様 棚 割 ソフトとの 棚 割 情 報 連 携 について 他 棚 割 ソフトとの 棚 割 情 報 連 携 について 棚 割 情 報 のExcel 取 込 について 棚 板 設 定 の 詳 細 商 品 設

More information

目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1 3. 論 理 式 の 種 類... 2 3.1.1. 等 号... 2 3.1.2. 不 等 号... 2 4. 具 体 的 な 使 い 方... 2 5. ネスト... 3 6. 複 数 の 条 件 を 記 述...

目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1 3. 論 理 式 の 種 類... 2 3.1.1. 等 号... 2 3.1.2. 不 等 号... 2 4. 具 体 的 な 使 い 方... 2 5. ネスト... 3 6. 複 数 の 条 件 を 記 述... 平 成 26 年 12 月 6 日 跡 見 学 園 女 子 大 学 公 開 講 座 パソコンセミナー Excel 入 門 第 1 回 応 用 編 文 学 部 現 代 文 化 表 現 学 科 准 教 授 伊 藤 穣 j-ito@atomi.ac.jp http://www2.mmc.atomi.ac.jp/~j-ito/ 目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1

More information

スライド 1

スライド 1 2014.10.28 スタディライター 教 材 動 作 確 認 設 定 手 順 Java Runtime Environment のセキュリティ 強 化 により スタディライターで 作 成 したJavaを 利 用 するアプリケーションの 動 作 確 認 及 び 動 作 のために 各 種 設 定 が 必 要 になりました ここではWindows 8.1 Internet Explorer 11を 例

More information

WEB版「新・相続対策マスター」(ご利用の手引き)

WEB版「新・相続対策マスター」(ご利用の手引き) WEB 版 新 相 続 対 策 マスター ご 利 用 の 手 引 き 株 式 会 社 シャフト MG-16-0412 はじめに WEB 版 新 相 続 対 策 マスター( 以 下 本 シミュレーション)をご 利 用 にあたり 下 記 についてあらかじめ 承 諾 をいただいた 上 で 本 シミュレーションを 利 用 いただくものとします 本 シミュレーションの 計 算 結 果 はあくまでも 概 算 です

More information

1.2. ご 利 用 環 境 1.2.1. 推 奨 ブラウザ Internet Explorer 10 11 Google Chrome(バージョン 32 時 点 で 動 作 確 認 済 み) Mozilla Firefox(バージョン 26 時 点 で 動 作 確 認 済 み) Safari 7

1.2. ご 利 用 環 境 1.2.1. 推 奨 ブラウザ Internet Explorer 10 11 Google Chrome(バージョン 32 時 点 で 動 作 確 認 済 み) Mozilla Firefox(バージョン 26 時 点 で 動 作 確 認 済 み) Safari 7 1. アーカイブデータベースを 検 索 / 閲 覧 する 1.1. データの 検 索 方 法 東 京 アーカイブ では 以 下 に 分 類 されるカテゴリの 画 像 データ 資 料 データを 閲 覧 できます 江 戸 城 浮 世 絵 双 六 和 漢 書 江 戸 東 京 の 災 害 記 録 絵 葉 書 写 真 帖 近 代 の 地 図 東 京 府 東 京 市 関 係 資 料 番 付 建 築 図 面 書

More information

経 理 上 くん db(version 8.001)の 変 更 点 概 要 Ⅰ. 消 費 税 /リバースチャージ 方 式 の 申 告 に 対 応 1 特 定 課 税 仕 入 特 定 課 税 仕 入 返 還 区 分 を 追 加 しました Ⅱ.その 他 の 改 良 修 正 詳 細 は 後 述 を 参 照

経 理 上 くん db(version 8.001)の 変 更 点 概 要 Ⅰ. 消 費 税 /リバースチャージ 方 式 の 申 告 に 対 応 1 特 定 課 税 仕 入 特 定 課 税 仕 入 返 還 区 分 を 追 加 しました Ⅱ.その 他 の 改 良 修 正 詳 細 は 後 述 を 参 照 経 理 上 手 くんdbNL(Vers 6.001) バージョンアップ 変 更 点 概 要 財 務 処 理 db 導 入 更 新 Version 8.001 当 プログラムは マイクロソフト 社 のサポート 対 応 終 了 に 伴 い Windows XP 搭 載 機 へのインストールは 不 可 と なっています 消 費 税 /リバースチャージ 方 式 の 申 告 に 対 応 特 定 課 税 仕 入

More information

Taro-2220(修正).jtd

Taro-2220(修正).jtd 株 式 会 社 ( 募 集 株 式 の 発 行 ) 株 式 会 社 変 更 登 記 申 請 書 1. 商 号 商 事 株 式 会 社 1. 本 店 県 市 町 丁 目 番 号 1. 登 記 の 事 由 募 集 株 式 発 行 ( 情 報 番 号 2220 全 25 頁 ) 1. 登 記 すべき 事 項 変 更 ( 注 ) 変 更 の 年 月 日 は, 払 込 期 日 又 は 払 込 期 間 の 末

More information

ご 利 用 の 前 に 手 順 初 回 ご 利 用 時 に 必 ずご 確 認 ください ご 利 用 の 前 に (ご 利 用 環 境 の 確 認 ) P アクセス 方 法 (IMAGE WORKSサイトへアクセス) P 初 期 設 定 (JREのインストール) P

ご 利 用 の 前 に 手 順 初 回 ご 利 用 時 に 必 ずご 確 認 ください ご 利 用 の 前 に (ご 利 用 環 境 の 確 認 ) P アクセス 方 法 (IMAGE WORKSサイトへアクセス) P 初 期 設 定 (JREのインストール) P 大 容 量 ファイル 共 有 送 受 信 サービス 簡 易 操 作 マニュアル - スタンダードモード 用 - ご 利 用 の 前 に ご 利 用 前 に 必 ずご 確 認 ください 手 順 ご 利 用 の 前 に (ご 利 用 環 境 の 確 認 ) P アクセス 方 法 (IMAGE WORKSサイトへアクセス) P 初 期 設 定 (JREのインストール) P 基 本 操 作 ( 各 種 操

More information

(Microsoft Word - Excel\211\236\227p2\217\315.docx)

(Microsoft Word - Excel\211\236\227p2\217\315.docx) この 章 では 日 付 と 時 刻 を 扱 う 関 数 や 複 数 の 関 数 を 組 み 合 わせてエラーを 非 表 示 にする 方 法 また 検 索 条 件 に 一 致 するデータを 取 り 出 す 関 数 の 使 い 方 などについて 学 習 します 1 日 付 と 時 刻 の 関 数 TODAY 関 数 NOW 関 数 TODAY 関 数 は パソコンの 内 蔵 時 計 を 利 用 して 現

More information

1. アクセスする 2. 簡 易 検 索 画 面 (fig. 1) アクセスすると 最 初 に 出 る 画 面 です 検 索 語 入 力 ボックスにキーワードを 入 力 して 論 文 検 索 ボタンをクリックし ます 3. ボックス 下 部 のチェック 項

1. アクセスする  2. 簡 易 検 索 画 面 (fig. 1) アクセスすると 最 初 に 出 る 画 面 です 検 索 語 入 力 ボックスにキーワードを 入 力 して 論 文 検 索 ボタンをクリックし ます 3. ボックス 下 部 のチェック 項 CiNii Articles を 使 う 2013 芳 野 明 / 京 都 嵯 峨 芸 術 大 学 西 洋 美 術 史 博 物 館 学 研 究 室 1. アクセスする http://ci.nii.ac.jp/ 2. 簡 易 検 索 画 面 (fig. 1) アクセスすると 最 初 に 出 る 画 面 です 検 索 語 入 力 ボックスにキーワードを 入 力 して 論 文 検 索 ボタンをクリックし

More information

5-2.操作説明書(支店連携)_xlsx

5-2.操作説明書(支店連携)_xlsx お 客 さま 向 け 送 り 状 発 行 システム 5-2. 操 作 説 明 書 ( 支 店 連 携 ) ゆうパックプリントR は 日 本 郵 便 株 式 会 社 がお 客 さまに 無 料 で 提 供 する ゆうパックや 郵 便 商 品 の 送 り 状 をパソコンで 印 刷 するためのソフトウェアです ゆうパックプリントRを 以 降 ゆうプリR と 表 記 します 本 マニュアルは 支 店 連 携

More information

○ 愛 知 県 都 市 職 員 共 済 組 合 職 員 の 育 児 休 業 等 に 関 する 規 則 ( 平 成 22 年 10 月 1 日 ) 平 成 22 年 規 則 第 9 号 改 正 平 成 22 年 11 月 30 日 規 則 第 11 号 愛 知 県 都 市 職 員 共 済 組 合 職 員 の 育 児 休 業 等 に 関 する 規 則 ( 平 成 10 年 愛 知 県 都 市 職 員 共 済

More information

Microsoft Word - 情報メディア利用ガイド2014

Microsoft Word - 情報メディア利用ガイド2014 Biiメール(Gmail)の 利 用 方 法 Biiメールについて 入 学 時 に Bii メールアドレスが 配 布 されます 利 用 するメールアドレスは 下 記 のような 形 式 となります Bii アカウントカードを 確 認 してください 大 学 生 : @stu.kbu.ac.jp 短 大 生 : @stj.kbu.ac.jp 利 用 期 間 は 在 学 中 です 卒 業 後 半 年 間 は

More information

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ⅱ 国 地 方 公 共 団 体 公 共 公 益 法 人 等 の 消 費 税 Q&A ( 問 1) 免 税 期 間 における 起 債 の 償 還 元 金 に 充 てるための 補 助 金 等 の 使 途 の 特 定 Q 地 方 公 共 団 体 の 特 別 会 計 が 消 費 税 の 納 税 義 務 が 免 除 される 課 税 期 間

More information

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン 2014 年 1 月 7 日 治 験 依 頼 者 各 位 新 潟 市 民 病 院 治 験 管 理 室 Excel 形 式 の 電 子 プロトコール 提 出 の 御 依 頼 当 院 では 効 率 的 で 正 確 な 治 験 の 実 施 のため 電 子 カルテ 内 に 専 用 の Excel 形 式 による 電 子 プロトコールを 導 入 しております つきましては 治 験 依 頼 の 際 に 下 記

More information

1-2 新 規 CPD 会 員 登 録 の 申 請 から 登 録 までの 手 順 当 協 会 CPDシステムを 利 用 するためには 当 協 会 ホームページトップ 画 面 より CPD 事 務 局 へ のCPD 会 員 登 録 が 必 要 です CPD 会 員 登 録 が 完 了 すると 登 録

1-2 新 規 CPD 会 員 登 録 の 申 請 から 登 録 までの 手 順 当 協 会 CPDシステムを 利 用 するためには 当 協 会 ホームページトップ 画 面 より CPD 事 務 局 へ のCPD 会 員 登 録 が 必 要 です CPD 会 員 登 録 が 完 了 すると 登 録 1. 新 規 CPD 会 員 登 録 について 1-1 新 規 CPD 会 員 登 録 の 申 請 から 登 録 までの 流 れ 1. 当 協 会 JCCAホームページを 開 く http://www.jcca.or.jp/ 2.[ 関 連 資 格 と 試 験 案 内 ]メニュー 内 [CPD 情 報 ]をクリック 3.[CPDシステム ログイン]をクリック 4.[ 新 規 CPD 会 員 登 録

More information

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加 別 添 事 務 連 絡 平 成 27 年 12 月 18 日 日 本 年 金 機 構 厚 生 年 金 保 険 部 長 殿 厚 生 労 働 省 年 金 局 事 業 管 理 課 長 持 続 可 能 な 医 療 保 険 制 度 を 構 築 するための 国 民 健 康 保 険 法 等 の 一 部 を 改 正 する 法 律 による 健 康 保 険 法 及 び 船 員 保 険 法 改 正 内 容 の 一 部 に

More information

(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt)

(Microsoft PowerPoint - Ver12\203o\201[\203W\203\207\203\223\203A\203b\203v\216\221\227\277.ppt) ACAD-DENKI DENKI Ver.12 新 機 能 / 改 善 機 能 アルファテック 株 式 会 社 1 新 機 能 改 善 機 能 一 覧 ACAD-DENKI/EL Ver.12 新 機 能 と 改 善 機 能 新 メニュー/ 新 機 能 拡 張 プロジェクト 管 理 外 部 端 子 コネクタ 端 子 ネット 分 割 化 リアルタイム 線 番 挿 入 改 善 項 目 図 題 情 報 編

More information

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都 平 成 22 年 4 月 1 日 現 在 の 法 令 等 に 準 拠 Up Newsletter 養 老 保 険 の 減 額 逓 増 定 期 保 険 の 取 扱 い 変 更 介 護 費 用 保 険 の 導 入 企 業 の 保 険 のポイント http://www.up-firm.com 1 養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者

More information

スライド 1

スライド 1 ひかり 電 話 /ひかり 電 話 オフィスタイプ/ひかり 電 話 オフィスA(エース)/ひかり 電 話 ナンバーゲート ひかり 電 話 設 定 サイト 操 作 ガイド 西 日 本 電 信 電 話 株 式 会 社 もくじ はじめに P ひかり 電 話 設 定 サイトとは ご 利 用 手 順 ログイン 時 の 認 証 単 位 P P P3 ご 利 用 方 法 P4 着 信 お 知 らせメール/FAXお

More information

■デザイン

■デザイン Joruri CMS 1.3.2 基 本 マニュアル (2013.6.28) デザイン デザインでは 各 ページ 内 に 構 成 されるパーツである ピース と それをページ 内 に 配 置 し 構 成 する レイアウト を 作 成 できます また スタイルシート でピース レイ アウトの HTML を 制 御 し 装 飾 する CSS を 設 定 できます ピース デザイン>ピース ピース をクリックすると

More information

CSV_Backup_Guide

CSV_Backup_Guide ActiveImage Protector による クラスター 共 有 ボリュームのバックアップ 運 用 ガイド 第 5 版 - 2015 年 4 月 20 日 Copyright NetJapan, Inc. All Rights Reserved. 無 断 複 写 転 載 を 禁 止 します 本 ソフトウェアと 付 属 ドキュメントは 株 式 会 社 ネットジャパンに 所 有 権 および 著 作

More information

Microsoft Word - 2.doc

Microsoft Word - 2.doc 政 治 資 金 業 務 システム 訂 正 補 正 用 収 支 報 告 書 作 成 ソフト 操 作 説 明 書 目 次 第 1 章 概 要... 3 1. 目 的... 3 2. 機 能 概 要... 4 3. 動 作 前 提... 5 4. 報 告 書 様 式 一 覧... 5 5. 操 作 の 流 れ... 6 第 2 章 詳 細... 8 第 1 節 初 期 設 定 処 理... 8 1.マクロの

More information

富士山チェックリスト

富士山チェックリスト 富 士 山 決 算 マニュアル 富 士 山 賃 貸 管 理 財 務 会 計 を 使 用 して 決 算 を 行 う 場 合 の 一 般 的 な 手 順 をご 説 明 します 個 人 不 動 産 の 決 算 を 行 う 場 合 P1~P8 個 人 一 般 の 決 算 を 行 う 場 合 P4~P8 P11 青 色 申 告 特 別 控 除 額 の 入 力 個 人 農 業 の 決 算 を 行 う 場 合 P4~P11

More information

Microsoft Word - サンプル _データベースアクセス_.doc

Microsoft Word - サンプル _データベースアクセス_.doc データベースアクセスコンポーネント 1. 概 要 データベースアクセスコンポーネントとは SQL データベースにアクセスして SQL 文 を 実 行 することによりデータベース 検 索 を 行 う 機 能 を 提 供 するコ ンポーネントです また データベースアクセスコンポーネントでは データベースの 構 成 情 報 接 続 情 報 エラー 情 報 等 を 取 得 することも 可 能 です デ ータベースアクセスコンポーネントは

More information

「給与・年金の方」からの確定申告書作成編

「給与・年金の方」からの確定申告書作成編 所 得 が 給 与 のみ 公 的 年 金 のみ 給 与 と 公 的 年 金 のみ の 方 で 入 力 方 法 選 択 画 面 で 給 与 年 金 の 方 を 選 択 された 場 合 の 確 定 申 告 書 作 成 の 操 作 手 順 を 説 明 します ~ この 操 作 の 手 引 きをご 利 用 になる 前 に ~ この 操 作 の 手 引 きでは 確 定 申 告 書 の 作 成 方 法 をご 説

More information

< 目 次 > 8. 雇 用 保 険 高 年 齢 雇 用 継 続 給 付 27 ( 育 児 休 業 給 付 介 護 休 業 給 付 ) 8.1 高 年 齢 雇 用 継 続 給 付 画 面 のマイナンバー 設 定 27 8.2 高 年 齢 雇 用 継 続 給 付 の 電 子 申 請 28 8.3 高

< 目 次 > 8. 雇 用 保 険 高 年 齢 雇 用 継 続 給 付 27 ( 育 児 休 業 給 付 介 護 休 業 給 付 ) 8.1 高 年 齢 雇 用 継 続 給 付 画 面 のマイナンバー 設 定 27 8.2 高 年 齢 雇 用 継 続 給 付 の 電 子 申 請 28 8.3 高 雇 用 保 険 マイナンバー 改 定 向 け 操 作 説 明 書 < 目 次 > 1.マイナンバー 等 の 法 令 改 定 対 応 について 3 1.1 法 令 改 定 の 変 更 点 3 1.2 その 他 主 要 な 変 更 点 4 2.マイナンバー 管 理 システムとの 連 携 設 定 5 2.1 マイナ de 社 労 夢 の 運 用 設 定 5 2.2 マイナ de 社 労 夢 CL の 運

More information

01_07_01 データのインポート_エクスポート_1

01_07_01 データのインポート_エクスポート_1 データのインポート/エクスポートについて 概 要 スタッフエクスプレスでは 他 のソフトウェアで 作 成 されたスタッフデータ 得 意 先 データなどを 取 り 込 む(インポートする)ことができます また スタッフエクスプレスに 登 録 済 みのデータを Excel 形 式 CSV 形 式 で 出 力 (エクスポート)す ることができます 注 意 インポートできるデータは 次 の 条 件 を 満

More information

電子納品チェックシステム利用マニュアル

電子納品チェックシステム利用マニュアル 高 知 県 版 電 子 納 品 チェックシステム 利 用 マニュアル Ver.11 高 知 県 目 次 1. 概 要... 1 1-1 システムの 基 本 機 能... 1 1-2 システムの 機 能 概 要... 1 1-2-1 対 応 する 要 領 基 準... 1 1-2-2 動 作 環 境... 1 1-2-3 電 子 納 品 データのチェック 手 順... 2 2. インストール... 3

More information

工事記録写真チェックシステム 操作説明書

工事記録写真チェックシステム 操作説明書 工 事 記 録 写 真 チェックシステム - 操 作 説 明 書 - 平 成 24 年 11 月 東 日 本 高 速 道 路 株 式 会 社 中 日 本 高 速 道 路 株 式 会 社 西 日 本 高 速 道 路 株 式 会 社 - 目 次 - 1. 概 要 1-1. 対 象 要 領 1-2. 動 作 環 境 1-3. チェック 内 容 2. 操 作 方 法 2-1. システムの 起 動 2-2.

More information

目 次 1. 化 学 研 究 所 研 究 者 データベースについて... 1 2. 研 究 者 情 報 データベース 登 録 システムログイン 画 面... 2 3. メニュー 画 面... 3 3.1. パスワードの 変 更... 3 3.2. 公 開 時 の 表 示 / 非 表 示 の 設 定.

目 次 1. 化 学 研 究 所 研 究 者 データベースについて... 1 2. 研 究 者 情 報 データベース 登 録 システムログイン 画 面... 2 3. メニュー 画 面... 3 3.1. パスワードの 変 更... 3 3.2. 公 開 時 の 表 示 / 非 表 示 の 設 定. 化 学 研 究 所 研 究 者 データベース 操 作 手 引 書 第 5 版 2010 年 4 月 16 日 目 次 1. 化 学 研 究 所 研 究 者 データベースについて... 1 2. 研 究 者 情 報 データベース 登 録 システムログイン 画 面... 2 3. メニュー 画 面... 3 3.1. パスワードの 変 更... 3 3.2. 公 開 時 の 表 示 / 非 表 示 の

More information

5 振 込 依 頼 書 の 作 成 方 法 ()ツールの 起 動 コピーまたはダウンロードしたツールをダブルクリックして 開 いてください (ツール 起 動 の 際 マクロを 有 効 にしてください ) ダブルクリック 後 以 下 のメッセージが 出 力 されますので 読 み 取 り 専 用 ボタン

5 振 込 依 頼 書 の 作 成 方 法 ()ツールの 起 動 コピーまたはダウンロードしたツールをダブルクリックして 開 いてください (ツール 起 動 の 際 マクロを 有 効 にしてください ) ダブルクリック 後 以 下 のメッセージが 出 力 されますので 読 み 取 り 専 用 ボタン 振 込 依 頼 書 作 成 ツール のご 利 用 説 明 書 はじめに 振 込 依 頼 書 作 成 ツール( 以 下 ツール という ) は パソコンを 使 用 し 全 国 の ろうきんが 統 一 して 使 用 する 振 込 依 頼 書 を 作 成 するためのツールです ツールを 利 用 して 頂 くことで お 客 様 が 振 込 依 頼 書 を 手 書 きで 作 成 する 負 担 をなくし また

More information

2016 年 度 情 報 リテラシー 変 更 された 状 態 同 様 に 価 格 のセルを 書 式 設 定 する 場 合 は 金 額 のセルをすべて 選 択 し [ 書 式 ]のプルダウンメニューか ら[ 会 計 ]を 選 択 する すると が 追 加 され 金 額 としての 書 式 が 設 定 さ

2016 年 度 情 報 リテラシー 変 更 された 状 態 同 様 に 価 格 のセルを 書 式 設 定 する 場 合 は 金 額 のセルをすべて 選 択 し [ 書 式 ]のプルダウンメニューか ら[ 会 計 ]を 選 択 する すると が 追 加 され 金 額 としての 書 式 が 設 定 さ ( 第 11 回 )2016/06/27 表 計 算 を 利 用 した 集 計 作 業 この 回 では Excel を 用 いた 集 計 作 業 を 行 う 集 計 は 企 業 などで 事 実 を 記 録 したデータを 目 的 に 従 って 整 理 する 作 業 である Excel では 集 計 に 特 化 した 機 能 として テーブル ピポットテーブル という 機 能 がある 1. 課 題 の

More information

3. [ 送 信 ]をクリックすると パスワード 作 成 画 面 が 表 示 されます 4. [パスワードを 作 成 ]フィールドにパスワードを 入 力 します パスワードを 入 力 すると プライベートなファイルが 保 護 されます パスワードの 強 度 は 選 択 した 基 準 によ って 決

3. [ 送 信 ]をクリックすると パスワード 作 成 画 面 が 表 示 されます 4. [パスワードを 作 成 ]フィールドにパスワードを 入 力 します パスワードを 入 力 すると プライベートなファイルが 保 護 されます パスワードの 強 度 は 選 択 した 基 準 によ って 決 EncryptStick Lite セキュリティソフトウェア 用 Lexar クイックスタートガイド EncryptStick Lite スタートアップガイド 1. Lexar フラッシュドライブを PC または Mac コンピューターに 挿 入 します [EncryptStick Lite 登 録 ]ページが 表 示 されます EncryptStick が 自 動 的 に 起 動 します 自 動

More information

2 課 題 管 理 ( 科 学 研 究 費 補 助 金 ) 画 面 が 表 示 されます 補 助 事 業 期 間 終 了 後 欄 の[ 入 力 ] をクリックします [ 入 力 ]ボタンが 表 示 されていない 場 合 には 所 属 する 研 究 機 関 の 事 務 局 等 へお 問 い 合 わせく

2 課 題 管 理 ( 科 学 研 究 費 補 助 金 ) 画 面 が 表 示 されます 補 助 事 業 期 間 終 了 後 欄 の[ 入 力 ] をクリックします [ 入 力 ]ボタンが 表 示 されていない 場 合 には 所 属 する 研 究 機 関 の 事 務 局 等 へお 問 い 合 わせく 2.6. 研 究 成 果 報 告 書 の 作 成 2.6.1 研 究 成 果 報 告 内 容 ファイルを 作 成 1 科 学 研 究 費 助 成 事 業 の Web ページ 等 から 研 究 成 果 報 告 内 容 ファイル 様 式 をダウンロードし ます 2 ダウンロードした 研 究 成 果 報 告 内 容 ファイル 様 式 に 報 告 内 容 を 記 入 し 保 存 します 所 定 の 様 式

More information

Microsoft Word - 311Tools_END

Microsoft Word - 311Tools_END 11.1 テキストエディター(TeraPad) 第 11 章 さらに 使 いこなすためのツール Windows の 標 準 で 搭 載 されているテキストエディターのメモ 帳 Word などに 比 べて メモ 帳 は 軽 く ちょっとした 文 章 を 書 くのに 非 常 に 便 利 です しかし メモ 帳 は 軽 いだけに 機 能 性 はそれほど 高 くありません この 章 で 紹 介 する TeraPad

More information

Microsoft Word - 養生学研究投稿規定(改)

Microsoft Word - 養生学研究投稿規定(改) よ う せ い 養 生 学 研 究 投 稿 規 定 2000 年 3 月 11 日 施 行 2006 年 5 月 01 日 改 正 1. 養 生 学 研 究 ( 以 下 本 誌 と い う ) の 編 集 及 び 発 行 に 関 し て は こ の 規 定 の 定 め る と こ ろ に よ る. 2. 投 稿 資 格 本 誌 に 原 稿 を 投 稿 で き る 筆 頭 著 者 は, 原 則 と し

More information

あいち電子調達共同システム

あいち電子調達共同システム (2) 提 出 依 頼 書 の 確 認 提 出 依 頼 書 が 発 行 されると 利 用 者 登 録 で 指 定 したメールアドレスへお 知 らせが 送 信 されま すので 提 出 依 頼 書 を 確 認 します 調 達 案 件 一 覧 画 面 で 案 件 情 報 を 確 認 し 提 出 依 頼 書 を 表 示 します 操 作 1 調 達 案 件 検 索 画 面 で 検 索 条 件 を 入 力 し

More information

研究者情報データベース

研究者情報データベース 研 究 者 情 報 管 理 システム 研 究 者 向 けデータ 一 括 登 録 機 能 操 作 マニュアル 2013 年 6 月 4 日 目 次 1. はじめに... 1 1.1 本 マニュアルの 注 意 事 項... 1 2. 操 作 手 順... 2 2.1 データ 登 録 手 順... 2 2.2 データ 読 み 込 みエラー 時 の 対 応 手 順... 13 3. 登 録 データ 一 覧...

More information

SoftBank 202F 取扱説明書

SoftBank 202F 取扱説明書 NX!メールでメールやSMSを 管 理 する フォルダ 一 覧 画 面 について メールSMSを 確 認 する フォルダ 一 覧 画 面 の 見 かたは 次 のとおりです ホーム 画 面 で (NX!メール) フォルダ 一 覧 画 面 が 表 示 されます フォルダ 一 覧 画 面 が 表 示 されない 場 合 は または を 数 回 タップしてフォルダ 一 覧 画 面 に 戻 します フォルダ 一

More information

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図 平 成 2 8 年 3 月 25 日 NACSIS-CAT 検 討 作 業 部 会 NACSIS-CAT/ILL の 軽 量 化 合 理 化 について( 基 本 方 針 )( 案 ) これからの 学 術 情 報 システム 構 築 検 討 委 員 会 ( 以 下, これから 委 員 会 ) は これか らの 学 術 情 報 システムの 在 り 方 について ( 平 成 27 年 5 月 29 日 )

More information

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF pref : 2004/6/5 (11:8) pref : 2004/6/5 (11:8) pref : 2004/6/5 (11:8) 3 5 14 18 21 23 23 24 28 29 29 31 32 34 35 35 36 38 40 44 44 45 46 49 49 50 pref : 2004/6/5 (11:8) 50 51 52 54 55 56 57 58 59 60 61

More information

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編

POWER EGG V2.01 ユーザーズマニュアル ファイル管理編 POWER EGG V2.0 ユーザーズマニュアル ファイル 管 理 編 Copyright 2009 D-CIRCLE,INC. All Rights Reserved 2009.4 はじめに 本 書 では POWER EGG 利 用 者 向 けに 以 下 の POWER EGG のファイル 管 理 機 能 に 関 する 操 作 を 説 明 しま す なお 当 マニュアルでは ファイル 管 理 機

More information

2 Wee とは Wee はホームページの 更 新 ツールです Wee は サイトの 枠 組 みをWeb 製 作 業 者 が 作 成 し 更 新 は お 客 様 に 自 由 にしていただこうというコンセプトの 製 品 です インターネットに 繋 がる 場 所 ならどこからでも ブラウザでホームページ

2 Wee とは Wee はホームページの 更 新 ツールです Wee は サイトの 枠 組 みをWeb 製 作 業 者 が 作 成 し 更 新 は お 客 様 に 自 由 にしていただこうというコンセプトの 製 品 です インターネットに 繋 がる 場 所 ならどこからでも ブラウザでホームページ 1 ホームページ 更 新 ツール Wee&Wee Mobile のご 紹 介 http//www.i 2 Wee とは Wee はホームページの 更 新 ツールです Wee は サイトの 枠 組 みをWeb 製 作 業 者 が 作 成 し 更 新 は お 客 様 に 自 由 にしていただこうというコンセプトの 製 品 です インターネットに 繋 がる 場 所 ならどこからでも ブラウザでホームページの

More information

V-CUBE One

V-CUBE One V-CUBE One Office 365 連 携 マニュアル ブイキューブ 2016/06/03 この 文 書 は V-CUBE One の Office 365 連 携 用 ご 利 用 マニュアルです 更 新 履 歴 更 新 日 内 容 2016/02/09 新 規 作 成 2016/03/11 Office 365 ID を 既 存 の One 利 用 者 と 紐 付 ける 機 能 に 関 する

More information

1-1 一覧画面からの印刷

1-1 一覧画面からの印刷 第 7 章 公 報 の 印 刷 7-1 一 覧 画 面 からの 印 刷 検 索 された 公 報 は 印 刷 することができます 目 次 印 刷 や 公 報 全 文 複 数 件 の 公 報 印 刷 も 可 能 です はじめに 検 索 画 面 から 結 果 一 覧 ボタンを 押 して 検 索 結 果 一 覧 画 面 を 表 示 させます 印 刷 方 法 をご 確 認 ください 一 括 選 択 ( 反 転

More information

~ 目 次 ~ 1. 履 修 登 録 のながれ 1 2. 利 用 可 能 な 機 能 について 2 3.Web 履 修 登 録 画 面 へのログイン ログアウト 方 法 3 4. 予 備 登 録 ( 定 員 設 定 科 目 の 履 修 ) (1) 予 備 登 録 5 (2) 予 備 登 録 状 況

~ 目 次 ~ 1. 履 修 登 録 のながれ 1 2. 利 用 可 能 な 機 能 について 2 3.Web 履 修 登 録 画 面 へのログイン ログアウト 方 法 3 4. 予 備 登 録 ( 定 員 設 定 科 目 の 履 修 ) (1) 予 備 登 録 5 (2) 予 備 登 録 状 況 Web 履 修 登 録 マニュアル 問 い 合 わせ 先 履 修 方 法 や 授 業 に 関 すること 学 部 事 務 課 ( 本 館 2 階 ) システムへのアクセスやパスワード 等 について 情 報 基 盤 センターオフィス(3 号 館 1 階 ) ~ 目 次 ~ 1. 履 修 登 録 のながれ 1 2. 利 用 可 能 な 機 能 について 2 3.Web 履 修 登 録 画 面 へのログイン

More information

006-021_責)Wordトレ2-1章_斉

006-021_責)Wordトレ2-1章_斉 . Wordの 起 動 Wordの 基 礎 知 識. Wordの 起 動 Wordの 起 動 は 次 のように 行 います 他 のアプリケーションソフトのように いくつかの 起 動 方 法 があります スタートメニューからの 起 動 スタートメニューから 起 動 する 方 法 は 次 の 通 りです [スタート]メニューの[すべてのプログラム]から[Microsoft-Office]の [Microsoft-Word]を

More information

東近江行政組合職員の育児休業等に関する条例

東近江行政組合職員の育児休業等に関する条例 東 近 江 行 政 組 合 職 員 の 育 児 休 業 等 に 関 する 条 例 改 正 平 成 6 年 12 月 27 日 条 例 第 5 号 平 成 10 年 3 月 12 日 条 例 第 1 号 平 成 11 年 12 月 24 日 条 例 第 7 号 平 成 13 年 3 月 19 日 条 例 第 3 号 平 成 14 年 3 月 11 日 条 例 第 5 号 平 成 18 年 3 月 16

More information

第1章 財務諸表

第1章 財務諸表 財 務 報 告 論 2009( 太 田 浩 司 ) Lecture Note 10 1 第 10 章 損 益 会 計 1. 損 益 計 算 書 の 基 本 原 則 1.1 発 生 主 義 発 生 主 義 とは 費 用 収 益 の 計 上 時 点 を 現 金 収 支 の 有 無 にかかわらず その 発 生 の 事 実 に 基 づいて 行 うことを 要 求 する 原 則 である しかし 収 益 を 生

More information

メール 受 信 画 面 のレイアウトを 変 更 することができます ここでは 初 期 設 定 のレイアウトで 表 示 されているボタ ンやマークについて 解 説 します メール 一 覧 画 面 には 受 信 したメールが 一 覧 表 示 されます メール 受 信 タブをクリックすると 受 信 箱 フ

メール 受 信 画 面 のレイアウトを 変 更 することができます ここでは 初 期 設 定 のレイアウトで 表 示 されているボタ ンやマークについて 解 説 します メール 一 覧 画 面 には 受 信 したメールが 一 覧 表 示 されます メール 受 信 タブをクリックすると 受 信 箱 フ .3 1...3 メール 受 信 タブのサブメニューから 直 接 受 信 箱 以 外 のフォルダを 表 示 することもできます 共 有 メー ルボックスのフォルダは 指 定 できません 3. 35 メール 受 信 画 面 のレイアウトを 変 更 することができます ここでは 初 期 設 定 のレイアウトで 表 示 されているボタ ンやマークについて 解 説 します メール 一 覧 画 面 には 受

More information

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10

4 応 募 者 向 けメニュー 画 面 が 表 示 されます 応 募 者 向 けメニュー 画 面 で [ 交 付 内 定 時 の 手 続 を 行 う] [ 交 付 決 定 後 の 手 続 を 行 う]をクリックします 10 2 科 学 研 究 費 助 成 事 業 のトップページ 画 面 が 表 示 されます [ 研 究 者 ログイン]をクリック します 掲 載 している 画 面 は 例 示 です 随 時 変 更 されます 3 科 研 費 電 子 申 請 システムの 応 募 者 ログイン 画 面 が 表 示 されます e-rad の ID パ ス ワード を 入 力 し [ログイン]をクリックします 9 4 応 募 者

More information

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合 決 済 WG 7-1 論 点 の 整 理 1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合 紙 ICチップ 等 の 有 体 物 にその 価 値 が 記

More information

1.3 利 用 方 法 図 1 国 立 国 会 図 書 館 デジタルコレクション 送 信 サービスの 対 象 資 料 本 文 の 閲 覧 は 図 書 館 サービスカウンター 備 え 付 けの 専 用 パソコン(1 台 )のみでの 利 用 となります 利 用

1.3 利 用 方 法 図 1 国 立 国 会 図 書 館 デジタルコレクション  送 信 サービスの 対 象 資 料 本 文 の 閲 覧 は 図 書 館 サービスカウンター 備 え 付 けの 専 用 パソコン(1 台 )のみでの 利 用 となります 利 用 デジタル 化 資 料 送 信 サービス の 利 用 方 法 目 次 1 はじめに(サービスの 概 要 利 用 上 の 注 意 利 用 方 法 ) p.1 2 検 索 の 仕 方 ( 本 を 探 す) p.3 3 閲 覧 の 仕 方 ( 本 を 読 む) p.7 1 はじめに 1.1 サービスの 概 要 について デジタル 化 資 料 送 信 サービス ( 送 信 サービス)は 国 立 国 会 図 書

More information

目 次 Ⅰ 集 計 支 援 ツールの 準 備 に 関 するQ&A 1 H27 集 計 支 援 ツール.zip ファイルを 展 開 して 作 成 した,1 ~4のフォルダはどのように 利 用 すればよいか? Ⅱ 必 要 なファイルの 準 備 に 関 するQ&A 1 解 答 回 答 状 況 ファイルや,

目 次 Ⅰ 集 計 支 援 ツールの 準 備 に 関 するQ&A 1 H27 集 計 支 援 ツール.zip ファイルを 展 開 して 作 成 した,1 ~4のフォルダはどのように 利 用 すればよいか? Ⅱ 必 要 なファイルの 準 備 に 関 するQ&A 1 解 答 回 答 状 況 ファイルや, 平 成 27 年 度 全 国 学 力 学 習 状 況 調 査 集 計 支 援 ツール Q&A 集 1 目 次 Ⅰ 集 計 支 援 ツールの 準 備 に 関 するQ&A 1 H27 集 計 支 援 ツール.zip ファイルを 展 開 して 作 成 した,1 ~4のフォルダはどのように 利 用 すればよいか? Ⅱ 必 要 なファイルの 準 備 に 関 するQ&A 1 解 答 回 答 状 況 ファイルや,

More information

Taro-1-14A記載例.jtd

Taro-1-14A記載例.jtd 募 集 株 式 の 発 行 ( 非 公 開 会 社 のうち 非 取 締 役 会 設 置 会 社 ) 受 付 番 号 票 貼 付 欄 株 式 会 社 変 更 登 記 申 請 書 1. 会 社 法 人 等 番 号 0000-00 - 000000 分 かる 場 合 に 記 載 してください 1. 商 号 1. 本 店 1. 登 記 の 事 由 商 事 株 式 会 社 県 市 町 丁 目 番 号 募 集

More information

大田市固定資産台帳整備業務(プロポーザル審査要項)

大田市固定資産台帳整備業務(プロポーザル審査要項) 大 田 市 整 備 業 務 プロポーザル 審 査 要 項 大 田 市 業 務 プロポーザルの 審 査 は 提 案 書 等 を 下 記 のとおり 審 査 評 価 するものとす る. 審 査 の 対 象 事 業 者 審 査 の 対 象 事 業 者 は 次 の()から()に 掲 げる 条 件 をすべて 満 たし 一 つでも 満 たない 場 合 は 審 査 の 対 象 事 業 者 に 該 当 しないものとする

More information

設定フロー ★印は必須の設定です

設定フロー ★印は必須の設定です AutoBiz StartUp Manual オートビズ 基 本 設 定 マニュアル ( 一 括 登 録 ~ メルマガ 配 信 編 ) 目 次 1. 登 録 用 アドレスリスト(CSV ファイル)の 作 成... 2 2.シナリオ 名 の 変 更...4 3. 登 録 ページ 作 成 でフォームを 作 成... 5 4. 完 了 ページ 作 成 で 解 除 完 了 ページの 設 定... 7 5.

More information

AdobeReader(pdf)の 場 合 1) AdobeReader で 文 書 を 開 き [ ファイル ] > [ プロパティ ]を 選 択 します 2) [ ページサイズ ]の 値 を 確 認 します 3. 定 格 サイズかを 確 認 する 下 にある A 列 B 列 の 寸 法 一 覧

AdobeReader(pdf)の 場 合 1) AdobeReader で 文 書 を 開 き [ ファイル ] > [ プロパティ ]を 選 択 します 2) [ ページサイズ ]の 値 を 確 認 します 3. 定 格 サイズかを 確 認 する 下 にある A 列 B 列 の 寸 法 一 覧 大 判 プリンターの 利 用 方 法 2010 年 11 月 情 報 処 理 センター 1. 印 刷 対 象 のファイルの 確 認 大 判 印 刷 は 印 刷 するサイズが 大 きい 関 係 で 課 されるポイントも 大 きいものとなります (A1/コートで 600 ポイント A0/ 光 沢 フォトで 1400 ポイント) そのため 印 刷 に 失 敗 すると 損 害 も 大 きいので 印 刷 を

More information

(3) 下 記 画 面 が 表 示 されます 参 照 ボタンを 押 下 すると 図 5.1-4フォルダ 指 定 画 面 が 表 示 されるので 保 存 先 を 指 定 し OKボタン を 押 下 します 展 開 ボタンを 押 下 します 図 5.1-3 ファイルの 展 開 先 ( 保 存 場 所 )

(3) 下 記 画 面 が 表 示 されます 参 照 ボタンを 押 下 すると 図 5.1-4フォルダ 指 定 画 面 が 表 示 されるので 保 存 先 を 指 定 し OKボタン を 押 下 します 展 開 ボタンを 押 下 します 図 5.1-3 ファイルの 展 開 先 ( 保 存 場 所 ) 第 5 章 Java ポリシーの 設 定 5.1 Java ポリシー 設 定 ツールのダウンロードと 解 凍 Java のインストールが 終 了 致 しましたら 電 子 入 札 システムポータルサイトより Java ポリシー 設 定 ツールをダウンロードします Java ポリシー 設 定 ツールは OS のバージョンによって 異 なります 適 切 なものをダウンロードしてください Window10(32bit

More information

している 5. これに 対 して 親 会 社 の 持 分 変 動 による 差 額 を 資 本 剰 余 金 として 処 理 した 結 果 資 本 剰 余 金 残 高 が 負 の 値 となるような 場 合 の 取 扱 いの 明 確 化 を 求 めるコメントが 複 数 寄 せられた 6. コメントでは 親

している 5. これに 対 して 親 会 社 の 持 分 変 動 による 差 額 を 資 本 剰 余 金 として 処 理 した 結 果 資 本 剰 余 金 残 高 が 負 の 値 となるような 場 合 の 取 扱 いの 明 確 化 を 求 めるコメントが 複 数 寄 せられた 6. コメントでは 親 第 265 回 企 業 会 計 基 準 委 員 会 資 料 番 号 日 付 審 議 事 項 (3) 2013 年 5 月 29 日 プロジェクト 項 目 企 業 結 合 (ステップ2) 公 開 草 案 に 対 するコメントへの 対 応 I. 検 討 の 経 緯 1. 平 成 25 年 1 月 に 企 業 会 計 基 準 公 開 草 案 第 49 号 企 業 結 合 に 関 する 会 計 基 準 (

More information

目 次 1 ご 使 用 の 前 に 1.1 動 作 環 境 1.2 セットアップ 方 法 2 使 用 方 法 2.1 起 動 方 法 2.2 操 作 方 法 2.2.1 効 果 音 設 定 2.2.2 アニメーション 設 定 2.2.3 スライドジャンプ 設 定 2.2.4 フラッシュカード 設 定

目 次 1 ご 使 用 の 前 に 1.1 動 作 環 境 1.2 セットアップ 方 法 2 使 用 方 法 2.1 起 動 方 法 2.2 操 作 方 法 2.2.1 効 果 音 設 定 2.2.2 アニメーション 設 定 2.2.3 スライドジャンプ 設 定 2.2.4 フラッシュカード 設 定 マニュアル(2013.11.22ver) 目 次 1 ご 使 用 の 前 に 1.1 動 作 環 境 1.2 セットアップ 方 法 2 使 用 方 法 2.1 起 動 方 法 2.2 操 作 方 法 2.2.1 効 果 音 設 定 2.2.2 アニメーション 設 定 2.2.3 スライドジャンプ 設 定 2.2.4 フラッシュカード 設 定 2.2.5 時 間 指 定 スライド 移 動 設 定 2.2.6

More information

機 能 概 要 概 要 平 成 24 年 度 シームレスな 地 域 連 携 医 療 の 実 現 実 証 事 業 に 対 応 するため 地 域 連 携 システム( 能 登 北 部 版 )を 構 築 する 機 能 < 機 能 追 加 変 更 一 覧 > 1. 画 像 連 携 機 能 院 内 で 撮 影

機 能 概 要 概 要 平 成 24 年 度 シームレスな 地 域 連 携 医 療 の 実 現 実 証 事 業 に 対 応 するため 地 域 連 携 システム( 能 登 北 部 版 )を 構 築 する 機 能 < 機 能 追 加 変 更 一 覧 > 1. 画 像 連 携 機 能 院 内 で 撮 影 厚 生 労 働 省 シームレスな 健 康 情 報 活 用 基 盤 実 証 事 業 地 域 連 携 システム システム 仕 様 書 1 機 能 概 要 概 要 平 成 24 年 度 シームレスな 地 域 連 携 医 療 の 実 現 実 証 事 業 に 対 応 するため 地 域 連 携 システム( 能 登 北 部 版 )を 構 築 する 機 能 < 機 能 追 加 変 更 一 覧 > 1. 画 像 連

More information

迷惑メールフィルタリングコントロールパネル利用者マニュアル

迷惑メールフィルタリングコントロールパネル利用者マニュアル 迷 惑 メールフィルタリングサービス コントロールパネル 利 用 者 マニュアル( 一 般 ユーザ 向 け) 第 1.6 版 目 次 1. 本 マニュアルについて... 1 2. はじめに... 1 3. 使 用 方 法... 2 3.1. ご 使 用 の 前 に... 2 3.2. ログイン / ログアウト 操 作... 2 3.2.1. ログイン 操 作... 2 3.2.2. ログアウト 操

More information

03_主要処理画面.xlsx

03_主要処理画面.xlsx 見 積 受 注 入 力 見 積 と 受 注 は 同 じ 画 面 で 入 力 します 基 本 情 報 の 状 況 欄 で 見 積 か 受 注 かを 選 択 して 登 録 します 見 積 から 受 注 にかわったときは 見 積 伝 票 を 修 正 で 開 き 状 況 を 受 注 に 変 更 して 登 録 します 出 荷 する 倉 庫 や 納 期 は 明 細 行 ごとに 指 定 できます 受 注 の 場

More information