플생사모 카페에 데모로스 님이 추상클래스에 대해서 올린 글이 있어서 그 글을 이용해 조금 정리해봤다.

 

ActionScript 3.0에서는 추상클래스(abstract class)가 없다. Java는 abstract 키워드가 있는데 ActionScript 3.0에는 없다. 추상클래스라는 것은 구현체이면서 자기 자신은 직접 생성하는 것을 허락하지 않는 클래스이다. 가령 DisplayObject, DisplayObjectContainer, InteractiveObject,Graphics의 경우 new 연산자를 이용해 직접 생성이 불가능하다. 이 때문에 이들 클래스는 추상클래스라고 추측할 수 있다.

 
(추상클래스와는 별개지만 이들 클래스는 확장도 안된다. 즉 상속할 수 없다는 것이다.  이들이 어떻게 구현되어 있는 것인지 native 코드이므로 알 수 없다.)

 

ActionScript 3.0에서 추상 클래스(abstract class)와 인터페이스(interface)와 비교하면 다음과 같다.

  1. 추상클래스는 구현부분이 존재한다. 하지만 인터페이스는 존재하지 않는다.
  2. 추상클래스는 일반 구현클래스처럼 다중 상속이 지원되지 않지만 인터페이스는 다른 인터페이스 다중상속이 가능하다.
  3. 추상클래스를 확장할 때 extends 키워드 사용하지만 인터페이스를 구현할때는 implements 키워드를 이용한다. 인터페이스 구현은 다중구현이 가능하다.
  4. 추상클래스와 인터페이스 둘 다 new 연산자로 생성할 수 없다.

다음 코드는 ActionScript 3.0으로 추상클래스를 흉내내본 클래스이다.


package 
{
	import flash.errors.IllegalOperationError;
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	import flash.utils.getQualifiedSuperclassName;

	public class AbstractClass 
	{
		public var name:String =""

		public function AbstractClass()
		{
			checkAbstract();
		}

		private function checkAbstract():void 
		{
			var className : String = getQualifiedClassName(this);
			if (getDefinitionByName(className) == AbstractClass ) 
			{
				throw new ArgumentError(
				getQualifiedClassName(this) + "클래스를 인스턴스화할 수 없습니다.");
			}
		}

		public function doSomething1():void
		{
			trace("doSomething1() 실행됨")
		}

		public function doSomething2() : void 
		{
			var message : String = 
				"추상 메서드 doSomething2(" + getQualifiedSuperclassName(this) + ")이(가) " 
				+ getQualifiedClassName(this) + "클래스에서 구현되지 않았습니다.";
			throw new IllegalOperationError(message); 
		}
	}
}

 

위 코드 만으로도 실행시 new 연산자로 이 클래스를 객체화 할 수 없다. 그러나 아쉽게도 이 코드는 컴파일시에 에러를 잡을 수 없다. abstract 키워드가 없는 결과이다. 다른 방법은 없는 것 같다. namespace 또는 외부에서 접근할 수 없는 클래스를 심어 놓아도 완벽히 추상클래스를 만들 수 없다.

 

이 클래스를 이용해 다음과 같이 new 연산자를 사용하면 실행시 에러가 난다.

var instance:AbstractClass = new AbstractClass(); //AbstractClass 클래스를 인스턴스화 할 수 없습니다.

만약 이 AbstractClass를 확장해서 ConcreteClass를 만들었다고 가정하자. 다음과 같이 ConcreteClass를 만들었지만 AbstractClass의 doSomthing2() 함수를 override하지 않는다면 다음과 같은 메세지가 나올 것이다.


package
{
	public class ConcreteClass extends AbstractClass
	{
		public function ConstructClass()
		{
			super();
		}
   }
}

 

doSomething2(AbstractClass)이(가) ConcreteClass클래스에서 구현되지 않았습니다.

반드시 ConcreteClass에서 doSomething2() 함수를 아래와 같이 구현해야한다.
 


package
{
	public class ConcreteClass extends AbstractClass
	{
		public function ConstructClass()
		{
			super();
		}

		override public function doSomething2() : void 
		{
			trace("구현함");
		}
	}
}

 

ActionScript 3.0에서 추상클래스를 어떻게 만들어야 하는가 알아보았다. 역시 부족한 점이 많다. 차기 ActionScript에서는 추상클래스를 지원해줬으면 좋겠다.

+ Recent posts