プログラミング初級 (Java) 第 12 回メッセージのやりとり 白銀純子 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 1
第 12 回の内容 メッセージのやりとり Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 2
メソッドの作り方 使い方 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 35
メソッド プログラム中で行われる処理の手順をまとめたもの 複数の処理をまとめて 1つの名前を付けたもの オブジェクトがプログラム内で担当する処理をまとめたもの メソッド名 引数 戻り値 ( 返り値 ) という構成 メソッド名 : メソッドの名前 引数 : メソッドに渡す情報 ( 計算等の処理の材料にするデータ ) 処理の材料にするデータのみ 引数として定義 戻り値 ( 返り値 ): メソッドの内容を実行したときの処理結果 多くの場合 戻り値を変数に代入して利用する 変数名 = メソッド で 変数に戻り値が代入される Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 36
メソッドのイメージ 引数 引数 メソッドに対して与えるデータ 引数 メソッド ごにょごにょ... メソッドの処理結果 戻り値 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 37
メソッド ( 例 )(1) Integer.parseInt(str) メソッド名 : Integer.parseInt 引数 : str(string 型 ) 戻り値 : str をint 型に変換したデータ 戻り値をint 型の変数に代入して利用する num = Integer.parseInt(str) で 変数 num に 文字列をint 型のデータに変換したものが代入される String 型のデータ Integer.parseInt ごにょごにょ... 与えられた引数を int 型に変換した結果 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 38
メソッド ( 例 )(2) str.substring(m, n) メソッド名 : substring 引数 : m(int 型 ) と n(int 型 ) 戻り値 : str のm 番目からn 番目までの文字で作った部分文字列 戻り値をString 型の変数に代入して利用する substr = str.substring(m, n) で 変数 substr に strの部分文字列が代入される 部分文字列のインデックス (from) 部分文字列のインデックス (to) substring ごにょごにょ... from と to のインデックスから作られた部分文字列 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 39
メソッドを作る ( メソッドの定義 )(1) 今回定義するのは ごにょごにょ... の部分 メソッドを作るときのお約束 static キーワードは メソッドの目的によってつけない場合とつける場合あり public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 40
アクセス修飾子 Java は 様々なクラスを連携させて動作するもの アクセス修飾子 : クラス同士を連携させたときに 他のクラスから利用できるか否かを示すもの public: 他のクラスから利用可能 今回は 他のクラスから利用するので とりあえず public で OK protected: 限られた範囲で 他のクラスから利用可能 private: 他のクラスからは利用不可 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 41
static のあるなし (1) static がついているメソッド ( クラスメソッド ) クラス名. メソッド の形式で呼び出し可能 ( オブジェクト名. メソッド の形式でも可能 ) static つきのメソッド内部で 同じクラスで定義されているメソッドを呼び出すときは そのメソッドにも static が必要 main メソッドから呼び出すときは static がついている必要 メソッドを定義しているクラスのインスタンス変数を利用することは不可能 ( クラス変数は利用可能 ) オブジェクトによって処理結果の変わらないメソッドは static をつけて良い ( つけないメソッドにしても良い ) Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 42
static のあるなし (2) static がついていないメソッド ( インスタンスメソッド ) 必ず オブジェクト名. メソッド の形式で呼び出し ( クラス名. メソッド の形式では呼び出し不可能 ) static なしのメソッド内部で 同じクラスで定義されているメソッドを呼び出すときは そのメソッドは static はついていても ついていなくても良い static なしのメソッド内部で 同じクラスで定義されているフィールドは インスタンス変数 クラス変数とも利用可能 オブジェクトによって処理結果の変わるメソッド ( 同じクラスで定義されている static なしのフィールドを処理に使うなど ) は 必ず static なし Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 43
メソッドの定義 クラスに関連づけるメソッドとオブジェクトに関連づけるメソッドの 2 種類 クラスに関連づけるメソッドの定義のテンプレート public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; オブジェクトに関連づけるメソッドの定義のテンプレート public 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; 違い : static キーワードがついているかいないか Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 44
メソッドを作る ( メソッドの定義 )(2) 今回定義するのは ごにょごにょ... の部分 戻り値は 1 つだけ public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 45
メソッドを作る ( メソッドの定義 )(3) メソッドの名前 ( 名前の付け方は クラス名や変数名と同じ ) public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; Java の命名規則としては... 先頭の単語は動詞にする 複数の単語を連結するときは 先頭の単語はすべて小文字 2 つ目以降の単語は先頭の文字のみ大文字 あとは小文字 変数と同じ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 46
メソッドを作る ( メソッドの定義 )(4) 引数のデータ型引数の変数名 と書く 引数はいくつあっても良い (, で区切る) データ型はそれぞれ異なってもかまわない public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 47
引数の定義の注意 引数の定義は 一見変数宣言のよう 実際 メソッド内で使う変数の宣言とも言える but 通常の変数宣言とは違う! 必ず データ型変数名 のセットで書かなければならない public int sum(int num1, int num2, int num3) { int result; result = num1 + num2 + num3; return result; public int sum(int num1, num2, num3) { int result; result = num1 + num2 + num3; return result; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 48
メソッドを作る ( メソッドの定義 )(5) 処理内容は何を書いても良い (if, for, while,...) public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; 処理内容 の部分では 引数 で定義した変数を変数として利用できる public int sum(int num1, int num2) { int result; result = num1 + num2; return result; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 49
メソッドを作る ( メソッドの定義 )(6) 処理結果 を出すという意味 ( 変数名 = メソッド名 ( 引数 ) と書くと 変数名 の中に処理結果が代入される ) この文でメソッドの内容が終わる ( この後には文を書かないこと ) 処理結果のデータ型と戻り値のデータ型は同じもの public static 戻り値のデータ型メソッド名 ( 引数 ) { メソッドでの処理内容 return 処理結果 ; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 50
return 文 戻り値のデータ型と return 文で返すデータ型は同じでなくてはならない public int sum(int num1, int num2) { int result; result = num1 + num2; return result; データ型が同じ public String sum(int num1, int num2) { int result; result = num1 + num2; return result; 違うデータ型 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 51
メソッドの作成例 処理結果を double 型で出す 引数の定義 引数に与えられた3つの数の平均を求めるメソッド public double average( int num1, int num2, int num3 ) { double result; result = (double) (num1 + num2 + num3) / 3; return result; 処理内容 return で 結果を出す という意味 ( return の後に書く処理結果のデータ型は 戻り値のデータ型と同じにすること ) Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 52
メソッドを作る場所 フィールドの変数宣言の下に作る 上に作っても良い import java.io.*; import java.lang.*; public class Student { String address, name, tel; int studentnumber, english, math, language; メソッドの定義を書く場所 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 53
メソッドの作成例 public class Sample { String name, address; int english, math, language; public double average(int num1, int num2, int num3) { double result; result = (double) (num1 + num2 + num3) / 3; return result; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 54
メッセージのやり取り Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 55
メッセージ メッセージ = あるクラスで定義されたメソッドを呼び出すこと オブジェクト名. メソッド ( または クラス名. メソッド ) の形式で呼び出し ただし メソッドを定義している同じクラス内で呼び出すときは オブジェクト名やクラス名は省略 Ex1. str.substring(m, n) String クラスに定義されている substring というメソッドを呼び出し (str は String クラスのオブジェクト = String 型の変数 ) Ex2. Integer.parseInt(str) Integer クラスに定義されている parseint というメソッドを呼び出し (str は String クラスのオブジェクト = String 型の変数 ) Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 56
メッセージのやり取りをするには 1. 各クラスでメソッドを定義する 2. オブジェクト同士でメソッドを呼び出しあう Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 57
オブジェクト同士でのメソッドの呼び出し あるクラス ( 名前 : ClassA) で定義されているメソッドを... 別のクラスから呼び出す場合 メソッドがインスタンスメソッドの場合 : ClassA のオブジェクト名. メソッド メソッドがクラスメソッドの場合 : ClassA. メソッド 同じクラス (ClassA) から呼び出す場合 : オブジェクト名. や クラス名. は不要 メソッド名 + 引数のみで OK Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 58
メソッドの定義とメッセージでの処理の流れ ( 例 )(1) ProductManages.java // 割引率と税率を設定して 商品の金額計算 public class ProductManage { public static void main(string[] args) { int amount; Product pro = new Product(); // 割引率 : 0.2 (2 割引 ) amount = pro.calcamount(0.2, 0.08); Product.java // 商品の値段管理 public class Product { int price; メソッドの定義 // 商品の金額計算 (discount: 割引率, tax: 税率 ) public int calcamount(double discount, double tax) { double doubleamount; int intamount; doubleamount = (double) price * (1 - discount) * (1 + tax); intamount = (int) doubleamount; return intamount; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 59
メソッドの定義とメッセージでの処理の流れ ( 例 )(2) ProductManages.java // 割引率と税率を設定して 商品の金額計算 public class ProductManage { public static void main(string[] args) { int amount; Product pro = new Product(); // 割引率 : 0.2 (2 割引 ) amount = pro.calcamount(0.2, 0.08); Product.java // 商品の値段管理 public class Product { int price; calcamountというメソッドを呼び出す 引数には具体的な値または変数を書く ( 引数の順番は メソッドを作ったときの順番と同じに ) // 商品の金額計算 (discount: 割引率, tax: 税率 ) public int calcamount(double discount, double tax) { double doubleamount; int intamount; doubleamount = (double) price * (1 - discount) * (1 + tax); intamount = (int) doubleamount; return intamount; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 60
メソッドの定義とメッセージでの処理の流れ ( 例 )(3) ProductManages.java // 割引率と税率を設定して 商品の金額計算 public class ProductManage { public static void main(string[] args) { int amount; Product pro = new Product(); // 割引率 : 0.2 (2 割引 ) amount = pro.calcamount(0.2, 0.08); Product.java // 商品の値段管理 public class Product { int price; // 商品の金額計算 (discount: 割引率, tax: 税率 ) public int calcamount(double discount, double tax) { double doubleamount; int intamount; doubleamount = (double) price * (1 - discount) * (1 + tax); intamount = (int) doubleamount; return intamount; 処理の流れ 1. mainメソッドで calcamountメソッドの引数に0.2と0.08を指定する 2. 0.2と0.08というデータがcalcAmountメソッドの引数の変数 discount と tax にそれぞれ代入される 3. calcamountメソッド内で引数の値を使って計算され 変数 intamountに結果が代入される 4. calcamountメソッドの変数 intamountの値がmainメソッドの変数 amountに代入される Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 61
メソッドの呼び出し ( 例 )(1) public class Student { String address, name, tel; int studentnumber, english, math, language; static String schoolname = " 早稲田高校 "; public class StudentManage { public static void main(string[] args) { Student[] info = new Student[50]; String scname; public void setenglish(int score) { english = score; public static String getschoolname() { return schoolname;... 略... info[0] = new Student(); info[0].setenglish(80); scname = Student.getSchoolName();... 略... クラス変数は 宣言と同時に値を代入して OK Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 62
メソッドの呼び出し ( 例 )(2) インスタンスメソッドの定義 public class Student { String address, name, tel; int studentnumber, english, math, language; static String schoolname = " 早稲田高校 "; public class StudentManage { public static void main(string[] args) { Student[] info = new Student[50]; String scname; public void setenglish(int score) { english = score; public static String getschoolname() { return schoolname;... 略... info[0] = new Student(); info[0].setenglish(80); scname = Student.getSchoolName();... 略... インスタンスメソッドの呼び出し Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 63
メソッドの呼び出し ( 例 )(3) クラスメソッドの定義 public class Student { String address, name, tel; int studentnumber, english, math, language; static String schoolname = " 早稲田高校 "; public class StudentManage { public static void main(string[] args) { Student[] info = new Student[50]; String scname; public void setenglish(int score) { english = score; public static String getschoolname() { return schoolname;... 略... info[0] = new Student(); info[0].setenglish(80); scname = Student.getSchoolName();... 略... クラスメソッドの呼び出し Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 64
クラスの役割分担 (1) データ定義のクラスは ある 1 人の人またはある 1 つのものが どういうデータを持ち プログラム内でどのような役割を担当するか を表すもの どのクラスにどういうメソッドを定義するか? は クラスの役割を考える必要 Ex. 学内英語力コンテストに A 組代表として参加する人を選ぶため 英語の得点 85 点以上の生徒を出力したい public class StudentManage { public static void main(string[] args) { Student st = new Student(); st.searchover85(); 1 人の生徒 ( 例えば早稲田太郎さん ) が A 組の人全員の英語の得点を調べる処理 早稲田太郎さんは A 組の人全員の得点を知っている 普通はありえない! public class Student { String name; int english[]; public void searchover85() { int i; for(i = 0; i < 30; i = i + 1) { if (english[i] >= 85) { System.out.println(name + " さん : " + english[i] + " 点 "); Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 65
クラスの役割分担 処理のクラスは データ定義のクラスのあらゆるオブジェクトに対する様々な処理をするクラス Ex. 学内英語力コンテストに A 組代表として参加する人を選ぶため 英語の得点 85 点以上の生徒を出力したい public class StudentManage { public static void main(string[] args) { Student st[] = new Student[30];... 略... int i; for(i = 0; i < 30; i = i + 1) { if (sti[i].english >= 85) { System.out.println(st[i].name + " さん : " + st[i].english + " 点 "); public class Student { String name; int english; データ定義のクラス 処理クラスが どの処理を担当するのが自然か? を考えよう! 処理クラスは 先生や成績管理システムのイメージ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 66
メソッド ~ 引数の扱い ~ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 67
引数が配列の場合 ( メソッドの定義 ) 引数の定義の部分を 引数のデータ型 [] 引数の変数名 または 引数のデータ型引数の変数名 [] のように書く public int add(int[] num) {... return result; または public int add(int num[]) {... return result; Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 68
引数が配列の場合 ( メソッドの使用 ) 引数の定義の部分に配列変数をそのまま入れる public class Calculate { public int add(int[] num) {... return result; public void main(string[] args) { int[] number = new int[100]; int sum; sum = add(number); 添え字なども必要なく 配列変数の名前のみ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 69
引数がない場合 引数の定義の部分に何も書かず メソッドの利用時の引数も何も書かない public class Calculate { public int add() {... return result; public void main(string[] args) { int sum; sum = add(); Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 70
戻り値が配列の場合 戻り値の定義の部分を 戻り値のデータ型 [] のように書く public class Calculate { public int[] add(int n) { int[] result = new int[100];... return result; public void main(string[] args) { int[] sum; int num; sum = add(num); Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 71
戻り値がない場合 戻り値の定義の部分を void と書く メソッドの最後の return 文も不要 public class Calculate { public void add(int n) {... public void main(string[] args) { int num; add(num); Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 72
メソッド ~ 変数の有効領域 ~ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 73
変数の扱い (1) 変数は どこで宣言したかによって使える場所が違う 宣言したブロック内でしか使えない public class Sample { { に対応する までの領域 ( メソッドに限らず if 文や for 文の { でも同じ ) public int calculate(int num) { public String getname() { ブロック Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 74
変数の扱い (2) public class Sample { public static void main(string[] args) { int result; (1) String str; int num; if (num > 0) { int result; String str; (2) ブロック A ブロック B 広いブロックの変数は そのブロックに含まれる狭いブロックでも使える (1) の変数 ( ブロックAの変数 ) はブロックBでも使えるので (2) の変数宣言はコンパイルエラー Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 75
変数の扱い (3) public class Sample { public int calculate(int num) { int result; String str; public String getname() { 変数は 宣言したブロック内でしか使えない result, str は public String getname() { の中では使えない Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 76
変数の扱い (4) public class Sample { public int calculate(int num) { int result; String str; public String getname() { int result; String str; (1) (2) 変数は 宣言したブロック内でしか使えない (1) の変数と (2) の変数は違う変数として扱われる Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 77
コンストラクタ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 78
特殊なメソッド ~ コンストラクタ ~(1) コンストラクタ : オブジェクトを作成すると同時に実行される特殊なメソッド 通常のメソッドとの違い 名前が必ずクラス名と同じ 戻り値のデータ型の定義なし 戻り値を返すためのreturn 文はなし static キーワードをつけることは不可 通常のメソッドと同じもの 引数を定義 ( なくても良い ) 処理内容の記述方法は同じ Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 79
特殊なメソッド ~ コンストラクタ ~(2) 定義方法 : public クラス名 ( 引数のリスト ) {... 引数のリストはなくてもよい { から の間に オブジェクトを作成すると同時に実行される処理内容を記述する オブジェクトを作成するとき new クラス名 () ; とするのは コンストラクタを呼び出している ということ コンストラクタでよく処理するもの フィールドの値の設定 GUI を扱うクラスの場合 GUI のウィンドウの作成処理 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 80
コンストラクタの例 クラスの定義 public class Student { String number, circle; int score; public Student(String n, int s, String c) { number = n; score = s; circle = c; オブジェクト作成例 Student member; member = new Student("1X17Y1001", 80, " オーケストラ "); Student member; member = new Student(); member.number = "1X17Y1001"; member.score = 80; member.circle = " オーケストラ " コンストラクタ 同じ意味 Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 81
第 3 回課題 Course N@vi でアクセス可能 授業終了が近いので早めに... Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 84
次回 3 限 : 通常授業 出席課題は 第 3 回課題の作成 4 限 : 第 3 回課題の質問受け付け 出席課題なし Copyright (C) Junko Shirogane, Waseda University 2018, All rights reserved. 85