My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


파이썬 유저를 위한 C++ (5) - 구조체, 공용체, 열거체

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

공용체 : 모든 멤버 변수가 하나의 메모리 공간을 공유함.

1

  • 크기가 가장 큰 멤버변수의 크기로 메모리를 할당받음.
  • 나머지 멤버변수들의 값은 가장 큰 멤버변수의 값으로 처리됨

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로 가지는 딕셔너리 같은 느낌입니다.

열거체를 사용함으로써 가독성이 엄청 좋아진다고 하는데 조금 써 봐야 알 것 같습니다.

comments powered by Disqus