た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Similar documents
PowerPoint プレゼンテーション

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

JavaプログラミングⅠ

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint ppt

Microsoft PowerPoint - chap10_OOP.ppt

JavaプログラミングⅠ

JavaプログラミングⅠ

Prog1_6th

メディプロ1 Javaプログラミング補足資料.ppt

スライド 1

Javaの作成の前に

PowerPoint プレゼンテーション

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

PowerPoint プレゼンテーション

Prog1_15th

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

PowerPoint プレゼンテーション

Prog2_9th

GEC-Java

Javaプログラムの実行手順

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Java言語 第1回

JavaプログラミングⅠ

Prog1_10th

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

GEC-Java

オブジェクト指向プログラミング・同演習 5月21日演習課題

Microsoft PowerPoint - prog04.ppt

GEC-Java

デジタル表現論・第6回

Prog1_2nd

Microsoft PowerPoint - prog09.ppt

Prog2_12th

Microsoft PowerPoint - prog09.ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Java講座

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

JavaプログラミングⅠ

ガイダンス

プログラミング入門1

JavaプログラミングⅠ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

JavaプログラミングⅠ

メソッドのまとめ

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Microsoft PowerPoint - lec06 [互換モード]

プログラミング入門1

基本情報STEP UP演習Java対策

プログラミング入門1

PowerPoint プレゼンテーション

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

Prog1_3rd

Java知識テスト問題

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

System.out.println("char : " + (int)character.min_value + "~" + (int)character.max_value); System.out.println("float : " + Float.MIN_VALUE + "~" + Flo

プログラミング入門1

2

デジタル表現論・第4回

JavaプログラミングⅠ

プログラミングA

第2回講義

JAVA入門

Make the Future Java FY13 PPT Template

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

Prog2_9th

JavaプログラミングⅠ

プログラミング実習I

プログラミング入門1

JavaプログラミングⅠ

演算増幅器

プログラミング入門1

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

プログラミング入門1

とても使いやすい Boost の serialization

プログラミング入門1

Javaによるアルゴリズムとデータ構造

基礎プログラミング2015

JavaプログラミングⅠ

ガイダンス

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Prog2_10th

レコードとオブジェクト

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

情報実習Ⅱ

問題1 以下に示すプログラムは、次の処理をするプログラムである

JAVA とテンプレート

Microsoft PowerPoint pptx

DVIOUT-exer

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Microsoft Word - NonGenTree.doc

ガイダンス

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Transcription:

クラス ( 教科書第 8 章 p.267~p.297) 前回は処理をまとめる方法として メソッドについて学習した 今回はメソッドとその処理の対象となるデータをまとめるためのクラスについて学習する このクラスはオブジェクト指向プログラミングを実現するための最も重要で基本的な技術であり メソッドより一回り大きなプログラムの部品を構成する 今回はクラスにおけるデータの扱いとクラスの作成方法 使用方法について説明していく データの扱い以下のプログラムは 2 名の銀行口座のデータを変数で定義し 初期化した値を出力している簡単なプログラムである ( 教科書 p.268) プログラム例 1( ソースファイル名 :Accounts.java) public class Accounts public static void main(string[] args) String adachiaccountname = " 足立幸一 "; // 足立君の口座名義 String adachiaccountno = "123456"; // 足立君の口座番号 long adachiaccountbalance = 1000; // 足立君の預金残高 String nakataaccountname = " 仲田真二 "; // 仲田君の口座名義 String nakataaccountno = "654321"; // 仲田君の口座番号 long nakataaccountbalance = 200; // 仲田君の預金残高 adachiaccountbalance -= 200; nakataaccountbalance += 100; // 足立君が 100 円おろす // 仲田君が 100 円預ける System.out.println(" 足立君の口座 "); System.out.println(" 口座名義 :" + adachiaccountname); System.out.println(" 口座番号 :" + adachiaccountno); System.out.println(" 預金残高 :" + adachiaccountbalance); System.out.println(" 仲田君の口座 "); System.out.println(" 口座名義 :" + nakataaccountname); System.out.println(" 口座番号 :" + nakataaccountno); System.out.println(" 預金残高 :" + nakataaccountbalance); 実行結果 足立君の口座口座名義 : 足立幸一口座番号 :123456 預金残高 :800 仲田君の口座口座名義 : 仲田真二口座番号 :654321 預金残高 :300 このプログラムでは口座名義 口座番号 預金残高の3つのデータについて 2 名分の変数を定義して利用している 例えば 足立 用ならば adachiaccountname adachiaccountno adachiaccountbalance というように変数名に adachi を付けて宣言して区別している しかし これらのデータはひとまとまりとして扱った方がすっきりするし 便利である Java ではこういっ - 1 -

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name; // 口座名義 String no; // 口座番号 long balance; // 預金残高 // 銀行口座クラスをテストするクラス public class AccountTester public static void main(string[] args) Account adachi = new Account(); // 足立君の口座 Account nakata = new Account(); // 仲田君の口座 adachi.name = " 足立幸一 "; // 足立君の口座名義 adachi.no = "123456"; // 足立君の口座番号 adachi.balance = 1000; // 足立君の預金残高 nakata.name = " 仲田真二 "; // 仲田君の口座名義 nakata.no = "654321"; // 仲田君の口座番号 nakata.balance = 200; // 仲田君の預金残高 adachi.balance -= 200; nakata.balance += 100; // 足立君が 100 円おろす // 仲田君が 100 円預ける System.out.println(" 足立君の口座 "); System.out.println(" 口座名義 :" + adachi.name); System.out.println(" 口座番号 :" + adachi.no); System.out.println(" 預金残高 :" + adachi.balance); 実行結果同じ System.out.println(" 仲田君の口座 "); System.out.println(" 口座名義 :" + nakata.name); System.out.println(" 口座番号 :" + nakata.no); System.out.println(" 預金残高 :" + nakata.balance); このプログラムでは今までと違い クラスが二つ存在している それぞれのクラスは以下の通りである Account : 銀行口座クラス AccountTester : クラス Account をテストするクラス ソースファイルはフォルダ Chap08 を作成し ファイル名を AccountTester.java として保 - 2 -

存すること これは main メソッドが含まれるクラス名をファイル名.java として利用してきた今までの使い方と変わらない プログラムをコンパイルすると クラス毎にクラスが作成されるため 以下のようなファイル構成になる Chap08 -AccountTester.java -Account.class -AccountTester.class クラス宣言プログラム例 2 において 銀行口座クラスを宣言した部分を抜き出すと以下になる // 銀行口座クラス class Account String name; // 口座名義 String no; // 口座番号 long balance; // 預金残高 クラスを構成するデータは フィールド と呼ばれ 銀行口座クラスは 3 つフィールドから構成されている クラス宣言は 型 を宣言するため 実体 ( 変数 ) を用意するためには以下のようにして行う Account adachi = new Account(); // 足立君の口座 Account nakata = new Account(); // 仲田君の口座 Account 型によって宣言された adachi や nakata は銀行口座クラスを参照するクラス型変数であるため 実体そのものは new で生成して代入する この使い方は配列の生成 乱数の生成 (Random) やキーボードからの入力 (Scanner) の時に利用した new クラス名 () という形式と同様である new 演算子によって生成されたクラス型の 実体 を インスタンス と呼び インスタンスを生成することを インスタンス化 と呼ぶ また 配列の本体やクラスのインスタンスはプログラム上 new によって実体が動的に生成される プログラム実行時に動的に生成される実体を総称して オブジェクト と呼ぶ インスタンス変数とフィールドアクセスクラス Account 型のインスタンスは 3 つのフィールドをもっている これらの個別のデータにアクセスするには メンバアクセス演算子 (.) を用いる これは フィールドアクセス演算子 や ドット演算子 とも呼ばれる プログラム内での使用方法は以下のようになる adachi.name = " 足立幸一 "; // 足立君の口座名義 adachi.no = "123456"; // 足立君の口座番号 adachi.balance = 1000; // 足立君の預金残高 フィールドはインスタンス内の変数であるので インスタンス変数 とも呼ばれる フィールドの初期化配列を学んだ時にも述べたが 配列の構成要素は生成時に 既定値 によって初期化される 同様にして フィールドも既定値によって初期化が行われている プログラム例 2 において 値の代入部分を削除した場合には以下のような出力結果となる 実行結果 - 3 -

足立君の口座口座名義 :null 口座番号 :null 預金残高 :0 仲田君の口座口座名義 :null 口座番号 :null 預金残高 :0 銀行口座クラス第 2 版銀行口座クラス第 1 版ではクラスを導入し 変数をまとめた しかし以下の問題点が残っている データの保護に対する無保証各銀行口座クラスのデータは他のプログラム ( クラス ) から自由に変更することが可能となっている これらのデータに対する変更はプログラム上制限されているほうが良い これについては データ隠蔽 という仕組みが Java には用意されている 初期化に対する無保証フィールドは既定値で暗示的に初期化される その後 値の設定を行うかどうかをプログラマに委ねている 値を設定し忘れたプログラムは予期しない動作を起こす可能性があるため とても危険である 初期化する必要があるフィールドは強制的に行う状態にすべきである この問題を解決するために Java ではこの場合 コンストラクタ というものが用意されている これらの仕組みを反映させた銀行口座クラス第 2 版のプログラムを以下に示す プログラム例 3( ソースファイル名 :account2/accounttester.java) // 銀行口座クラスとそれをテストするクラス第 2 版 // 銀行口座クラス class Account // フィールド private String name; // 口座名義 private String no; // 口座番号 private long balance; // 預金残高 // コンストラクタ Account(String n, String num, long z) name = n; // 口座名義 no = num; // 口座番号 balance = z; // 預金残高 // メソッド // 口座名義を調べる String getname() return name; // 口座番号を調べる String getno() - 4 -

return no; // 預金残高を調べる long getbalance() return balance; // k 円預ける void deposit(long k) balance += k; // k 円おろす void withdraw(long k) balance -= k; // 銀行口座クラスをテストするクラス public class AccountTester public static void main(string[] args) Account adachi = new Account(" 足立幸一 ", "123456", 1000); Account nakata = new Account(" 仲田真二 ", "654321", 200); adachi.withdraw(200); nakata.deposit(100); // 足立君が 100 円おろす // 仲田君が 100 円預ける System.out.println(" 足立君の口座 "); System.out.println(" 口座名義 :" + adachi.getname()); System.out.println(" 口座番号 :" + adachi.getno()); System.out.println(" 預金残高 :" + adachi.getbalance()); 実行結果同じ System.out.println(" 仲田君の口座 "); System.out.println(" 口座名義 :" + nakata.getname()); System.out.println(" 口座番号 :" + nakata.getno()); System.out.println(" 預金残高 :" + nakata.getbalance()); このプログラムでは Account クラスがフィールドとコンストラクタとメソッドの 3 つによって構成されている また プログラム例 2 と比べると フィールドの宣言には以下のように private という記述が追加されている - 5 -

private String name; // 口座名義 private String no; // 口座番号 private long balance; // 預金残高 この記述を追加したフィールドは 非公開アクセス となり クラスの外部に対して存在を隠す ( データ隠蔽 ) これはどういうことかというと 例えば以下のような記述が main メソッド側にあると コンパイルエラーとなる // main メソッド内にあるとコンパイルエラーになる処理 adachi.name = " 仲田真二 "; // 口座名義の変更 adachi.no = "999999"; // 口座番号の変更 System.out.println(adachi.balance); // 預金残高の表示 つまり main メソッド内では adachi.name などのフィールドは直接利用することができず これらのフィールドへのアクセスは adachi.getname() などのように メソッドを利用して行うことになる アクセス手段 ( 値を利用するだけなのか フィールドへの値の代入を許可するのか ) は用意するメソッドによって確保する フィールドを非公開にしてデータ隠蔽を行うとデータの保護性やプログラムの保守性が向上することが期待され 基本的には全てフィールドは private で宣言することが望ましい private を省略してしまうと フィールドは デフォルトアクセス となる これはフィールドが公開されている状態である 注 : デフォルトアクセスは 正確にはパッケージ内で公開となり パッケージ外部では非公開となることから パッケージアクセスとも呼ばれる パッケージについては教科書第 11 章に示されている パッケージとは簡単に言うと 関連するクラスをまとめたものである プログラム例 3 からコンストラクタの部分を抜き出すと以下のようになっている // コンストラクタ Account(String n, String num, long z) name = n; // 口座名義 no = num; // 口座番号 balance = z; // 預金残高 コンストラクタはメソッドに似ているが その特徴はクラス名と同じであり 返却値を持つことができない コンストラクタは以下の下線部のインスタンス生成時に呼び出される Account adachi = new Account(" 足立幸一 ", "123456", 1000); Account nakata = new Account(" 仲田真二 ", "654321", 200); コンストラクタは以下のように引数が一致しない場合にはエラーとなる // コンパイルエラーになる処理 new Account(); new Account(" 足立幸一 ") この仕組みによって インスタンスの初期化をクラスの利用者に強制することで適切な初期化を実現している 次に Account クラスに宣言したメソッドについて述べていく メソッドは以下のような形で宣言 - 6 -

する // 口座名義を調べる String getname() return name; : : // k 円預ける void deposit(long k) balance += k; : private で宣言したフィールドへアクセスするメソッドには static を付けない static を付けるとコンパイルエラーとなる このプログラムの場合 それぞれのクラス用のインスタンスが生成される つまり adachi nakata それぞれのフィールドにアクセスするためのメソッド (getname() の場合は adachi.getname() と nakata.getname() が用意される ) を持つことになる static を付けないメソッドは個々のインスタンスに所属するため インスタンスメソッド と呼ばれる メソッドはクラス Account 内で宣言しているため 非公開フィールドへのアクセスが許可される クラスの外部 (main メソッドなど ) から直接アクセスできない private で宣言した非公開フィールドはクラスメソッドを利用して間接的にアクセスすることができる これはコンストラクタも同様である このように非公開フィールドによって外部からデータを保護した上で メソッドとフィールドを連携させて利用することを カプセル化 という この場合フィールドはインスタンスの状態を表すことになるので ステート とも呼ばれる オブジェクト指向プログラミングではインスタンスメソッドを呼び出すことを オブジェクトにメッセージを送る と表現する プログラム例 3 の場合 例えば adachi.getname() を呼び出すことによって オブジェクト ( インスタンス ) である adachi に口座名を教えて欲しいとメッセージを出し 結果オブジェクト adachi は返答処理として 口座名を返却するという流れになる 補足ここまでの処理をどう捉えましたか? 自分でプログラムを書く場合にはプログラム例 1 のように書いておけば動くし プログラム例 3 のように書くのは憶えることが多いし プログラムの書く量も増えるから面倒だ と感じていませんか? これらの概念はクラスを作成する人と利用する人が別の場合に大きな意味が出てきます 例えば プログラム例 3 でクラスを作成する人が class Account から void withdraw(long k) を無くしたとします この場合 このクラスを利用する人はクラス内で管理しているお金を引き出す処理を行うことができなくなります これは例えば 今までにキーボードから int 型の値を入力する処理には stdin.nextint(); という処理を用いてきましたが この処理が java.util.scanner のパッケージ ( クラス ) から無くなった場合 直接 int 型の値をキーボードから入力する手段をパッケージの利用者が失うことと同様です ( この処理を自作するというなら別ですが ) このように Java ではデータへのアクセスや提供する処理をクラス作成者が決定します つまり クラス作成者の想定外の利用をさせないようにすることで データの保護を行う仕組みになっています これは複数の人間でプログラムの作成に関わる場合 バグが入りにくくなるというメリットがあり とても重要な技術です 演習 1. プログラム例 1~3 を作成して 出力を確認しなさい 2. 教科書 p.286~ の自動車クラスについて教科書を読み List8-4~6 を作成しなさい この場合 - 7 -

それぞれのファイルは別のファイルに記述する必要がある 同じフォルダに 3 つのファイルを作成し List8-4 については最初にコンパイルして.class ファイルを生成しておく必要がある 3. 教科書 p.293 演習 8-2 について行う 自動車クラス Car に自由にフィールドやメソッドを追加してみること - 8 -