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

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[124] struct 도 하나의 변수 일 뿐.
김태선 [cppbuilder] 18886 읽음    2007-04-01 11:30
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));
이렇게 하면... 이런 코드는 큰일 나죠.

왜 이런 차이가 나는지에 대해 자세한 설명은
이미 저의 이전 강좌에서 다루어 봤으므로 여기서는 생략합니다.

그럼.

+ -

관련 글 리스트
124 struct 도 하나의 변수 일 뿐. 김태선 18886 2007/04/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.