広告
  サイト内検索:
<Let's create a game!> Introduction of programming for absolute beginners English

関数(メソッド)
関数(メソッド)
  関数(メソッド)の概要

関数(メソッド)

処理をまとめる機能。

重複する処理や特定の処理を分離して、関数として1つにまとめることができる。

作った関数は呼び出して使える。何回でも呼び出せる。

(下記の図では「コード」の部分はメイン関数と思って見て下さい。)

関数(メソッド)の特徴:整理:処理を機能別にできる
関数(メソッド)の特徴:整理:処理を分離できる
関数(メソッド)の特徴:整理:処理を統合できる
関数(メソッド)の特徴:再利用:何回でも利用できる
関数には他にも様々な利点がある。

 ・コードがすっきりして読みやすくなる。
 ・一箇所の修正で直せるようになる。

よく使う処理や機能別に処理を関数にしておけばすぐに使えて便利。


関数とメソッドの違い

同じもの。視点が違うだけ。


「処理」の視点で見ると関数。
「関数」と言えば、どの開発言語でも、
大体同じような役割のものになる。

「クラス」の視点で見るとメソッドって言い方になる。
メンバ関数
とも言う。

(今回のセッションでは「関数」と言います。
詳しくはクラス勉強する時に説明します。)

  関数(メソッド)の構成(概要)

関数の大まかな構成

1、関数本体を作る。
  (関数の定義)

2、メイン関数などのコードから
  関数を呼び出す形で使う。
 (関数の呼出)

つまり、関数本体呼出命令の構成になる。

関数の定義のブロック内に、
実行したいコードを今までと同じように書く。
 
 
関数(メソッド)の構成:値渡しの場合

  関数(メソッド)の実行の流れ

関数の実行の流れは4つのパターンがある。

まず最初に
1、作った関数を呼び出すだけ
のパターン。

これは呼び出し元のコードから
関数を呼び出して実行するだけ。


(図中の呼出元はメイン関数の中だと思って下さい。)
 
関数(メソッド)の処理の流れ(関数の定義と呼び出し)


次に
2、作った関数に 値を渡して呼び出す
パターン。

呼び出し元のコードから、関数に値を渡すこともできる
この場合、引数(ひきすう)と言う特別な変数に値を渡す。
 
関数(メソッド)の処理の流れ(引数の値渡し)


次に
3、作った関数を呼び出して 実行した後に関数から結果の値をもらう
パターン。

呼び出し元が関数から結果の値をもらうこともできる。
この場合、戻り値(もどりち)を使って値を戻す。
 
関数(メソッド)の処理の流れ(戻り値)


最後は
4、値を渡して、結果を貰う
パターン。

これは、引数と戻り値、両方使った場合。
 
関数(メソッド)の処理の流れ(引数(値渡し)と戻り値)

 

実行の流れの注意点

呼び出した時点で、処理が関数側に移るという点。

呼び出し側はそこで待機して、関数の処理が終わるのを待つ
これを同期処理って言う。関数は通常はこの動作。
 
 

関数の処理の同期


同期処理 呼び出し元は、関数の処理が終わるまで待つ。
非同期処理 呼び出し元は、
関数の終了を待たずに次の処理を実行する。


  引数と戻り値


引数と戻り値

引数(ひきすう) 呼び出し時に関数に値を渡すことができる。
戻り値(もどりち) 関数から呼び出し元に値を返す事ができる。


  引数(ひきすう)

引数(ひきすう)は、
呼び出し元から関数へ値を渡すための変数

呼び出しの時に変数や値を書いてやると、
値がコピーされて関数側の引数に入る。

これを「値渡し」(あたいわたし)という。

 
関数(メソッド)の処理の流れ(引数(値渡し))


引数は、関数が始まると、値を受け取った状態になっている。

あとは関数の中で普通の変数と同じように使える。

例えば、計算関数を作って、
引数を使って関数に値を渡し、その値に加算させたりできる。
 


引数への渡し方は2種類ある。

・基本型の引数で使う「値渡し」
・クラスなどの参照型の引数で使う「参照渡し」

「参照渡し」についてはクラスの学習時に見ていきます。
 
 

引数の渡し方

値渡し
(あたいわたし)
引数が基本型変数の場合の渡し方。

関数の引数に、
変数の「値」をコピーして渡す。
参照渡し
(さんしょうわたし)
引数が参照型変数の場合の渡し方。

関数の引数に、
変数の「アドレス(参照)」をコピーして渡す。


渡し方は、引数の型によって自動的に変わるので意識する必要は無い


参考:基本型と参照型

変数のデータの型(SESSION 7より抜粋)
基本型
(プリミティブ型)
・Java言語の「言語仕様」できめられた根っこの型。
・勝手に型を追加・変更できない。
・変数の中には実体が入っている。
・全て小文字。
参照型
(オブジェクト型)
・配列型、クラス型、インターフェース型実装の
 オブジェクトのアドレスを格納できる。
・変数の中には参照(アドレス)が入っている。
 言わば「ショートカット」のようなもの。


  戻り値(もどりち)

戻り値(もどりち)
関数から戻してもらう値。


これを使えば、呼び出し元は
関数から結果の値を受け取れる。
 
関数(メソッド)の処理の流れ(戻り値)


引数を含めて関数内で宣言された変数は
関数のブロックの中でのみ有効。

つまり、関数が終わると、
変数は値と一緒に消えてしまう。

(関数は毎回最初からということ。)

だから、
必要な結果は、戻り値で呼び出し元に
戻してやる必要がある


(詳しくは変数の有効範囲を参照。)
 

  関数(メソッド)の詳細


関数の詳細


・記述場所
・書式
・呼び出し方
・変数の有効範囲
・動作の流れ

  関数(メソッド)の記述場所


クイズゲーム完成 解答チェック関数化
(KotoQuizのKQMain.java)12行目~
 
クラスのブロックの直下に書く
・・・      
012   public class KQMain {  
     
017     public static void main(String[] args) {
     
177       }  
178      
179       private static int printCorrect(int seikaiGoukei){  
     
187       }  
188      
189   }  
・・・    
関数の定義の順番は関係ない(動作に影響しない)
(定義はメイン関数の上でも下でもいい)
関数はいくつ作ってもいい
   
関数の中に関数を書くことは不可(例外あり)
 
 
関数を定義する場所(書く場所)

・クラスのブロックの直下の階層に書く。
メイン関数と同じ階層に書くこと。
それ以外は書けない。(例外もありますが今は無視します。)

・関数はいくつ書いてもいい。

・メイン関数の中とかクラスの外には書けない。
 



関数(メソッド)の記述場所 まとめ


クラスのブロックの直下の階層に書く
・定義はメイン関数の上でも下でのいい。
・関数の定義の順番は関係ない(動作に影響しない)
・関数はいくつ作ってもいい。
 
他のブロックの中などに定義できない
関数の中に関数を書くことは不可。(例外あり)
 

  関数(メソッド)の書式

関数の書式

関数の書式は「定義」と「呼び出し」の2つがある。

関数を定義する時や呼び出す場合には、
決まった書式で書く必要があるので覚えること。
 

関数の書式

関数の定義 関数を作る書式
関数の呼出 関数を使う書式

 

関数(メソッド)の構成:関数の呼び出し
関数(メソッド)の構成:関数の定義
画像をクリックで拡大します

  関数(メソッド)の定義の書式

関数(メソッド)の定義の構成(static、private)
 
関数を定義の書き方

1、先頭にprivateとstaticを書く

各キーワード(予約語)の間は、半角スペースを空ける。

今は関数を定義する時は最初に必ず書くことれ。

これはクラスと関係あるため、今はそのまま書くこと。
 


関数(メソッド)の定義の構成(戻り値)
 
2、戻り値の型を定義する

これで関数の結果として返す戻り値を、どんな変数の型で返すか宣言する。
これは関数名の前に書くこと。

必須の項目で、型は1つしか書けない。

書く型の種類は変数の型と同じ。int型の値を戻したければ「int」と書く。
 


ここで定義した型と同じ型の値を関数の終わりで、
呼び出し元に戻してやらないとエラーになるので
必ず戻すように注意する。

戻すのにはreturn文を使う。
 
 

戻り値の型で定義した戻り値は必須
・・・      
        private static int test(){  
       
            int a = 1;  
              
            return a; 同じ型の戻り値が必須
        }  
・・・    
定義した型と同じ型の値を必ず戻す必要がある。





関数で戻り値が不要な場合はどうする?
・・・      
        private static int test(){  
       
            System.out.println("クリームソーダ美味しい!");  
              
            return 999999; 戻り値が要らない
        }  
・・・    
使わなくても何か戻り値を書かないとエラーになってしまう。


  void(ぼいど)

void(ぼいど)

関数の戻り値が「空(から)」なことを意味する特殊な型。
これで定義しておけば戻り値を戻さなくてもエラーにならない。

戻り値がいらない場合に使う。
 
 

関数で戻り値が不要な場合はどうする?
・・・      
        private static void test(){  
       
            System.out.println("クリームソーダ美味しい!");  
              
            戻り値を書かなくてOK
        }  
・・・    
voidを書けば戻り値を戻さないでもエラーにならない。
 

void型(ぼいどがた)
void
戻り値を戻さなくてもエラーにならなくなる
変数の宣言には使えない。



戻り値の型 まとめ


戻り値の型は必須
関数の戻り値の型を定義する。
定義した型の値をreturn文で戻してやらないといけない。

・戻り値の型は必須の項目。
・関数名の前に書く。
・型は1つしか書けない。
・書く型の種類は変数の型と同じ。
 
戻り値が不要な場合はvoidを書く
voidを書くことで戻り値を書かないでもエラーにならなくなる。

voidは変数の宣言などには使えない。
 


関数(メソッド)の定義の構成(関数名)
 
3、関数名を定義する

Javaのコーディング規約では、先頭小文字で
単語を複数つなげる場合は2番目以降の先頭は大文字。
これは変数と同じ。
特に長さとかの制限は無い。

関数の内容が分かりやすい名前にすること。
 



関数名 まとめ


関数の内容が分かりやすい名前をつける
Javaのコーディング規約では
先頭小文字で、単語を複数つなげる場合は
2番目以降の先頭は大文字。つまり、変数と同じ。

・長さや文字数の制限は無い。
 
同じ関数名で複数定義する事もできる
同じ関数名で複数の関数を定義する事もできる。

ただし、クラスの機能と関係しているため、当面、
同じ名前の関数名は定義しないこと。
 



関数(メソッド)の定義の構成(ブロック)
 
 
4、()括弧を書いて関数の{}ブロックを書く

「( )」引数を書く。
「{ }」のブロックの中に実行する処理を書く。

コードの大きさに制限はない。
 


関数(メソッド)の定義の構成(引数)
 
関数の呼び出し時に関数に値を渡したい場合は
この()括弧の中に引数(ひきすう)を宣言しておく必要がある。

ここに変数を書いておけば、呼び出し元から値を受け取れる。
例だと、このint型とboolean型の変数に値が入る。
 


引数の宣言の仕方は、変数の宣言と同じ書き方。

受け取りたい変数の型で引数名(変数名)を宣言する。

複数ある場合は「,」(カンマ)でつなげて書く。

引数の数に制限は無い。
必要なければ定義しなくていい。
 

引数の決まり

 
・・・    
        private static void test(int aaa){
     
            System.out.println("クリームソーダほんと美味しい!");
            
        }
・・・  
int型の値がほしければ int型の変数を宣言する。
 
 
・・・      
        private static void test(int aaa,boolean bbb,byte ccc,boolean ddd){  
       
            System.out.println("クリームソーダほんと美味しい!");  
              
        }  
・・・    
いくつ宣言しても、いろいろな型を同時に使ってもいい。
その場合、カンマで引数を区切る。
 
 
・・・      
        private static void test(){  
       
            System.out.println("クリームソーダ絶対美味しい!");  
              
        }  
・・・    
必要なければ空にして宣言しないでもいい。
 


引数の初期化は不要。
呼び出し元からの値が入ってそれが初期値になる。


引数を宣言した場合、呼出時に値を渡すのが必須になる。
必要の無い定義はやめておくこと。



引数の注意点
  同じ関数内では同じ引数名は使えない。  
     
      private static void test(int a,byte a){  
     
          System.out.println("クリームソーダまたまた美味しい!");  
            
      }  
   
 
     
  別の関数なら同じ引数名が使える。  
     
      public static void testA(int a) {  
     
          System.out.println("クリームソーダこりゃまた美味しい!");  
            
      }  
     
      private static void testB(int a){  
     
          System.out.println("クリームソーダすんごい美味しい!");  
            
      }  
   
 
 



引数 まとめ


受け取りたい型で宣言する
呼び出し側から受け取りたい値の型の変数を宣言する。

・必須ではない。必要なければ宣言しないでいい。
・引数の数に制限は無い。
・型の種類は変数と同じ。
・複数の型の種類を同時に宣言できる。

・初期化は不要。呼出側から受け取る値が初期値になる。
 
別の関数なら同じ引数名を使える
同じ関数内では同じ引数名を使えないが、関数が違う場合は
使える。
 

  return文(りたーんぶん)

関数(メソッド)の定義の構成(return文)
 
return文(りたーんぶん)

関数を終了して呼び出し元に処理を戻す命令。
同時に戻り値を返すこともできる。

戻り値をvoid以外で定義した場合は、
必ず値を返さないといけない。
 


実行した時点で処理を呼び出し元に戻す。

その時点で関数終了する。

そのためbreak文のようにそこから下は実行されない。
 
関数(メソッド)の定義の構成(return文で終了した場合)



return文の書き方

returnを書いて、戻り値の変数か値を書く。
間は半角スペース。

「戻り値の型」で定義したのと同じ型の値を
1つだけしか戻せない
return文の書式:戻り値は一つしか指定できない


戻り値の型がvoid型の場合など
戻り値が無い場合でもreturnは使える。


その場合、returnだけを書く。
処理がその時点で呼び出し元に戻るのは同じ。
 

return文は戻り値が無い場合も使える
(戻り値の型がvoid型の場合)
・・・      
        private static void test(){  
       
           return;  
              
        }  
・・・    
戻り値は書かないこと


return文は、関数の中でいくつでも使える。
戻り値もバラバラでいい。

注意しなくちゃいけないのは
if文などの「条件」で戻り値を返す場合

値が返らないルートがあるとエラーになる
 

戻り値に制御文を使う場合の注意
(戻り値の型がvoid以外の場合)
・・・      
        private static int test(){  
       
            int a = 1;  
       
            if(a == 1){  
                    return a;  
            }else if(a == 10){  
                    return 10;  
            }  
             戻り値が戻らないルート
        }  
・・・    
全ての処理のルートで値を戻すように作る必要がある。

例の場合、
変数aの値が1か10「以外」の場合、値が戻らないルートがある。
そのためエラーで実行できない。

実際にそのルートを通るかどうかは関係なくエラーになる。



return文 まとめ


呼び出し元に処理を戻す事ができる
実行された時点で処理を呼び出し元に戻す。

・return文は何個でも記述できる。

 
戻り値を戻す事ができる
戻り値の型がvoid型以外の場合、呼び出し元へ戻り値を渡すことができる。その場合必須。必ず戻り値を戻す事。

・値は、戻り値の型と同じ型にすること。
・呼出元へ戻せる値は1つだけ。
 


引数以外にも値を戻す方法はある。

また、関数から複数の値を同時に
戻す方法もいろいろある。


今後学習していきます。

  関数(メソッド)の呼び出し方

関数(メソッド)の呼び出しの構成
 
関数の呼び出し方

関数を使う場合は、コードの実行したい場所に
書式に従った呼び出し命令を書く。

何回でも利用できる。
 


関数(メソッド)の呼び出しの構成(呼び出し関数名)
 
関数の呼び出しの書き方

1、関数名を書く

呼び出したい関数名を書く。
もちろん関数を定義してないと呼べない。

定義してあれば自動補完機能でも呼び出せるので便利。
 


関数(メソッド)の呼び出しの構成(引数へ渡す値の指定)
 
2、引数に渡す値を指定する

「( )」を書いて定義と同じように指定する。

値の指定は変数でも、直接値を書いてもいい。

(この例の変数は、定義と同じint型とboolean型とする。
 


関数で定義されている引数の指定は全部必須

値はコピーして渡されるので、呼び出し元の変数は影響されない。


引数の指定は、定義されている並びの順番どおりに書くこと
 
引数の決まり(値の並び順と型を同じにする必要がある)


関数(メソッド)の呼び出しの構成(戻り値の受け取り)
 
関数から戻り値を受け取る場合は、
関数名の前に代入する変数を書く。

変数は戻り値と同じ型にすること。

戻り値が必要なければ変数を書かなくてもいい。
戻り値は変数に代入しなければそのまま消える。
 



関数の呼出 まとめ


何回でも呼び出せる
関数は何回でも呼び出せる。
 
関数に値を渡す
関数に、値を指定して渡すことができる。

・定義されている引数は全て必須。全て値を指定する事。
・定義と同じ並び順、同じ型で値を渡すこと。

 
戻り値を受け取る
戻り値がある関数の場合、
変数名の前に、戻り値の型と同じ変数を置くことで
関数から値を受け取ることができる。

・受け取りは必須ではない。変数を書かなくてもいい。

 

  関数(メソッド)の変数の有効範囲

関数(メソッド)の変数の有効範囲(関数のブロック)
 
関数の変数の有効範囲

関数はそれぞれ独立したブロックで作られる。
つまり、その中が影響範囲。他の関数からは使えない。

関数内で宣言された変数は、引数を含めてその中でだけ有効。
関数同士はまったく別のスコープになる。

つまり、メイン関数で宣言された変数は、別の関数では使えない

別の関数で使う場合は引数で値を渡さないとだめ。
 


それから、
引数の有効範囲は関数の中のみ。


引数は、関数が始まると、値は既に入った状態になっている。

後は普通の変数と同じように使える。
値の変更ももちろん可能。


関数が違えば、変数は同じ名前が使える
これは引数の場合も同じ。

関数と関数は別の場所と考えること。
 
 

別の関数で同じ変数名をつけた場合の例

 
・・・      
        private static int testA(int x,int y){  
       
            int a = 0;  
            int b = 0;  
       
            return a;  
       
        }  
       
        private static int testB(int x,boolean y){  
       
            int a = 0;  
            boolean b = 0;  
       
            return a;  
       
        }  
・・・    
同じ色の変数は同じ名前
 
関数が別の場合、同じ名前の変数を宣言することができる。

  ローカル変数

関数内で宣言された変数は
値を書き換えても関数が終わると全部消えてしまう。

この関数内で宣言された変数をローカル変数と言う。

関数の中、つまりその場所の中(ローカル)でしか使えない変数。
ローカルは「地方」や「地元」などの意味。関数の土地用の変数。


そのため、引数で受け取った値を使って計算しても、
そのままじゃ結果は消えてしまう。

取っておきたい値は、戻り値で呼び出し元へ戻す必要がある。

例:
メイン関数の中から別の関数を呼んだ場合、

引数、計算、戻り値(結果)

値をバケツリレーをしてメイン関数に戻さないと、結果を取って置けない。

     

今後、この変数の有効範囲に
クラスを使った場合の有効範囲が
追加されていきます。

  関数(メソッド)の動作の流れ

関数の呼び出しと実行の流れ

 図の呼び出し側はメイン関数の中だと
思って下さい。
 
 関数(メソッド)の処理の流れ:引数(値渡し)戻り値無しの場合
 
関数(メソッド)の処理の流れ:引数(値渡し)戻り値ありの場合


戻り値無しの図の解説

関数は、引数 genzaisuu に呼出元の nowCountの値が
入った状態で始まる。つまり「0」。

この引数に10を足して変数 kekkaDataに入れている。

だが、戻り値は無い。
関数が終わると、結果も関数といっしょに消えてしまう。

戻り値無しは、メッセージを出力するだけの場合など、
結果が必要ない場合に使う。
 関数(メソッド)の処理の流れ:引数(値渡し)戻り値無しの場合


戻り値ありの図の解説

これは計算した結果の変数 kekkaDataを
戻り値に指定して値を戻している。

値が呼び出し元に返るから
変数 resultDataに保存できる。
 
関数(メソッド)の処理の流れ:引数(値渡し)戻り値ありの場合

  その他

関数(メソッド)の呼び出しのイメージ:関数の中から関数を何階層にも呼び出せる


関数の呼び出しが複雑になってくると、
間違えて循環参照したプログラムを作ったりもする。

気をつけて作ること。
 
関数の循環参照:関数の呼び出しがループしてしまっている


プログラムは
関数の組み合わせでできている。


実際にはクラスが関係して、たった一行の命令が
複雑に絡み合う、何百の関数、何万行のコードの
スタートだったりする。

関数はクラスと絡んで、プログラムの設計に深く関わってくる。
柔軟な設計に重要。

今は
・関数から関数を呼べる
・関数はクラスと深く関わっている


ということを覚えておくこと。



関数のイメージ

メイン関数が「流れを作る組み立てライン」
だとすると、
その他の関数は、その流れの中で動く「装置」のような感じ。
 
関数の動作イメージ(絵の具工場)


ステートメント(文)が小さい「部品」だとすると、
関数はそれをまとめた中型の「装置」というイメージ。

つまり、関数は、処理をまとめた中型の処理単位と言える。

関数で、目的に応じた「装置」を作るイメージ。
 

関数(メソッド)のイメージ(処理の単位として見た場合)
目的:クイズゲームを作る
【絵の具を作る】
関数(メソッド)
【装置】【中】
メイン関数
【絵の具組み立てライン装置】
ステートメント 【部品】【小】
【部品1 チューブ】 ステートメント
【部品2 染料製造装置】 ステートメント
【部品3 ラベル作成装置】 ステートメント
・・・
クイズ問題関数
【染料製造装置】
ステートメント 【部品】【小】
【部品1 タンク】 ステートメント
【部品2 バケツ】 ステートメント
【部品3 こね棒】 ステートメント
・・・
クイズ解答関数
【ラベル作成装置】
ステートメント 【部品】【小】
【部品1 印刷機】 ステートメント
【部品2 カッター】 ステートメント
【部品3 ラベルシール】 ステートメント
・・・
・・・
 
クイズ問題関数でクイズを出題し、
クイズ解答関数で答えあわせをし、
メイン関数で各関数の結果をまとめるイメージ。

  関数(メソッド)のまとめ



関数(メソッド)特徴のまとめ
処理を整理する事ができる
機能別にできる
処理を分離できる
処理を統合できる
 
処理を再利用する事ができる
何回でも呼び出して利用する事ができる
 
 

関数(メソッド)の定義と呼出のまとめ
(クラス学習前)
関数の呼出
呼び出した時点で関数の定義側へ処理が移る。
関数の処理が戻るのを待つ。(同期処理)
関数の定義に値を渡せる(引数)(値渡し)
関数から値を受け取れる(戻り値)
何回でも呼び出すことができる
関数の定義
呼出元から値を受け取れる。(引数)(値渡し)
呼出元へ結果の値を戻せる(戻り値)
関数の中から別の関数を呼べる。
 

     

引数の名称:実引数と仮引数
 
引数の名称

正確には、呼出側も定義側も両方とも引数
呼び出し側を実引数、定義側を仮引数と言う。
 

 
このページはセッションで使用したプログラミング用語やIT用語の要約です。復習に利用して下さい。

漫画形式の本編はこちら <ゲームを作ろう!>超初心者のためのプログラミング入門
 

広告
home もくじ
  サイト内検索:
広告
お勧めの姉妹サイト
leafdays - リーフデイズ 超初心者のための園芸入門 - 楽しい趣味のガーデニング -