2015年9月16日水曜日

メンバ変数とはなにか

Javaプログラミングの「メンバ変数」とはなんでしょうか。ただ「変数」と言ったときはどんなものかわかりますね。
int = 1;
これはint(整数型)変数です。ただ変数と言ったときにはこんなものを指して変数といいます。

では「メンバ変数」とはなにかというと、オブジェクト(インスタンス)の変数のことです。ウィキペディアにも記事があります

実際に書いてみる


実際にコードを書いてなにがメンバ変数なのかを具体的に見てみましょう。

class Test{
  public static void main(String args[]){
    Subtest objectdayo = new Subtest();
    objectdayo.setNumber(10);
    objectdayo.display();
 
  }
}

class Subtest{
  int number;

  void setNumber(int newNumber){
    number = newNumber;
  }

  void display(){
    System.out.println("現在の数字は " + number + " です");
  }
}

上記のプログラムではSubtestクラスからオブジェクト「objectdayo」を作成しています。このとき、このオブジェクト「objectdayo」に割り当てられた変数「int number」(青いところ)がメンバ変数です。この変数はこのオブジェクトに割り当てられたものなので他のクラスがこの変数を使うことは基本的にできません。このクラスのなかでだけふつうの変数として使うことができます。

丁寧に書く場合には、このオブジェクト自身の変数と言う意味でthis.をつけることもできます。

class Test{
  public static void main(String args[]){
    Subtest objectdayo = new Subtest();
    objectdayo.setNumber(10);
    objectdayo.display();
 
  }
}

class Subtest{
  int number;

  void setNumber(int newNumber){
    this.number = newNumber;
  }

  void display(){
    System.out.println("現在の数字は " + number + " です");
  }
}

メンバ変数にthis.が付いていますね。これでもプログラムはキチンと動きます。

なお、下記のように、クラスを元にオブジェクトを作成してから、そのオブジェクトを使ってメンバ変数に値を格納することもできます。

class Test{
  public static void main(String args[]){
    Subtest objectdayo = new Subtest(); //オブジェクトの作成
    objectdayo.number = 55;  //オブジェクトを使ってメンバ変数に値を格納
    objectdayo.display();
 
  }
}

class Subtest{
  int number;

  void setNumber(int newNumber){
    this.number = newNumber;
  }

  void display(){
    System.out.println("現在の数字は " + number + " です");
  }
}


メソッドを使ってメンバ変数を変更する理由

メンバ変数に直接的に値を代入するのではなく、メソッドを使ってメンバ変数を変更するのには理由があります。例えば以下のプログラムが現在が何月かを示すものだとしましょう。

class Test{
  public static void main(String args[]){
    Subtest objectdayo = new Subtest();
    objectdayo.number = 3;  //オブジェクトを使ってメンバ変数に値を格納
    objectdayo.display();
 
  }
}

class Subtest{
  int number;

  void setNumber(int newNumber){
    this.number = newNumber;
  }

  void display(){
    System.out.println("今日は"+ number + "月です。");
  }
}

このような場合、1年に1月から12月までしかないのにもかかわらず、メンバ変数に直接代入する方式だと「30月」だとか「13月」だとか、存在しない数字を代入することができてしまいます。

メソッドを使ってメンバ変数を変更する方式であれば、こんな間違いを防止するために、いったんメソッドを呼び出して、そこに格納可能か値かどうかをチェック機能をつけることができます。

public class TestTest{
  public static void main(String args[]){
     Subtest objectdayo = new Subtest();
     objectdayo.setNumber(14);
     objectdayo.display();
     objectdayo.setNumber(12);
     objectdayo.display();
     objectdayo.setNumber(-2);
     objectdayo.display();
   }
 }

class Subtest{
   private int number;

   void setNumber(int newNumber){
     if ((newNumber >= 1) && (newNumber <= 12)){
       number = newNumber;
     }else{
    number = 0;
    }
   }

   void display(){
     System.out.println(""+ number + "");
   }
 }

このとき、30月などのありえない数字を格納した場合、すべて0月と表示されます。直接、値を代入する方式だとこういうチェック機能を追加することはできませんね。