計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8) 返り値のあるメソッドとフィールド (2.7) クラス変数・クラスメソッド (3.3-4) 式と文 (3.1-2,7-8) プリミティブ値とオブジェクト値 (3.1-2) 演算子 (3.8) 練習問題
履習登録について (実例参照)
概念の整理 クラス: オブジェクトの性質を定義 (性質: 状態・振舞) オブジェクト: 「もの」を表わす値 (クラスに所属) クラス: オブジェクトの性質を定義 (性質: 状態・振舞) オブジェクト: 「もの」を表わす値 (クラスに所属) 変数: 値の入れ物 (型がある) 型: 値の集合 (クラスも型) /** 最初のプログラムの例 */ public class T21 { public static void main(String[] args){ TurtleFrame f; //変数 f の型宣言 f = new TurtleFrame(); //TurtleFrameを作成しfに代入 Turtle m = new Turtle(); //Turtle を作成し,m の初期値として代入 Turtle m1 = new Turtle(); //もう1つ作成し,m1 の初期値として代入 f.add(m); //f に m を追加 f.add(m1); //f に m1 を追加 m.fd(100); //m よ前に 100 進め m.rt(90); //m よ右に 90 度回れ m.fd(150); //m よ前に 150 進め m1.rt(90); //m1 よ右に 90 度回れ m1.fd(100); //m1 よ前に 150 進め }
文法の整理 型宣言 コンストラクタ呼出し オブジェクトを作る 代入 変数に値を「しまう」 メソッド呼出し オブジェクトに 指示を出す コンストラクタ呼出し オブジェクトを作る 代入 変数に値を「しまう」 メソッド呼出し オブジェクトに 指示を出す /** 最初のプログラムの例 */ public class T21 { public static void main(String[] args){ TurtleFrame f; //変数 f の型宣言 f = new TurtleFrame(); //TurtleFrameを作成しfに代入 Turtle m = new Turtle(); //Turtle を作成し,m の初期値として代入 Turtle m1 = new Turtle(); //もう1つ作成し,m1 の初期値として代入 f.add(m); //f に m を追加 f.add(m1); //f に m1 を追加 m.fd(100); //m よ前に 100 進め m.rt(90); //m よ右に 90 度回れ m.fd(150); //m よ前に 150 進め m1.rt(90); //m1 よ右に 90 度回れ m1.fd(100); //m1 よ前に 150 進め }
プログラム T22 (2.6) public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 }
整数型の変数の宣言 int x = 200; int y = 200; int d = 100; と同じ public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } int x = 200; int y = 200; int d = 100; と同じ int x; //整数をしまう変数xを宣言 x = 200; //xに200をしまう と同じ
引数つきのコンストラクタ 意味: Turtleオブジェクトを作る (コンストラクタ呼出し) public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } 意味: Turtleオブジェクトを作る (コンストラクタ呼出し) “x,y,180” ~ 引数: (この場合) 座標と向き コンストラクタ・メソッドに どんなものがあるか? どんな意味か? ― API new Turtle() と違う? ― オーバーロード
API (Application Programming Interface) ライブラリの使い方の情報 クラスの名前・定義されているコンストラクタ・メソッド・フィールド・・・ Turtle ― 名前 () ― 引数なし → new Turtle() 引数が3つ全てint(整数)だった場合 メソッドの名前・型・働き
オーバーロード (多重定義) 複数のコンストラクタが 同じ名前で定義できる “new Turtle()”→引数0個 引数の個数と型で どれかが決まる メソッドも同様 “new Turtle()”→引数0個 “new Turtle(100,50,30)” → 3個のint(整数)型
パッケージ “java.awtパッケージの中にある Colorクラス” パッケージ: いくつかのクラスをまとめたもの public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } パッケージ: いくつかのクラスをまとめたもの java.awt: Java言語標準ライブラリの abstract window toolkitパッケージ 名前が重ならない工夫 “java.awtパッケージの中にある Colorクラス”
式 数式だけが式ではない 演算子: +, -, *, /, %, &, |, ... 式: 値を表わす単位 数値は式 変数は式 public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x, y, 180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+d, y+d, 0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } 演算子: +, -, *, /, %, &, |, ... 式: 値を表わす単位 数値は式 変数は式 “new クラス名(式, 式, ...)” は式 “式 + 式” は式 etc.
式の値 数値→ その値 変数→ そのときに入っている値 “new クラス名(式, 式, ...)” → 作られたオブジェクト public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x, y, 180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+d, y+d, 0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } 数値→ その値 変数→ そのときに入っている値 “new クラス名(式, 式, ...)” → 作られたオブジェクト “式 + 式”→ 1. 各式の値を求める 2. 値の和
代入と変数の値 変数式: その時点で 変数に入っている値 代入: 1. 右辺の値を求め 2. 変数に値を入れ直す dは100 dは50 public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } 変数式: その時点で 変数に入っている値 dは100 代入: 1. 右辺の値を求め 2. 変数に値を入れ直す dは50
変数と値の抽象化 何故変数を 使うのか? 変数: 同じ意図を持った値を 明示できる 値に名前を付ける これも 同じように 動く public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int x = 200, y = 200, d = 100; Turtle m = new Turtle(x,y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(x+ d,y+ d,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(d); m1.fd(d); m.lt(90); m1.lt(90); d = d / 2; //d の値を d/2 に変更 } public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(200,200,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(300,300,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(100); m1.fd(100); m.lt(90); m1.lt(90); m.fd(50); m1.fd(50); } これも 同じように 動く 変数: 同じ意図を持った値を 明示できる 値に名前を付ける 全体を1.5倍の 大きさにするには? 左上を(50,50)に 変更するには?
変数と値の抽象化 より良い プログラム(?) 全体を1.5倍の 大きさにするには? 左上を(50,50)に 変更するには? public class T22 { public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); int 左上隅x = 200, 左上隅y = 200, 辺長 = 100; Turtle m = new Turtle(左上隅x,左上隅y,180); //引数のあるコンストラクタ呼び出し Turtle m1 = new Turtle(左上隅x+辺長,左上隅y+辺長,0); java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成 m1.setColor(c); //m1 の色を赤色に指定 f.add(m); f.add(m1); m.fd(辺長); m1.fd(辺長); m.lt(90); m1.lt(90); 辺長 = 辺長 / 2; //d の値を d/2 に変更 } より良い プログラム(?) 全体を1.5倍の 大きさにするには? 左上を(50,50)に 変更するには?
プログラム T23 (2.7) import java.awt.Color; public class T23 { public static void main(String[] args){ int d = 100, x, y, a; TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(200,300,0); f.add(m); m.fd(d); x = m.getX() // m のX 座標とり出し y = m.getY(); // m のY 座標とり出し a = m.getAngle() - 45; // m の角度とり出し Turtle m1 = new Turtle(x, y, a); //m1 の作成 f.add(m1); m.kameColor = new Color(0,255,255); // m の亀の色を水色変える m.kameScale = m.kameScale * 2; // m の亀を現在の 2 倍の大きさにする m.rt(45); d = d / 2; m1.fd(d); }
パッケージ名の略記 import java.awt.Color; “ファイル中で java.awt.Color クラスを略記” 同じ public class T23 { public static void main(String[] args){ int d = 100, x, y, a; TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(200,300,0); f.add(m); m.fd(d); x = m.getX() // m のX 座標とり出し y = m.getY(); // m のY 座標とり出し a = m.getAngle() - 45; // m の角度とり出し Turtle m1 = new Turtle(x, y, a); //m1 の作成 f.add(m1); m.kameColor = new Color(0,255,255); // m の亀の色を水色変える m.kameScale = m.kameScale * 2; // m の亀を現在の 2 倍の大きさにする m.rt(45); d = d / 2; m1.fd(d); } public class T23 { public static void main(String[] args){ .... f.add(m1); m.kameColor = new java.awt.Color(0,255,255); // m の亀の色を水色変える m.kameScale = m.kameScale * 2; // m の亀を現在の 2 倍の大きさにする ... } 同じ import java.awt.*; →java.awtパッケージ内の全てのクラスを略記
メソッドの返り値 メソッド 返り値の型 返り値は オブジェクトの動作 計算…値を返す ことができる (cf. 計算式) 「返り値」という void: 値を返さない 返り値は 他の式と組み合せられる 無視してもよい
メソッドの返り値 メソッドの返り値を使っている 計算式の中で 使ってもよい import java.awt.Color; public class T23 { public static void main(String[] args){ int d = 100, x, y, a; TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(200,300,0); f.add(m); m.fd(d); x = m.getX(); // m のX 座標とり出し y = m.getY(); // m のY 座標とり出し a = m.getAngle() - 45; // m の角度とり出し Turtle m1 = new Turtle(x, y, a); //m1 の作成 f.add(m1); m.kameColor = new Color(0,255,255); // m の亀の色を水色変える m.kameScale = m.kameScale * 2; // m の亀を現在の 2 倍の大きさにする m.rt(45); d = d / 2; m1.fd(d); } メソッドの返り値を使っている 計算式の中で 使ってもよい Turtle m1 = new Turtle(m.getX(), m.getY(), m.getAngle() - 45); と書いても同じ
フィールド (インスタンス変数) 個々のオブジェクトの 中にある変数 オブジェクトの状態 (の一部) 変数と同様に 型がある 代入できる 個々のオブジェクトの 中にある変数 オブジェクトの状態 (の一部) 変数と同様に 型がある 代入できる 式として書ける
フィールド (インスタンス変数) 代入して値を 変更できる 計算式の中で 使ってもよい import java.awt.Color; public class T23 { public static void main(String[] args){ int d = 100, x, y, a; TurtleFrame f = new TurtleFrame(); Turtle m = new Turtle(200,300,0); f.add(m); m.fd(d); x = m.getX(); // m のX 座標とり出し y = m.getY(); // m のY 座標とり出し a = m.getAngle() - 45; // m の角度とり出し Turtle m1 = new Turtle(x, y, a); //m1 の作成 f.add(m1); m.kameColor = new Color(0,255,255); // m の亀の色を水色変える m.kameScale = m.kameScale * 2; // m の亀を現在の 2 倍の大きさにする m.rt(45); d = d / 2; m1.fd(d); } 代入して値を 変更できる 計算式の中で 使ってもよい
オブジェクトとは? (2.8) オブジェクト: 「もの」を表わす値 (クラスに所属) クラス 内部に状態を持つ (インスタンス変数) オブジェクト: 「もの」を表わす値 (クラスに所属) 内部に状態を持つ (インスタンス変数) メソッドが呼出されると 状態を変化させる 他のオブジェクトのメソッドを呼出す 値を返す クラス どんなインスタンス変数を持つか? どんなメソッドを持つか? x座標=230 y座標=170 色=水色オブジェクト
練習問題 (教科書または講義webページ参照)