C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[15156] Variant 때문에 그렇습니다.
김백일 [cedar] 1728 읽음    2002-01-31 00:08
Variant class에 operator*()와 operator+()가 있기 때문에 그렇습니다.
Variant는 주로 OLE Automaton에 사용되는 것으로서,
short, int, float, double, Currency, TDateTime, bool, WordBool, Byte, AnsiString&, char *, wchar_t * const, Ole2::IDispatch* const, Ole2::IUnknown* const
타입을 모두 가질 수 있는 데이터 타입입니다.
웬만한 기본 데이터 타입은 전부 가지고 있습니다.

원래 이 타입은 베이직에서 유래한 겁니다. 비베 사용자라면 친숙할 겁니다.
원래 인터프리터 언어인 베이직은 선언하지 않고 변수를 쓸 수 있는 데,
이 때의 타입이 Variant지요.
M$가 비쥬얼 베이직을 주력 개발툴로 하면서 OLE 기능에 포함되게 되었고,
다른 윈도 개발툴인 VC++, 델파이, C++빌더도 당연히 지원하게 되었죠.
C++에서의 Variant는 물론 union을 사용해서 구현되어 있습니다.
그러므로 당연히 Variant 객체 하나가 꽤 많은 메모리를 쓰게 됩니다.
메모리 사용 면에서나 버그 방지를 위해서라도
(void* 포인터를 쓸 때 타입을 혼동하여 생길 수 있는 실수와 같은 맥락이죠)
OLE Automaton을 위해 꼭 필요한 경우외에는 쓰지 않는 것이 좋습니다.

용준 님이 쓰신 글 :
: AnsiString a = "2002"
: AnsiString b = "1"
:
: 여기서
: AnsiString c = a + b 이면 20021

여기서는 AnsiString::operator+(AnsiString&)이 호출되므로
두 문자열이 결합(concatenation)됩니다.

: AnsiString c = a * 10000 + b 이면 20020001
:
: AnsiString c = a * 10000 + b * 100 이면 20020100
:
: AnsiString c = a * 32 + b 이면 64065

여기서는 Variant::operator*(AnsiString&), Variant::operator+(AnsiString&)이 호출되는데,
Variant는 a, b를 숫자로 보고 각각 곱셈과 덧셈을 하게 됩니다.
그 후에 다시 c에는 AnsiString으로 형변환되어 대입됩니다.
베이직에서나 볼 수 있던 현상이 VCL 프로그래밍을 할 때 다시 나타나게 되는 것이죠. -_-;

: 제가 볼때는 좀 이상하군요...
: 단순한 숫자의 연산은 분명 아니군요...
:
: 뭐가 어떻게 되는건지 누가 설명좀 해줘요....
:

+ -

관련 글 리스트
29859                     Re:형 변환 때문이 아니라 Variant의 연산자 겹지정 때문입니다! 하느리 1132 2003/02/26
29858                     Re:형 변환 때문이 아니라 Variant의 연산자 겹지정 때문입니다! 하느리 1077 2003/02/26
15156     Variant 때문에 그렇습니다. 김백일 1728 2002/01/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.