본문 바로가기

Development/WebApp

[Flex] 주의해야 할 int, String 비교

	var valueInt :int = 0;
	var valueObject :Object = valueInt;
	trace( valueObject == "" );
	trace( valueObject == 0 );


이렇게 코딩을 했을 때 어떻게 나올까? 답은 true true이다. int타입이고 값이 0인데 왜 빈칸( "" )과의 비교가 왜 true가 나오는 걸까? 저번에 쓴 "String타입 "false"를 Boolean타입으로 변환하는 방법"에 적어놓은 이유와 같다. 이 포스트에서 좀 더 자세히 풀자면, Flex는 Java와 다르게 Boolean 이외의 타입으로도 논리연산이 가능하다. 이 기능은 양날의 검으로 어떻게 보면 편하고 어떻게 보면 불편한 기능이다. 개인적으로는 안 쓰고 버그 안 나는 게 좋은 것 같다. 다음 코드를 보자.


	if( 0 ) {
		trace( "true" );
	} else {
		trace( "false" );
	}


이렇게 했을 때 콘솔에 나오는 값은? 역시 답은 false이다. Java에서는 컴파일 조차 안 되는 문법이 Flex에서는 가능하다. JavaScript나 다른 스크립트들을 사용해본 사람들은 이 방법이 좀 더 유연하고 편한 방법이라고 생각할지 모르겠다. 그럼 또 다른 코드를 보자.


	if( "" ) {
		trace( "true" );
	} else {
		trace( "false" );
	}


아까와 같은 코드에서 조건문에 들어가는 부분을 0에서 빈칸( "" )으로 변경했다. 나오는 값은? 역시 false. int타입에서 0은 false이고 그 외의 값은 true인 것처럼 String타입에서도 빈칸( "" )은 false인 것이다. int타입과 한 가지 다른 점은 String은 null이 가능하기 때문에 null 또한 false가 된다.

결론은 int타입이나 String타입 등 여러 타입들을 Object타입으로 받은 뒤에 조건문을 사용할 때 0 == ""이 true가 되지 않게 하기 위해서는 해당 변수의 타입검사를 해야할 것이다.( is, getQualifiedClassName() 등의 키워드나 메소드 사용 )

태그