8) 구조체
다양한 타입을 가진 변수들의 집합.
8-1. 구조체 선언
#include <string>
struct book {
std::string title;
std::string author;
int price;
};
구조체 변수에는 객체, 함수 등등 왠만한 자료형은 전부 들어갈 수 있습니다.
- 파이썬 리스트와의 차이점
- 자료형을 선언해야함.
- 순서가 없음
- 파이썬 클래스와의 차이점
- 클래스의 메서드는 멤버변수들을 이용한 결과물을 만들 수 있지만, 구조체는 그저 저장공간이므로 멤버변수들을 이용할 수 없습니다.
8-2. 구조체 변수 선언
int main(){
struct book book_struct = {"Book", "Dong Chan", 28000};
std::cout << book_struct.title; // 클래스 멤버변수처럼 접근가능
}
구조체는 일종의 틀이고, 구조체 변수는 틀으로 찍어낸 물건이라고 생각하면 편합니다.
그래서 struct 구조체이름 구조체 변수
이런식으로 구조체 변수이름도 명시해줘야 합니다.
8-3. 구조체의 크기
struct TypeSize {
char a; // 크기 1
int b; // 4
double c; // 8
}
int main(){
std::cout << sizeof(TypeSize) // 16
}
구조체의 크기는 반드시 가장 큰 자료형의 배수여야 합니다.
-
이렇게 만들어야 컴파일러가 해석하기 편하다고 하네요..
(이 링크 이해하기 https://stackoverflow.com/questions/10309089/why-does-size-of-the-struct-need-to-be-a-multiple-of-the-largest-alignment-of-an)
=> 만약 1+4+8 = 13이라면, 나머지 3바이트는 padding으로 빈 공간이 됩니다.
8-4. 공용체
참고링크 : http://tcpschool.com/cpp/cpp_struct_unionEnum
공용체 : 모든 멤버 변수가 하나의 메모리 공간을 공유함.
- 크기가 가장 큰 멤버변수의 크기로 메모리를 할당받음.
- 나머지 멤버변수들의 값은 가장 큰 멤버변수의 값으로 처리됨
ex) 작은 자료형의 값은 잘려나감.
union data_types {
int a;
short b;
char c;
};
int main(){
int a = 0x12345678;
union data_types example;
example.a = a; // 하나의 멤버변수 기준으로 초기화해야함.
std::cout << std::hex;
std::cout << example.a << std::endl; // 12345678
std::cout << example.b << std::endl; // 5678
std::cout << (int)example.c << std::endl; // 78
}
8-5. 열거체
정수형 상수에 의미를 부여하기 위한 장치
enum Weather {SUNNY=0, CLOUD=10, RAIN=20, SNOW=30};
int main(void){
Weather wt(SUNNY);
std::cout << wt; // 0
}
마치 SUNNY를 key로, 0을 value로 가지는 딕셔너리 같은 느낌입니다.
열거체를 사용함으로써 가독성이 엄청 좋아진다고 하는데 조금 써 봐야 알 것 같습니다.