scaleform.minarto.com

as2용 Dictionary 클래스 만들기 - 1 본문

ActionScript

as2용 Dictionary 클래스 만들기 - 1

미나토 2013. 2. 7. 18:19


2013/02/04 - [ActionScript] - as2용 Dictionary 클래스 만들기 - 0




1. 이어서...



다시 한번 코드를 보시죠



dynamic class com.minarto.utils.Dictionary {
	public function Dictionary() {
		this.__proto__.setValue = Dictionary.prototype.setValue();
	}
	
	
	public function setValue($target, $value) {
		var c:Number = 0;
		
		return	function($target, $value):Void {
			if ($target) {
				$target.__dictionary__ || ($target.__dictionary__ = ++ c);
				this[$target.__dictionary__] = $value;
			}
		};
	};
	
	
	public function getValue($target) {
		return	$target ? this[$target.__dictionary__] : $target;
	}
}


자... 그럼 지금부터 코드 분석을 시작하겠습니다.

이 포스팅을 이해하시려면 다음과 같은 내용의 이해가 필요합니다.


1. 객체의 생성과정

2. 클로저





음... 어렵다면 꽤 어려울 겁니다.


일단 이러한 내용을 담은 플래시 서적 자체가 존재하지 않습니다. (적어도 국내에는요...)


하지만 자바스크립트 책을 찾아보시면 있습니다.


http://www.insightbook.co.kr/books/programming-insight/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C








2. setValue



setValue 함수를 보겠습니다.

함수 인자부터 보겠습니다.


$target 은 바로 포인터 참조를 하게될 객체를 말합니다. $value 는 해당 참조에 넣게될 값이지요


일단 c라는 지역변수를 선언해서 0을 집어넣었습니다. 일단 지금은 그렇구나 정도로만 봐주면 됩니다.



그 다음을 보니 함수를 리턴해 줍니다.


이 녀석이 실제로 이 Dictionary 객체에서 동작하게될 setValue 함수입니다.


(클래스 말고) 생성자 함수인 Dictionary 함수를 통해 이 객체가 생성됨과 동시에, 이 생성된 객체에는 Dictionary.prototype.setValue 함수가 복사되게 됩니다. 이게 바로 객체 생성의 순서지요...


그 생성된 녀석은 this.__proto__.setValue 로 자리잡게 됩니다.



setValue 함수를 호출한다는 뜻은 this.__proto__.setValue 를 호출한다는 뜻입니다.



하지만 저는 객체 생성과 동시에 this.__proto__.setValue 함수를 다른 놈으로 바꿔치기 합니다.


public function Dictionary() {
	this.__proto__.setValue = Dictionary.prototype.setValue();
}


바로 Dictionary.prototype.setValue 함수를 실행해서 리턴한 함수지요... 실제로 동작하게될 setValue 함수 되시겠습니다.



그 함수를 살펴봐야겠지요... 


$target 의 __dictionary__ 라는 속성을 검사해서 해당 속성이 존재하지 않는다면 값을 넣습니다.

증가한 c의 값이지요...


하지만 이 함수 내에는 c라는 변수가 존재하지 않습니다. 그렇기 때문에 클로저를 이용해서 위에 선언한 c를 찾아서 쓰게 됩니다.


이 녀석은 이제부터 클로저를 통한 참조로서 존재하기 때문에, 개발자가 다른 식으로 접근할 방법이 아예 없습니다. 접근 자체가 원천 봉쇄된 셈이죠.

그렇기 때문에 매우 안전한 값이 되고 그 값이 고유함을 유지할 수 있습니다.



포인터는 아니지만 Dictionary 객체 상에서 고유한 값이 되었기 때문에 포인터로서의 역할을 할 수가 있는 셈입니다.


그리고 그 고유한 c 값을 키값으로 활용해서 $value 를 Dictionary 객체에 저장하게 됩니다.


클래스 선언부를 보시면 알겠지만 dynamic 클래스이기 때문에 가능하죠.





2. getValue



setValue 함수에 비해 getValue 는 단순합니다.


Dictionary 에 setValue 함수를 통해서 넣은 객체라면 __dictionary__ 라는 속성을 가지게 되므로 그 값을 가져와서 키값으로 이용합니다.


그래서 그 키값을 이용해서 Dictionary 객체에서 값을 가져오면 끝입니다.



	public function getValue($target) {
		return	$target ? this[$target.__dictionary__] : $target;
	}



물론 target 이란 객체가 존재할 경우이며 null 이라면 null 자체 그대로 리턴하게 만들었습니다.

삼항식을 이용한 코드 유희랄까요...




3. 미완성인 Dictionary 클래스



이것만으로도 간단히 사용은 할 수 있습니다. 



게다가 함수 이외에 별다른 속성 자체가 존재하지 않기 때문에, for in 문도 동작 가능합니다


c는 클로저이기에 VM 내에서만 접근가능하기 때문에, for in 문에서 검색되지 않습니다.




하지만 참조할 객체의 고유함이 하나의 Dictionary 객체에서는 유지됩니다만... 하나의 Dictionary 객체만이 아닌 두개 이상의 Dictionary 객체에서 같은 객체를 참조하게 된다면 더 이상 그 값은 고유함을 가지기 어렵습니다.



그래서 다음 포스팅에서는 여러개의 Dictionary 객체에서도 고유함을 가지게 하기 위한 방법을 보여드리죠...



거기까지 가야 제대로된 Dictionary 클래스라고 할 수 있습니다.




그럼 다음 포스팅에...