변환 연산자는 컴파일러에 의해 암시적 호출이 가능하므로 사용시 유의해야 한다.
대부분의 해외 개발자들은 변환 연산자보다는 변환 인터페이스 사용을 권장하고 있다.
Android에서는 인터페이스와 바인더 사이의 변환을 하기 위해서 아래의 두 함수를 제공한다.
asBinder, asInterface
foo(c); 코드는 개발자의 의도와 달리, 컴파일, 런타임에 에러 없이 동작하고 있다.
Complex의 int() 연산자 재정의를 함으로써 암시적으로 형변환이 되어 에러가 발생하지 않는다.
예를 들어, 다음 코드는
아래와 같은 단계로 형변환이 되어 동작한다.
int real = c;
int real = int(c);
c.operator int();
하지만 많은 대가 들이 operator 를 이용해서 형변환하지 말것을 강조하고 있다.
위의 형변환 문제는 Android framework에서도 동일하게 나타난다.
Framework에서 service 를 개발할 때, IBinder와 IInterface를 둘 다 상속(다중상속)을 받는데,
IInterface 와 IBinder 간에 형변환이 가능해야 하는 구조를 가지고 있다.
그래서 Android에서는 IInterface 에는 asInterface 를 제공하고, IBinder에는 asBinder를 제공하여
서로의 형변환 처럼 동작하도록 제공한다.
위 코드는 아래와 같이 바뀔 수 있다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기