티스토리 뷰
※ 주의 사항 ※
- 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
구조체
C++의 구조체는 C언어의 구조체와 달리 변수 이외에 함수도 멤버로 가질 수 있고, typedef 지시어 또는 using 선언문으로 새로운 데이터 타입을 만들어 이를 멤버로 가질 수도 있습니다.
Account 구조체를 정의하고 출금과 계좌 정보를 출력하는 구현하는 예제를 통해 C언어와 C++에서 사용하는 구조체의 차이점에 대해 알아보겠습니다. 먼저 아래는 C언어의 예제입니다.
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Account;
typedef struct Account Account;
struct Account
{
char account[21];
char name[21];
int balance;
void (*deposit)(Account*, int);
void (*withdraw)(Account*, int);
void (*print)(Account*);
};
void deposit(Account* this, int money)
{
this->balance += money;
}
void withdraw(Account* this, int money)
{
this->balance -= money;
}
void print(Account* this)
{
printf("계좌 : %s, 소유주 : %s, 잔고 : %d", this->account, this->name, this->balance);
}
void openAccount(Account* this, const char* id, const char* name, int balance)
{
strcpy(this->account, id);
strcpy(this->name, name);
this->balance = balance;
this->deposit = deposit;
this->withdraw = withdraw;
this->print = print;
}
int main()
{
Account koey;
openAccount(&koey, "120-345-129099", "koey", 100000);
koey.withdraw(&koey, 10000);
koey.print(&koey);
return 0;
}
/*
실행 결과
계좌 : 120-345-129099, 소유주 : koey, 잔고 : 90000
*/
그리고 다음은 C++의 예제입니다. 둘을 비교해보면서 차이점을 찾아보시기 바랍니다.
#include <iostream>
#include <cstdlib>
#include <cstring>
struct Account
{
char account[21];
char name[20];
int balance;
Account(const char* id, const char* name, int balance)
:balance(balance)
{
strcpy_s(account, id);
strcpy_s(this->name, name);
}
void print()
{
std::cout << "계좌 : " << account
<< ", 소유자 : " << name
<< ", 잔액 : " << balance << std::endl;
}
void deposit(int money)
{
balance += money;
}
void withdraw(int money)
{
balance -= money;
}
};
int main()
{
char id[] = "120-345-129099";
char name[] = "koey";
Account koey = Account(id, name, 100000);
koey.withdraw(10000);
koey.print();
return 0;
}
/*
실행 결과
계좌 : 120-345-129099, 소유자 : koey, 잔액 : 90000
*/
우선 구조체가 함수를 멤버로 가질 수 있는지 없는지에 따라 C언어와 C++의 구조체의 차이점을 확인할 수 있습니다.
C언어에서 제공하는 구조체는 변수 위주로만 제공되며, 필요하다면 함수 포인터를 사용하여 함수를 만들어 호출할 수 있습니다. 쉽게 말해 C언어에서의 구조체 내 함수는 단지 함수 포인터로 외부에 존재하는 함수를 연결시키는 관계일 뿐입니다. 반면 C++의 구조체는 함수를 직접 멤버로서 가질 수 있습니다.
그리고 눈치챘는지 모르겠지만 위 예제에서 보인 C++의 구조체는 모양이 클래스와 상당히 닮아 있습니다. private, public과 같은 접근 지시자도 사용할 수 있고, 생성자와 소멸자도 사용할 수 있으며, 상속도 가능합니다. 클래스에서 할 수 있는 거의 모든 것을 구조체로 할 수 있는 것으로 보입니다.
공용체
C++의 공용체는 C언어의 공용체와 별 차이점이 없는 것 같습니다. 그래서 C언어에서의 공용체를 설명한 것으로 대체합니다.
공용체는 선언 방식이 구조체와 비슷하지만 저장 공간을 할당하는 방식은 전혀 다릅니다. 공용체는 모든 멤버가 하나의 저장 공간을 같이 사용합니다. 이로써 생기는 장단점이 있습니다. 예제를 통해 공용체의 장단점과 사용법을 살펴보겠습니다.
#include <stdio.h> union student { double grade; int num; char cj; }; void main(void) { union student s1; s1.num = 315; printf("학번 : %d\n", s1.num); s1.grade = 4.4; printf("학점 : %.1lf\n", s1.grade); printf("학번 : %d\n", s1.num); } /* 실행 결과 학번 : 315 학점 : 4.4 학번 : -1717986918 */
우선 공용체 변수의 크기는 멤버 중에서 크기가 가장 큰 멤버로 결정됩니다. student 공용체의 멤버 중에선 double의 크기가 8바이트로 가장 큽니다. 따라서 해당 공용체 변수의 크기는 8바이트가 됩니다.
공용체 변수는 이처럼 여러 개의 멤버를 가져도 전체 메모리 크기가 구조체와 달리 크지 않습니다. 하지만 하나의 저장 공간을 공유하기 때문에 한 번에 한 개의 멤버에만 데이터를 저장할 수 있습니다. 처음 학번을 315로 저장했지만 다시 학점을 4.4로 저장한 이후 다시 학번을 출력하려고 해도 학번에는 더 이상 값이 남아있지 않아 의도치 않은 다른 값이 출력되었습니다.
'공부 일지 > CPP 공부 일지' 카테고리의 다른 글
C++ | 상수 표현식(constexpr ) (0) | 2021.08.07 |
---|---|
C++ | 열거형 (0) | 2021.08.06 |
C++ | char 타입과 wchar_t 타입 (0) | 2021.08.06 |
C++ | void 타입과 unspecified (0) | 2021.08.06 |
C++ | auto 타입과 decltype 타입 (0) | 2021.08.06 |