2007. 11. 16. 16:53
[Dev/Flex]
FLEX에서 XML에 있는 값을 가져다 쓰던 도중에 Boolean 값으로 변경을 해야되는 경우가 생겼습니다.
다른 언어라면 Boolean("true") 이렇게 하면 true값이 나올법도 한데,
플렉스는 좀 다르더라구요. 다음은 레퍼런스에 있는 표입니다.
Data type or value |
Result of conversion to Boolean |
---|---|
String |
false if the value is null or the empty string (""); true otherwise. |
null | false |
Number, int or uint |
false if the value is NaN or 0; true otherwise. |
Object |
false if the instance is null; true otherwise. |
String은 empty string("")이나 null일때는 false를 반환하고 그외에는 true를 반환한다고 합니다.
그렇다면 "true"나 "false"나 둘다 true를 반환하겠지요? ㅡㅡ;
그래서 저는 다음과 같이 변환하여 보았습니다.
private var xml:XML = <root><value>true</value></root>;
var bool:Boolean = new Boolean((String(xml.value) == "true") ? " " : null );
var bool:Boolean = new Boolean((String(xml.value) == "true") ? " " : null );
value가 true이면 true를 반환하게 " " 를, 아니면 null을 넣어서 false를 반환하게 했답니다.
그러나 이게 좀 쓰기가 복잡하다는 거죠. (타이프하기가 귀찮....;)
그래서 Flex Component 카페에 질문을 올렸고, 카페 매니저이신 '브라이언'님이 다음과 같은 방법을 일러주셨습니다.
private var xml:XML = <root><value>true</value></root>;
var bool:Boolean = xml.value.contains("true");
var bool:Boolean = xml.value.contains("true");
제가 쓴 방법보다 훨 간단하게 쓸 수 있겠더군요.
혹시나 해서 테스트도 해보았습니다.
테스트한 소스
import flash.utils.getTimer;
private var time:Number = getTimer();
private var xml:XML = <root><value>true</value></root>;
private function initApp():void
{
test1();
test2();
}
private function test1():void
{
time = getTimer();
for(var i:Number=0; i<5000000; i++)
{
var bool:Boolean = new Boolean((String(xml.value) == "true") ? " " : null );
}
trace("검쉰 맘대로 캐스팅 : " + (getTimer() - time));
}
private function test2():void
{
time = getTimer();
for(var i:Number=0; i<5000000; i++)
{
var bool:Boolean = xml.value.contains("true");
}
trace("브라이언님이 가르켜주신 방법 : " + (getTimer() - time));
}
import flash.utils.getTimer;
private var time:Number = getTimer();
private var xml:XML = <root><value>true</value></root>;
private function initApp():void
{
test1();
test2();
}
private function test1():void
{
time = getTimer();
for(var i:Number=0; i<5000000; i++)
{
var bool:Boolean = new Boolean((String(xml.value) == "true") ? " " : null );
}
trace("검쉰 맘대로 캐스팅 : " + (getTimer() - time));
}
private function test2():void
{
time = getTimer();
for(var i:Number=0; i<5000000; i++)
{
var bool:Boolean = xml.value.contains("true");
}
trace("브라이언님이 가르켜주신 방법 : " + (getTimer() - time));
}
위와 같이 테스트를 하였습니다.
(테스트한 방법은 지돌스타님 포스트를 참고하였습니다.)
Flex Component 카페에서 활동하시는 회원이신 지돌스타님과 이인준님의 도움을 받아서
3대의 컴퓨터에서 오백만번씩 돌려서 테스트 결과
검쉰 맘대로 캐스팅 : 15142
브라이언님이 가르켜주신 방법 : 18855
거의 동일하게 제가 한 방법이 약간 빨랐습니다만(하나씩도 해보고 순서도 바꿔봤습니다),
오백만번 돌릴 일도 없고, 브라이언님이 가르켜주신 방법이 간단하니
앞으로 XML을 Boolean형으로 Casting 하는 것은 contains("true") 이렇게 해야겠습니다.
단 String형의 "true" 값은 제가 하는 방식대로 하려고 다음과 같이 static function을 만들었습니다.
public static function StringToBoolean(value:String):Boolean
{
var result:Boolean;
var inputDataString:String = value.toLowerCase();
return new Boolean( (inputDataString == "true") ? " " : null);
}
{
var result:Boolean;
var inputDataString:String = value.toLowerCase();
return new Boolean( (inputDataString == "true") ? " " : null);
}
좋은 의견 있으시면 덧글이나 트랙백 부탁드립니다. ;)
'Dev > Flex' 카테고리의 다른 글
[FLEX] 왜 Sprite는 Canvas에 addChild 안되는 걸까? (7) | 2007.12.04 |
---|---|
[FLEX] Coloring the Background of Cells (20) | 2007.11.20 |
[FLEX] 간단한 아이템 렌더러(Item Renderer)를 만들어보자 (4) | 2007.11.12 |
[FLEX] Datagrid 에 Mouse Over 시에 나오는 색을 바꾸고 싶다면? (0) | 2007.11.09 |
[FLEX] Flex 3.0 베타에서 구현한 데이터그리드 멀티헤더 (datagrid multi-header) (7) | 2007.06.12 |