하나 이상의 변수를 그룹지어 사용자 정의 자료형으로 새롭게 정의하는 것으로,
기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다.
C++ 구조체는 변수뿐만 아니라 함수까지도 멤버 변수로 가질 수 있다.
💡 기본적으로 C++ 함수는 한 번에 하나의 데이터만을 반환할 수 있다.
하지만 구조체를 사용하면 한 번에 여러 개의 데이터를 반환할 수 있다.
❗ 구조체 선언의 끝에 세미콜론을 꼭 써야 한다.
[구조체 선언 및 정의]
struct 구조체이름
{
멤버변수타입 멤버변수이름;
};
ex)
struct CafeMenu
{
string name;
string sugar;
int price;
};
[구조체 변수 선언]
struct 구조체이름 구조체변수이름;
ex)
struct CafeMenu coffee;
혹은
CafeMenu coffee;
💡 C와 달리 C++은 구조체 변수 선언 시 struct 키워드 생략 가능,
But 코드가 C, C++에서 범용적으로 사용되도록 보통 C 문법을 기준으로 코드를 작성한다.
[키워드X]
//[struct 구조체이름]이 세트로 사용됨
sturct 구조체이름
{
멤버변수타입 멤버변수이름;
};
struct 구조체이름 멤버변수이름;
[키워드O]
// 구조체 정의와 typedef 선언을 동시에 하면 구조체이름 생략 가능
typedef sturct (구조체이름)
{
멤버변수타입 멤버변수이름;
} 구조체새이름;
구조체새이름 멤버변수이름;
[문법]
구조체변수이름.멤버변수이름
ex)
coffee.price
[문법]
구조체변수이름 = {멤버변수1의초깃값, 멤버변수2의초깃값, ...};
ex)
coffee = {"연유라떼", "30g", 6000};
👉 멤버 변수가 정의된 순서에 따라 차례대로 초깃값이 설정되며,
초기값이 포함되지 않은 멤버는 기본값으로 초기화된다.
초기값을 미리 지정해두지 않으면 0으로 초기화한다.
-> 구조체의 멤버 변수를 함수의 인수로 전달
struct Prop
{
int savings;
int loan;
};
int CalcProperty(int, int);
int main(void)
{
int hong_prop;
Prop hong = {10000000, 4000000};
hong_prop = CalcProperty(hong.savings, hong.loan); // 구조체의 멤버 변수를 함수의 인수로 전달함
cout << "홍길동의 재산은 적금 " << hong.savings << "원에 대출 " << hong.loan
<< "원을 제외한 총 " << hong_prop << "원입니다.";
return 0;
}
int CalcProperty(int s, int l)
{
return (s - l);
}
-> 함수의 인수로 구조체 직접 전달
int CalcProperty(Prop*);
int main(void)
{
...
hong_prop = CalcProperty(&hong); // 구조체의 주소를 함수의 인수로 전달함.
...
}
int CalcProperty(Prop* money)
{
money->savings = 100; // 호출된 함수에서 원본 구조체의 데이터를 변경
return (money->savings - money->loan);
}
👉 위와 같이 구조체를 가리키는 포인터를 인수로 전달하는 방식은 구조체의 복사본이 아닌 주소 하나만을 전달하므로 빠르다는 장점을 가진다.
❗ but 원본 데이터 보호 측면에서 매우 위험
Prop InitProperty(void);
int CalcProperty(const Prop*);
int main(void)
{
...
hong = InitProperty();
hong_prop = CalcProperty(&hong); // 구조체의 멤버 변수를 함수의 인수로 전달함
...
}
Prop InitProperty(void)
{
Prop hong_prop = {10000000, 4000000};
return hong_prop; // 구조체를 함수의 반환값으로 반환함.
}
int CalcProperty(const Prop* money) // const 키워드를 사용하여 구조체의 데이터를 직접 수정하는 것을 방지함.
{
//money->savings = 100; // 호출된 함수에서 원본 구조체의 데이터를 변경
return (money->savings - money->loan);
}
struct Book
{
string name;
int price;
string author;
};
struct Library
{
Book myBook;
int numOfBook;
};
Library ycLibrary
👉 아래와 같이 중첩된 구조체에 대해 중첩된 초기화 목록을 사용할 수 있다.
ex) Library ycLibrary = {{"책이름", 12900, "저자명"}, 1};
👉 위 코드에서 myBook의 멤버변수 값을 알고 싶으면 멤버 선택 연산자(.)를 두 번 사용하면 된다.
std::cout << ycLibrary.myBook.name
👉 yclibrary에서 myBook을 선택하고 그 안에서 name을 선택
struct TypeSize
{
char a; //1byte
int b; //4byte
double c; //8byte
//but!! 구조체 크기 : 16byte
};
❗ 공용체에 저장된 값의 의미는 값을 저장할 때 공용체의 어떤 멤버 변수를 사용했는지에 따라 달리 해석된다.
또한 공용체 중 하나의 멤버 변수만 초기화해도 나머지 멤버 변수도 그 값을 동시에 공유하게 된다.
[참고]
http://www.tcpschool.com/cpp/cpp_struct_intro
http://www.tcpschool.com/c/c_struct_intro
https://boycoding.tistory.com/183
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=imbin_&logNo=221330417695
https://min-zero.tistory.com/entry/C-%EA%B8%B0%EB%B3%B8-%EA%B3%B5%EB%B6%80%EC%A0%95%EB%A6%AC-10-%EA%B3%B5%EC%9A%A9%EC%B2%B4union-%EC%97%B4%EA%B1%B0%EC%B2%B4enum
https://youtu.be/Nrtg_YSqwu4