C/C++ 언어 정의상 struct 도 하나의 변수일 뿐입니다.
int 나 char, double 형 변수 등 단일한 하나의 값만을 저장하는 것이 아닌
다양한 값을 저장할 수 있는 변수형이라는 것입니다.
그러므로 다음과 같이 하는게 조금도 이상할 게 없습니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct Ta
{
int type;
char name[1000];
};
Ta GetT()
{
Ta a = { 1, "이렇게 좋구나" };
Ta b = a;
return b;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Caption = GetT().name;
}
//---------------------------------------------------------------------------
실행해보면 창의 제목에 "이렇게 좋구나"라고 잘 표시됩니다.
여러 사람들의 코드를 보면 struct 는 구조체닌까
두 구조체간의 내용 대입을 이렇게 하려고 합니다.
{
Ta a = { 1, "이렇게 좋구나" };
Ta b;
memcpy(&b, &a, sizeof(Ta));
}
하지만 struct 도 하나의 변수로 볼수 있기 때문에 아래와 같이 하는게 더 바람직합니다.
{
Ta a = { 1, "이렇게 좋구나" };
Ta b = a;
}
그러면 a의 내용이 b로 모두 복사됩니다.
결과적으로
memcpy(&b, &a, sizeof(Ta));
를 실행한 것과 같은 것이죠.
하지만 월등히 직관적이고 이해가 수월합니다.
구조체를 하나의 변수를 본다는 관점에서는 클래스도 동일한데 위 struct를 class 로
고쳐서 한번 실행해 볼까요.
class Ta
{
public:
int type;
char name[1000];
};
이렇게 수정해서 실행해봐도 역시 결과는 같습니다.
그런데 클래스일때는(또는 구조체라 할지라도)
Ta b = a;
와 같이 대입하는게
memcpy(&b, &a, sizeof(Ta));
와 동작의 차이를 보이게 됩니다.
물론 대입 연산자 = 를 재정의하거나 생성자자가 여러개 있지 않았다면 차이가 별로 없지만
= 재정의를 하거나 생성자가 여러가지 다른 형에 대해 반응하게 했다면
또는 가상함수가 있는 경우라면
동작은 완전히 틀리게 됩니다.
그럴때는
Ta b = a;
memcpy(&b, &a, sizeof(Ta));
이 두 줄의 코드는 완전히 다른 의미가 됩니다.
당연히 클래스간 내용 대입은
Ta b = a;
식으로 써야 합니다.
memcpy(&b, &a, sizeof(Ta));
은 단순 메모리 내용 복사에 불과하므로, 클래스의 특성을 완전히 알 때만 쓸수 있는 것입니다.
가령, 간단한 예로 AnsiString 클래스에 대해서
String aa = "안녕하세요.";
String bb;
대입을
bb = aa;
는 아무 문제 없지만
memcpy(&bb, &aa, sizeof(String));
이렇게 하면... 이런 코드는 큰일 나죠.
왜 이런 차이가 나는지에 대해 자세한 설명은
이미 저의 이전 강좌에서 다루어 봤으므로 여기서는 생략합니다.
그럼.
|