オブジェクト指向アプローチ論 第8回 |
このページは,2007年前期まで実施されていた科目の補助教材ページです。既に履修し終わった方々 の参考のために公開を継続しています。したがって,内容が古いままのものが残っておりますので注意 して下さい。 ※2007年度より実施されている2年生選択科目「オブジェクト指向プログラミングa」のページはここ ではありません。「オブジェクト指向プログラミングa」のページはこちらです。 |
●モジュールの作り方「Javaを学ぶ 第9回 (2003年1月 )」
【パッケージとアクセス指定】
●クラスのアクセス指定
(ex.1) class A {} // アクセス指定無しクラス
(ex.2) public class A {} // publicクラス
指定無しクラス | publicクラス | |
同一パッケージ内のクラスから | ○ | ○ |
別のパッケージ内のクラスから | × | ○ |
privateメンバ | 指定無しメンバ | publicメンバ | |
同一クラス内から | ○ | ○ | ○ |
同一パッケージ内のクラスから | × | ○ | ○ |
別のパッケージ内のクラスから | × | × | ○ |
●演習
手順0)先ほど作成した
RPNCalc.java,RPNCalc.class ,MyStack.class,RPNCalcTest1.class
を削除せよ。これらは,パッケージ化するまえのものなので,もう必要がない。
(というよりも,有ると以降の演習の邪魔になる)
手順1)下図(Fig.10b)のように,「マイドキュメント」(Z:\MyDocuments)ディレクトリの下に,
myclassesディレクトリ以下,calculatorディレクトリまでを作成せよ(綴りを間違えない
ように気をつけること)
手順2)RPNCalc.java (package宣言無しバージョン) を,上図のcalculatorディレクトリに保存し,
下図(1)のようにpackage宣言を書き加えて保存し直せ。
今,状況は次のようになっている。
手順3)下図(Fig.11)の(3)「大学のデスクトップPCのWindows XP」用の設定をせよ
手順4)手順の3)で行った設定の変更を有効にするため,コマンドプロンプトを新しく起動せよ
手順5)先ほどのRPNCalcTest1.java (import宣言無しバージョン) に,下図(1)のようにimport宣言を付けて,
保存,手順4で開いたコマンドプロンプトでコンパイルせよ。
コンパイルがうまくいくと,RPNCalc.classとMyStack.classがcalculatorディレクトリの中に出来てい
るはずであるので,確認せよ(下図)。
ここで起こったことを順序立てて書くと次のようになる。
1)javaコンパイラがRPNCalcTest1.javaをコンパイルするとき,必要になるRPNCalcクラスが見つか
らないので,CLASSPATHによりパッケージ階層の起点であるディレクトリ(この場合,
Z:\MyDocuments\myclasses)を割り出す。
2)次いで,パッケージ階層の起点ディレクトリ(myclasses)とimport宣言の内容から
Z:\MyDocuments\myclasses\com\learnjava2002\calculator
ディレクトリにクラスファイルRPNCalc.classがあるのではないかと推測する。
3)しかし,そのcalculatorディレクトリ内には,コンパイル済みのRPNCalc.classはまだ無い。そこで
javaコンパイラは,RPNCalcクラスを定義しているはずのソースファイルRPNCalc.javaを探す。そ
うして,calculatorディレクトリ内にRPNCalc.javaを見つけたjavaコンパイラは,RPNCalc.javaを
コンパイルしてcalculatorディレクトリの中に,RPNCalc.classとMyStack.classを生成したのである
(上図の矢印)。
手順6)手順の5でコンパイルしたRPNCalcTest1.classを実行してみよう。実行は例えば,
> java RPNCalcTest1 1 2 + 3 4 - x
とする。うまくいくと計算ができるはずである(実行に失敗する場合,ディレクトリ階層の名前,環境変
数CLASSPATH,List 4のpackage宣言,List 5のimport宣言などにスペルミスがある可能性が高い)。
ここで,javaコマンドがRPNCalcTest1.classを実行するとき,javaコマンドはRPNCalc.classが
Z:\MyDocuments\myclasses\com\learnjava2002\calculator 内にあることを,環境変数CLASSPATH
およびList 5のimport宣言を手がかりにして知り,
RPNCalcTest1.class
calculatorディレクトリ内のRPNCalc.class,MyStack.class
をひとつのプログラムに結合して,実行しているのである。
【UML】
◎統一モデリング言語UML
クラスやオブジェクトの関係などを図で表記する方法を,一般にオブジェクトモデリング表記法と呼びます。
オブジェクト指向分析・設計の手法は,数多くの研究者・技術者グループが独自の方法論を展開し,オブジェクトモデリング表記法もそれぞれのグループが自らの方法論に合わせたものを使用していました。これらの多くは概念的には共通している部分が多かったにもかかわらず,実際の表記法や語彙の定義は異なっており,オブジェクトモデリングの技術論を扱う上で大きな障害になっていました。やがて統一された共通のオブジェクトモデリング表記法の必要性をうったえる声が高まり,統一モデリング言語UML(Unified Modeling Language)という標準的な表記法の策定が開始されました。そして,UMLのバージョン1.1(UML 1.1)が,1997年11月にOGM(Object Management Group)によって正式な標準として承認されました。
○クラスの表記
UMLの一番基本的な図は,クラスを表すクラス図です。下図Fig.1にクラス図の基本的な表記法を示します。
まず,一般のクラスはFig.1-(1)のように,中身が3つに区分けされた長方形で示します。一番上の区画は“名前区画”と言い,その中にクラスの名前を書きます。一般にクラス名は典型的には大文字で始まり,区画の中央にボールド体で書かれます。
中央の区画は,“属性区画”と言い,その中に属性を書き並べます。属性(attribute)とは変数(フィールド)やfinal定数のことと思ってかまいません。重要でない属性は省略することができます。属性はFig.1-(2)に示す構文で属性区画に標準体・左詰めで書かれます。“可視性(visiblity)”は,その属性のアクセス特性でFig.1-(3)に示すように
+ … public
~ … package
# … protected (未学習)
- … private
の3つがあります。可視性は省略することはできますが,それは可視性がpublicであるとか未決定であるとかを示しているわけではないので,注意して下さい。
“名前”はその属性の名前で,一般に小文字で始まります。“タイプ式”はその属性の型名と思ってかまいません。“プロパティ文字列”は,その属性の特性を明示するための文字列です。例えば,その属性が定数のように変更不可能なものであることを明示するときには,プロパティ文字列frozenを使用します。frozenはUMLで定められている標準のプロパティですが,必要に応じてユーザ定義のプロパティを導入してもかまいません。特にプロパティを明示する必要がなければ,{}ごと省略することが可能です。
属性には,クラス属性とインスタンス属性があります。前者はクラス変数(staticなフィールド),後者はインスタンス変数(非staticなフィールド)に相当します。クラス属性には,“名前:タイプ式”の部分に下線を引き,インスタンス属性では下線を引きません。
一番下の区画には,操作(operation)を書きます。操作(operation)とはクラスまたはそのオブジェクトが持っている,なにかしらのサービスです。これに相当するプログラミング言語の文法要素は,“メソッド”です。重要でない操作は省略することができます。
操作はFig.1-(4)に示す構文を使い,操作区画に標準体で左詰めに書かれます。“可視性”は属性のところで説明したものと同じです。操作の“名前”は典型的には小文字で始まるようにします。“仮引数リスト”部分は,各引数をFig.1-(5)で示す構文で表したものをカンマで区切って0個以上並べます。各仮引数を修飾する“種類”は
in,out,inout
の3つのうちのいずれかです。これは仮引数が操作への入力として用いられるか,出力として用いられるかその両方か,に対応しています。デフォルトはinです。“引数リスト”と“返値のタイプ式”は必要に応じてともに省略することができます。
操作にもプロパティを付加することができます。操作にもクラススコープ操作とインスタンススコープ操作があります。前者はクラスメソッド(staticなメソッド),後者はインスタンスメソッド(非staticなメソッド)に対応します。クラススコープ操作は,全体に下線を引いてその旨を明示します。
あるクラスで操作の実装部が与えられている場合,その定義内容を明示したいときがあります。その場合,ノート(note)と呼ばれる,右上の角が折れた長方形を書き,その中に定義内容を書いて,破線でその定義を持つ操作に結びつけます((Fig.1-(1)の下部))。
Fig.1-(1)のクラス図に対応するC++とJavaのソースコード例をそれぞれList 1,List 2および,下図に示します。なお,これらの例では操作は属性アクセッサのみですが,一般にはこのようなアクセッサは重要ではないので省略されます。