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
[15187] 형 변환 때문이 아니라 Variant의 연산자 겹지정 때문입니다!
김백일 [cedar] 1340 읽음    2002-01-31 22:23
하느리 님이 쓰신 글 :
: 뭔가 오해를 하신 모양인데, 제가 말씀 드린 것은 그러한 전용이 일어난 이유를 설명드린 것입니다. 그것을 해결하기 위해 Variant 형식을 사용하던 다른 형태를 사용하던지의 문제를 설명 드린 것이 아니고요.
:
: 김백일 님이 쓰신 글 :
: : 하느리 님이 쓰신 글 :
: : : 질문하신 내용으로 보아서 다른 것은 다 숫자연산인데, 제일 처음 것은 왜 숫자 연산을 안하고 문자열 붙이기를 하였느냐는 것 같습니다. (맞습니까 ?  ^^?)
: : : 이유는 간단합니다. cast연산 때문에 그렇습니다.
: : : 1.
: : :  c = a + b      // 이 경우는 AnsiString 끼리의 연산이기 때문에 +연산자가 strcat 연산을 수행
: : : 2.
: : :  c = a * 32 + b
: : :  // 이 경우를 보다 자세히 표현하면
: : :  // c = (StrToInt (a) * 32) + StrToInt (b)
: : :  // 이렇게 되는 이유는 32가 정수(숫자)이기 때문에 type casting이 일어나기 때문입니다.

님이야 말로 뭔가 오해를 하고 계시는 군요.

원래 C/C++ 컴파일러는 char, short, int, long, float, double 같이 정수/실수 타입간의
형 변환만 자동으로 될 뿐,
위에 님이 쓰신 것과 같은 문자열과 정수/실수간의 형 변환은 일어나지 않습니다.
만약 형 변환 연산자를 써서 다음과 같이 강제로 캐스팅을 하려해도

  AnsiString c = (int)a * 10000 + (int)b;
  // 형 변환은 이렇게 해야 합니다. StrToInt() 함수를 호출하는 것이 아닙니다!

컴파일러는 다음과 같은 에러를 내고 중단해 버립니다.
"E2031 Cannot cast from 'AnsiString' to 'int'"   

다시 한번 말하지만, 형 변환 때문이 아니라 Variant의 연산자 겹지정 때문입니다.

: : : 답변이 되었는지.... ?
: : : 실제 AnsiString class 내부에서는 이런 일을 하기 위해 function overriding을 적용하여 동일한 연산자에 여러가지의 함수를 구현하고 있지 싶습니다.
: :
: : 죄송하지만... AnsiString에는 수치연산을 하는 연산이 없습니다.
: : AnsiString의 도움말이나 헤더파일인 dstring.h를 보시면 됩니다.
: :
: : Variant의 도움말과 sysvari.h를 보시면 아래 연산이 가능하다는 것을 알 수 있습니다.

그래도 못 믿어지신다면 다음과 같이 직접 실험해 보세요.
(실제로 실험해 보고 글을 쓰는 겁니다.)

AnsiString을 쓰러면 vcl.h를 반드시 인클루드해야 하는데,
이렇게 하면 VCL의 모든 클래스와 함수들이 전부 인클루드됩니다.
만약 sysvari.h의 Variant 클래스 선언부분을 수정해서 binary operator를 못쓰게 만들어 버리면
용준님이 쓰신 코드는
"E2094 Operator 'operator*' not implemented in type 'AnsiString' for arguments of type 'int'" 에러를 내며 컴파일이 안 되어 버리고 맙니다.

sysvari.h의 Variant의 binary operator 부분에다가 다음 두 줄을 추가한 다음.

#ifndef DISABLE_BINOP_VARIANT // 이 줄을 추가합니다.
    // binary operators (Variant on right)
    Variant __fastcall operator +(const Variant& rhs) const;
    Variant __fastcall operator -(const Variant& rhs) const;
    Variant __fastcall operator *(const Variant& rhs) const;
    Variant __fastcall operator /(const Variant& rhs) const;
    Variant __fastcall operator %(const Variant& rhs) const;
    Variant __fastcall operator &(const Variant& rhs) const;
    Variant __fastcall operator |(const Variant& rhs) const;
    Variant __fastcall operator ^(const Variant& rhs) const;
    Variant __fastcall operator <<(const Variant& rhs) const;
    Variant __fastcall operator >>(const Variant& rhs) const;
(중략)
#endif // 이줄을 추가합니다.

용준 님의 코드를 쓴 프로그램을 다음과 같이 작성했습니다.

#pragma hdrstop // 프리컴파일드 헤더를 쓰지 않고 헤더를 전부 새로 컴파일합니다.
// 아래 문장의 주석을 해제하면
// "E2094 Operator 'operator*' not implemented in type 'AnsiString' for arguments of type 'int'" 에러가 납니다.
//#define DISABLE_BINOP_VARIANT
#include <vcl.h>
#include <stdio.h>
#include <assert.h>

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    AnsiString a = "2002", b = "1";

    AnsiString c = a + b;         assert(c == 20021);     puts("Ok.");
    // AnsiString::operator+(const AnsiString&)이 호출되므로
    // 두 문자열이 결합(concatenation)됩니다.

    c = a * 10000 + b;         assert(c == 20020001);     puts("Ok.");
    c = a * 10000 + b * 100;    assert(c == 20020100);     puts("Ok.");
    c = a * 32 + b;             assert(c == 64065);     puts("Ok.");
    // Variant::operator*(AnsiString&), Variant::operator+(AnsiString&)의 호출

    return 0;
}
//---------------------------------------------------------------------------
   

: :
: : 
: : : 용준 님이 쓰신 글 :
: : : : AnsiString a = "2002"
: : : : AnsiString b = "1"
: : : :
: : : : 여기서
: : : : AnsiString c = a + b 이면 20021
: : : :
: : : : AnsiString c = a * 10000 + b 이면 20020001
: : : :
: : : : AnsiString c = a * 10000 + b * 100 이면 20020100
: : : :
: : : : AnsiString c = a * 32 + b 이면 64065
: : : :
: : : : 제가 볼때는 좀 이상하군요...
: : : : 단순한 숫자의 연산은 분명 아니군요...
: : : :
: : : : 뭐가 어떻게 되는건지 누가 설명좀 해줘요....
: : : :

+ -

관련 글 리스트
15153 AnsiString에서의 연산(?).... 용준 927 2002/01/30
15175         죄송하지만... AnsiString에는 수치연산을 하는 함수가 없습니다. 김백일 1349 2002/01/31
15187                 형 변환 때문이 아니라 Variant의 연산자 겹지정 때문입니다! 김백일 1340 2002/01/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.