2016年5月24日火曜日

[C#] クラス(class)とコンストラクタ、そしてnew(割り当て)

こんにちは。明月です。
今日はクラスについて勉強します。プログラムを少しでも扱ったことがある方なら「クラス」について聞いたことがあると思います。


クラス(class)


クラスはOOP(オブジェクト指向プログラム)の最小単位です。構成要素はメンバ変数、プロパティ、メソッド、イベントがあります。その中で我々は変数、プロパティ、メソッドについて勉強しました。イベントはデリゲートと関係がありまして少し後で勉強します。


[C#] 変数と定数


[C#] プロパティ(property)


[C#] メソッド(関数)とvoid型



クラスの構成は上のとおりです。使用方法では「new」キーワードを使ってメモリに割り当て使います。


new


「new」キーワードは配列を宣言する時に使ったことがあります。配列を宣言する時と同様にクラスの「new」もメモリに「割り当てをします」という意味です。



上の例を見ると割り当て演算子の区切りで「TestClass test」「new TestClass」に分けて考えて見ましょう。前の「TestClass test」は変数と同様の意味でメモリアドレス(整数)が入ります 「new TestClass」の場合はメモリ(heap)に「TestClass」を割り当てます。



上のイメージとおりにクラスが宣言し割り当てたと思われます。すなわち、「test」変数は「heap」に「TestClass」が割り当てたメモリアドレスがあると意味です。そして割り当てた「TestClass」のデータを取得することはコンマ「.」の区切りで取得できます。


「test」変数名は「TestClass」が割り当ててメモリアドレスが格納されたことは理解しました。そうすると「test」で割り当てたクラスの「data」変数にデータを格納して見ましょう。
上のソースを見るとクラスの構造の中で「data」のプロパティがありますが、読み専用になっています。でも,「setData」のメソッドを見ると「"Test"」の文字列を合成して「data」に格納するところがあります。そうするとメソッドを通って「data」に「Data」の値を格納します。(合成されて「TestData」になる。)
そして「Data」プロパティを通って「data」の値を出力して結果を確認しましょう。



予想とおりに結果を得られました。次からクラス参照について詳しく勉強してみましょう。



今回の例は前の例通りに「test」に「TestClass」を割り当てます。そのあとで「test」の変数「data」に「Data」を入力します。そして「test2」に「test」を代入し、「test2」の変数「data」に「Clear」のデータを格納すれば「test」の変数「data」の値は何でしょうか?
ただ、基本的に考えると「test」の変数「data」の値は「Data」、「test2」の変数「data」は「Clear」になると思いますね。



でも結果は両方「Clear」になりました。なぜなら、初めに「test」に割り当ててメモリアドレスを「test2」を代入したからです。すなわち、クラス内のデータが複製して新しいクラスが割り当てたことではなく、同じクラスを見ていることの意味ですね。それで「test」と「test2」は割り当てた同じクラスを参照している結果になったことです。そしてメモリアドレス結果「GetHashCode」を見ても「test」と「test2」のメモリアドレスは同じになっています。



今回は「test」、「test2」に「new」をして割り当てて結果を確認してみましょう。




結果をみると「test」、「test2」は別にクラスを割り当てました。メモリアドレス「getHashCode」を確認してもクラスの変数「data」を見ても予想とおりに結果を得たことを確認しました。


コンストラクタ


今までクラスを宣言して割り当てることまで勉強しました。上の例をみると「setData」メソッドにデータを格納していますね。でも、メソッドを通って格納することではなく、クラスが割り当てるタイミングでデータを初期化したいという時もありえます。
それでクラスが割り当てる時に呼ばれるメソッドがありまして、それをコンストラクタといいます。



コンストラクタはメソッドと形態が似ていますが、返却値がないこととコンストラクタ名はクラス名と一致することで「クラス」と「コンストラクタ」を区別します。




予想とおりの結果を得られました。


ここまでクラスについて勉強しました。クラスはOOPで大事な位置になっています。後からインタフェース、抽象クラス、継承などの概念は基本的にクラスから派生した意味です。それでこのクラスを確実に覚えば勉強がよく進められると思います。

0 件のコメント