[ActionScript3]static修飾子について

初めまして!今年の春入社したぐっちーです。
アライトに入社して初めてプログラミングに触れ、業務の中で日々勉強中です。
難しかったところや、つまったところを記事にしていこうと思っていますので、
よろしくお願い致します。

前回は、UnityでParticle Systemを使用する方法についてご紹介いたしました。
今回は、ActionScriptのstaticについて説明していきたいと思います。
staticとは、変数宣言、関数定義するときに修飾子として使うものです。

staticで変数宣言、関数定義を行うとクラス自体に変数と関数を持たせることができます。
またstaticで宣言、定義されたものを、クラス関数、クラス変数と呼びます。
非staticは、インスタンスに関数、変数を持たせることができます。
これらをインスタンス変数、インスタンス関数と呼びます。

staticは、ほかのクラスで呼ぶ際には、クラス名.クラス変数(関数)名で呼ぶことができます。
それに対して非staticのものを他クラスで呼ぶ際には、インスタンスを生成する必要があります。

それでは、ActionScriptでのstaticの定義方法について説明します。

まずは、変数からいきましょう

~変数~

public static var test:String;

変数はこのようにアクセス指定子の後にstaticをつけ、宣言します。

~関数~

public static function testFunction():void{}

関数でも、アクセス指定子の後にstaticをつけ、定義します。

では、実際にstaticを利用したプログラムをかいてみましょう。

例として、
ある学校のA学年とB学年、それぞれの学年の総合人数を出す処理を作ります。
A学年クラス、B学年クラス、結果表示クラスを作りたいと思います。
前提条件は下記となります。
A学年クラスのstatic関数の中で、非static関数を呼ぶ。
B学年クラスのstatic関数の中で、static関数を呼ぶ。

public class ASchoolYear
{

	//~ASchoolYear(A学年)~
	public static function synthesizeA():int
	{
		var class1:int = 32;
		var class2:int = 22;
		return additionA(class1,class2);
	}

	//a,bを足した数値を返す処理
	private function additionA(a:int,b:int):int
	{
		return a + b;
	}
}
//----------------------------------------------------

public class BSchoolYear
{
	//~BSchoolYear(B学年)~
	public static function synthesizeB():int
	{
		var class1:int = 40;
		var class2:int = 41;
		return additionB(class1,class2);
	}
	
	//a,bを足した数値を返す処理
	public static function additionB(a:int,b:int):int
	{
		return a + b;
	}
}

//-------------------------------------------------

puclic class ShowData
{

	//showData(出した人数を表示するクラス)
	public function showDataA():void
	{
		var outputA:int = ASchoolYear.synthesizeA();
		trace(outputA);
	}

	public function showDataB():void
	{
		var outputB:int = BSchoolYear.synthesizeB();
		trace(outputB);
	}
}

処理は完成しました。
次にパブリッシュをしてみるとA学年のコンパイルエラーがでてしまいます。

【エラー内容】
1180: 未定義である可能性が高いメソッド addition の呼び出しです。

メソッドを定義したはずが、未定義扱いとなってしまい、コンパイルエラーとなってしまうようです。

今回のエラーは、staticの中で非static関数を呼んだのが原因です。
理由としては、非staticの定義がstaticより遅いことです。
staticは冒頭で説明した通り、クラスのメンバなので、クラスが認識された時点で定義されます。
ですが、インスタンスメンバの非staticはnewされるまで、使うこともできません、よって関数は未定義となり、
コンパイルエラーとなります。そのため、学年Aのaddition関数にstaticをつけることで、コンパイルエラーを取り除くことが出来ます。

staticは、一見便利そうなのですが、どこからでも呼び出せてしまうので共通処理にしかむいていないです。
それにstaticを使うと、最初にたくさん容量をとるので、あまり多用はおすすめできません。
私も、このエラーが出てつまづいたので、記事にしたのですが、使用用途がなかなか難しそうです。
最後までご覧頂きありがとうございました。


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


コメントを残す

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

*