講義メモ:第7章 クラスの基礎

p.153 クラスとは何か

・C#などのオブジェクト指向言語では、プログラムをクラスを単位として作成し、データ構造もクラスを基本として扱うことができる
・プログラムは設計図にあたるソースを、ビルドすることによって実行体がメモリの上に生成されて動作する
・この設計図にあたるのがクラス、実行体にあたるのがオブジェクト(インスタンス)
・この考え方を、クラスの中で用いるデータ構造や部品にあてはめることもできる
・例えば、X座標とY座標を保持できる座標情報をクラスとして、点Aの座標をこのクラスのオブジェクトaで、点Bの座標をこのクラスの
 オブジェクトbで扱える
・そして、この座標情報のクラスをプログラムの中に記述して、mainメソッドでオブジェクトaとbを生成して利用できる

p.154 簡単なクラスを定義しよう

・例えば、X座標とY座標を保持できる座標情報をクラス名「map」として定義することができる。
・定義書式例: class クラス名 { 型 変数名; … }
 例: class map { int x; int y; } //座標情報クラス「map」の定義
・クラスの中に記述した変数などのことをメンバという。メンバにはデータとメソッドなどがある
・ちなみに、6章までで作成したプログラムはすべてクラスで、メンバはmain()メソッドのみだった
・クラスの中に記述した変数のことをクラス変数、データメンバともいう
・クラスからオブジェクトを生成すると、生成したオブジェクトの中にクラス変数の実体ができる
 例: mapクラスからオブジェクトgoalを生成し、goalのX座標とY座標を格納する
 例: mapクラスからオブジェクトstartを生成し、startのX座標とY座標を格納する
・このことから、クラス変数を基本的にインスタンス変数ともいう(※例外あり)
・インスタンス変数はオブジェクトの中に守られているので、外側から扱う許可を与える必要がある
・このアクセス制限を示す表現をアクセス修飾子といい、基本的に public が許可を示す
・ちなみに、mainメソッドもクラスの外側にあるシステムが扱うので、public が必要
・外側から扱う定義書式例: class クラス名 { public 型 変数名; … }
 例: class map { public int x; public int y; } //座標情報クラス「map」の定義
・なお、アクセス修飾子を記述しないと private が指定されているとみなされ不許可を示す
例:
class MyCat { //クラス「MyCat」の定義
 public int catNo; //猫番号のインスタンス変数
 public string catName; //猫名のインスタンス変数
 public double catWeight; //猫体重のインスタンス変数
}

p.154 簡単なクラスを定義しよう(定義したクラスを使おう)

・クラスからオブジェクトを生成して扱うには、オブジェクトの名前にあたるインスタンス名が必要(※例外あり)
・このインスタンス名は「クラスを型とする変数」という書式になる
・インスタンス名の定義書式: クラス名 インスタンス名;
 例: map goal; //インスタンス名goalを定義する
 例: map start; //インスタンス名startを定義する
 例: myCat tama; //インスタンス名tamaを定義する
・そして、クラスからインスタンスを生成するには演算子newを用いる(配列の生成のnewと同じ意味)
・インスタンスの生成の書式: インスタンス名 = new クラス名();
 例: goal = new map(); //mapオブジェクトを生成し、goalとする
 例: tama = new myCat(); //myCatオブジェクトを生成し、tamaとする
・インスタンス名の定義とインスタンスの生成は(変数の初期化と同様に)まとめて実行できる
・インスタンスの定義と生成の書式: クラス名 インスタンス名 = new クラス名();
 例: myCat tama = new myCat(); //インスタンス名tamaを定義し、myCatオブジェクトを生成して与える
・すると、インスタンス変数は「インスタンス名.インスタンス変数名」で利用できる
・この「.」は「の」と読むと分かりやすい
 例: tama.catNo = 500; //インスタンス名tamaのインスタンス変数catNoに代入
 例: tama.catName = "たま"; //インスタンス名tamaのインスタンス変数catNameに代入
 例: tama.catWeight = 3.14; //インスタンス名tamaのインスタンス変数catWeightに代入
・よって、インスタンス変数を持つクラスを定義することで、変数をまとめて扱えるようになる

p.156 simpleclass.cs

//p.156 simpleclass.cs
using System;
class myclass //プログラマによるクラスの定義(クラス名:myclass)
{
    public int x; //外部から利用できるインスタンス変数xの定義
}
class simpleclass //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        myclass mc = new myclass(); //myclassクラスのインスタンスを生成しインスタンス名mcとする
        mc.x = 10; //インスタンスmcのインスタンス変数xに10を代入
        Console.WriteLine("mc.x = {0}", mc.x); //インスタンスmcのインスタンス変数xの値を表示
    }
}

アレンジ演習:p.156 simpleclass.cs

・クラス名:myclassをSlimeに
・インスタンス変数xをhpに
・インスタンス名mcをslalinにしてみよう・そして、インスタンス変数mpを追加してみよう
・それから、2つ目のインスタンスhoiminも生成してみよう

作成例

//アレンジ演習:p.156 simpleclass.cs
using System;
class Slime //スライムを表すクラスの定義
{
    public int hp; //スライムが持つインスタンス変数
    public int mp; //スライムが持つインスタンス変数
}
class simpleclass //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        Slime slalin = new Slime(); //「スライムのスラリンがあらわれた」
        slalin.hp = 10; //「スラリンのHPは10」
        slalin.mp = 20; //「スラリンのMPは20」
        Console.WriteLine("スラリンのHPは{0}", slalin.hp); //インスタンスslalinのインスタンス変数hpの値を表示
        Console.WriteLine("スラリンのMPは{0}", slalin.mp); //インスタンスslalinのインスタンス変数mpの値を表示

        Slime hoimin = new Slime(); //「スライムのホイミンがあらわれた」
        hoimin.hp = 30; //「ホイミンのHPは30」
        hoimin.mp = 40; //「ホイミンのMPは40」
        Console.WriteLine("ホイミンのHPは{0}", hoimin.hp); //インスタンスhoiminのインスタンス変数hpの値を表示
        Console.WriteLine("ホイミンのMPは{0}", hoimin.mp); //インスタンスhoiminのインスタンス変数mpの値を表示
    }
}

p.157 簡単なクラスを定義しよう(インスタンス変数の複数定義・生成)

・「int x, y;」というように、同じ型の変数をまとめて宣言できる
・インスタンス名も同様で「クラス名 インスタンス名①, インスタンス名②, …」と記述できる
・なお、インスタンスの生成もまとめて行える(「int x = 1, y = 2;」と同様に)
・書式例: クラス名 インスタンス名① = new クラス名(), インスタンス名② = new クラス名(), …;

アレンジ演習:p.157 simpleclass02.cs

・「MyClass a, b;」からの3行を1行にしてみよう

作成例

//アレンジ演習:p.157 simpleclass02.cs
using System;
class MyClass //プログラマによるクラスの定義(クラス名:myclass)
{
    public int x; //外部から利用できるインスタンス変数xの定義
}
class simpleclass02 //Mainメソッドを持つ実行用のクラスの定義(クラス名:simpleclass02)
{
    public static void Main() //外部から利用できるメソッドMainの定義
    {
        MyClass a = new MyClass(), b = new MyClass(); //【変更】2つのインスタンスの定義と生成をまとめて
        a.x = 10;  //1つめのインスタンスのもつインスタンス変数への代入
        b.x = 100; //2つめのインスタンスのもつインスタンス変数への代入
        Console.WriteLine("a.x = {0}, b.x = {1}", a.x, b.x); //上記2つのインスタンス変数の値を表示
    }
}

解説:クラス図とオブジェクト図の一種

提出:アレンジ演習:p.157 simpleclass02.cs

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です