JavaとUMLで学ぶオブジェクト指向の考え方 第1章 オブジェクト指向の

JavaとUMLで学ぶオブジェクト指向の考え方
第1章
オブジェクト指向のコンセプト
2003年6月2日(月)
荒木研究室
山之上 陽二
1
この章のポイント




オブジェクトとは何か
クラスとは何か
オブジェクトとクラスの違い
基本的なオブジェクト指向概念
2
最近のソフトウェア開発


現在も非オブジェクト指向で開発された
多くのレガシーシステムが動作している
新規開発では、オブジェクト指向技術を
採用→オブジェクト指向型開発の増加
Web
3
手続き型プログラミングと
オブジェクト指向プログラミング(1)

オブジェクト指向の主な特徴


コードの再利用性(第8章で詳説)
オブジェクトとは何か

データと動作の両方を含む実態
4
手続き型プログラミングと
オブジェクト指向プログラミング(2)

手続き型プログラミングの問題


データが手続きから分離され、グローバル
(広域)になる
データにアクセスするコードを制限できない
関数1
関数2
グローバル
データ
関数3
関数4
5
手続き型プログラミングと
オブジェクト指向プログラミング(3)

オブジェクト指向プログラミング

データと動作を結合して一つのエンティティ
(entity:実体)にする→カプセル化



例
データ型とそれらを操作するメソッドを保持
オブジェクトのメンバへのアクセスを制限
myInt1, myInt2
setmyInt()
getmyInt()
Math
sum()
6
手続き型プログラミングと
オブジェクト指向プログラミング(4)
myObject
データ
メソッド
メソッド
メソッド
メッセージ
メソッド
メソッド
メソッド
データ
Math
オブジェクト間の対話
7
オブジェクト指向プログラミングと
手続き型プログラミングの相異点
手続き型
プログラミング
データとデータ操作が
分離されている
データ(パケット)
クライアント
サーバ
vs.
オブジェクト指向
プログラミング
データとデータ操作が
一緒にオブジェクトに
含まれている
オブジェクト
クライアント
サーバ
例:ネットワーク経由で送信されるデータ/オブジェクト
8
オブジェクトとは何か?(1)

オブジェクト



オブジェクト指向プログラムの構成単位
データと振る舞いで構成
例

会社の従業員を表すオブジェクトを含む
企業システム
9
オブジェクトとは何か?(2)

オブジェクトのデータ


属性(attribute)
オブジェクトの状態(state:ステート)を表す
例

従業員(Employee)は社会保障番号、生年月日、
性別などの属性を持っている
社会保障番号(socialSecurityNumber)
性別(gender)
Employee
生年月日(dateOfBirth)
10
オブジェクトとは何か?(3)

オブジェクトの振る舞い



メソッド
手続き型言語の関数に相当
メソッドを呼び出すには、メッセージ
(message)を送信する
単にメソッドのインターフェイスだけを示してお
り、メソッドの実装は示していない
11
オブジェクトとは何か?(4)

オブジェクトの振る舞い

例
getSocialSecurityNumber()
getGender()
Employee
getDateOfBirth()
メッセージ:
getSocialSecurityNumber()
calculatePay()
Payroll
12
オブジェクトとは何か?(4)

オブジェクトの振る舞い

例
getSocialSecurityNumber()
getGender()
Employee
getDateOfBirth()
要求された情報:
SocialSecurityNumber
calculatePay()
Payroll
13
オブジェクトとは何か?(5)

クラス図
Employee
-socialSecurityNumber:String
-gender:boolean
-dateOfBirth:Date
Payroll
+calculatePay:double
-pay:double
+getSocialSecurityNumber:String
+getGender:boolean
+getDateOfBirth:Date
+getSocialSecurityNumber:void
+getGender:void
+getDateOfBirth:void
14
オブジェクトとは何か?(6)

オブジェクトのインスタンス化


クラス(テンプレート)からオブジェクトを生成
例
参照:John
参照:Mary
プログラム空間
プログラム空間
//データ―属性
-socialSecurityNumber;
-gender;
-dateOfBirth;
//データ―属性
-socialSecurityNumber;
-gender;
-dateOfBirth;
//動作―メソッド
+getSocialSecurityNumber(){}
+getGender(){}
+getDateOfBirth(){}
+getSocialSecurityNumber(){}
+getGender(){}
+getDateOfBirth(){}
//動作―メソッド
+getSocialSecurityNumber(){}
+getGender(){}
+getDateOfBirth(){}
+getSocialSecurityNumber(){}
+getGender(){}
+getDateOfBirth(){}
15
クラスとは何か?(1)


クラスはオブジェクトのテンプレートである
概念

クッキーの抜き型
クラステンプレート:
クッキーの抜き型
クッキーの生地
オブジェクト:
クッキー
16
クラスとは何か?(2)

クラスは高水準のデータ型

定義済みのクラスを使用して、オブジェクトを生成
Int x;
Float y;
MyClass myObject;

クラスの定義



属性
メソッド
メッセージ
17
クラスとは何か?(3)

クラスの定義



属性
メソッド
メッセージ
Public class Person{
Public class Payroll{
private String name, address;
String name;
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
Person person = new Person();
public String getAddress(){
return address;
}
public void setAddress(String adr){
address = adr;
}
String = person.setName(“Joe”);
…
String = person.getName();
}
}
18
UMLによるクラスのモデル化
Person
-name:String
-address:String
属性
+getName:String
+setName:void
+getAddress:String
+setAddress:void
メソッド
Personのクラス図
19
カプセル化(1)

カプセル化


インターフェイスだけを公開
詳細な実装は隠蔽
20
カプセル化(2)

実世界のインターフェイス/実装パラダイム

例:発電所
パソコン
インターフェイス
発電所
21
カプセル化(3)

Javaのインターフェイス

例:整数の2乗を計算するクラス
Square
public class Square{
//プライベート属性
private int squareValue;
-squareValue:int
//パブリックインターフェイス
public int getSquare(int value){
+getSquare:int
-calculateSquare:int
squareValue = calculateSquare(value);
return squareValue;
}
//プライベート実装
private int calculateSquare(int value){
return value*value;
}
}
22
継承(1)

継承(inheritance)




クラスの共通点を抽出して再利用
スーパークラスとサブクラス
抽象化
is-a関係
23
継承(2)

例
Mammal
-eyeColor:int
スーパークラス(親クラス)
+getEyeColor:int
抽象化
Dog
スーパークラス(親クラス)
サブクラス(子クラス)
Cat
-barkFrequency:int
-meowFrequency:int
+bark:void
+meow:void
サブクラス(子クラス)
抽象化
GermanShepherd
Poodle
サブクラス(子クラス)
サブクラス(子クラス)
+isGerman:void
+isFrench:void
24
継承(3)

is-a関係
Shape
draw()
draw()
draw()
Circle
Star
Square
25
ポリモーフィズム(1)

ポリモーフィズム



類似したオブジェクトが同じメッセージに対して
異なる方法で応答
継承と密接に関連
オーバーライド

親のメソッドの実装を子のメソッド実装で置き換え
る
26
ポリモーフィズム(2)

例
public class Circle extends Shape{
double radius;
public abstract class Shape{
public Circle(double r){
private double area;
radius = r;
public abstract double getArea();
}
}
public double getArea(){
area = 3.14*(radius*radius);
return(area);
}
};
27
ポリモーフィズム(3)

例
public class Rectangle extends Shape{
double length;
double width;
Shape
#area:double
public Rectangle(double l,double w){
length = l;
width = w;
+getArea:double
Circle
Radius:double
+Circle:
+getArea:double
}
Rectangle
public double getArea(){
length:double
Width:double
+Rectangle:
+getArea:double
}
};
area = length*width;
return(area);
28
コンポジション

コンポジション



オブジェクトがほかのオブジェクトを含む
has-a関係
例
テレビ
チューナー
ブラウン管
29
まとめ




カプセル化
継承
ポリモーフィズム
コンポジション
30