본문 바로가기
[공부]/C++

[C++] 기본 정리 8 - 구조체, 공용체, 열거체

by 개발꿈냥무 2024. 2. 20.

구조체

  • C++의 기본 타입을 가지고 사용자가 새롭게 정의할 수 있는 사용자 정의 타입
  • 기본 타입으로는 나타낼 수 없는 복잡한 데이터를 표현 가능
  • 멤버 (또는 멤버 변수) : 구조체를 구성하는 변수
  • 변수뿐 아니라 함수까지도 멤버로 가질 수 있음
  • 객체 지향 프로그래밍의 핵심이 되는 클래스의 기초가 됨

 

구조체, 구조체 변수 선언

struct 구조체이름 
{
	멤버1의타입 멤버1이름;
	멤버2의타입 멤버2이름;
    ...
};

struct 구조체이름 구조체변수명;

 

구조체 멤버로의 접근

구조체변수이름.멤버변수이름

ex.
struct Book web_book; // 구조체변수 선언
web_book.author;  // 멤버 참조 연산자(.) 사용하여 구조체 멤버에 접근

 

구조체 변수 초기화

- 구조체 정의에서 멤버가 정의된 순서에 따라 차례대로 초깃값이 설정됨

- 나머지 멤버는 0으로 초기화됨

구조체변수이름 = { 멤버1초깃값, 멤버2초깃값, ... };

ex.
web_book = { "홍길동", 1000 };

 


함수와 구조체

 

C++는 구조체 (또는 구조체를 가리키는 포인터, 구조체의 멤버 변수) 를

- 함수 호출시 전달되는 인수

- 함수 종료될 때 반환되는 return 값 (장점: 한 번에 여러 개의 데이터를 반환할 수 있음)

으로도 사용 가능

 

-> 장점 : 함수가 원본 구조체의 복사본을 가지고 작업하기 때문에 안전(구조체 가리키는 포인터 사용한 호출은 예외)

 

-> 구조체를 가리키는 포인터를 인수로 전달하는 것의 장점 : 복사본이 아니라 주소 하나만 전달하므로 빠름 (단, 원본 데이터의 보호 측면에서는 매우 위험 -> const 키워드를 사용하여 인수를 함수 내에서 직접 수정할 수 없게 하는 게 좋음)


중첩된 구조체

구조체 정의할 시, 멤버 변수로 또 다른 구조체를 포함할 수 있음

 

 

구조체의 크기

=> 멤버 변수들의 크기로 결정됨. but 언제나 멤버 변수들의 크기 총합과 일치하는 것은 아님!

 

byte padding (바이트 패딩)

  • 컴파일러가 메모리의 접근을 쉽게 하기 위해, 크기가 가장 큰 멤버 변수를 기준으로 모든 멤버 변수의 메모리 크기를 맞춤
  • padding byte (패딩 바이트) : 바이트 패딩으로 추가되는 byte

출처 -  TCP School

 

 

 


공용체

  • union 키워드 사용
  • 순서가 규칙적이지 않고, 미리 알 수 없는 다양한 타입의 데이터를 저장하도록 설계된 타입
  • 크기가 가장 큰 멤버 변수 크기만큼의 메모리를 할당받음
  • 모든 멤버가 하나의 메모리 공간을 공유한다는 점을 제외하면 구조체와 같음
  • 즉, 공용체는 한 번에 하나의 멤버 변수만을 사용할 수 있음 -> 공용체에 저장된 데이터의 의미는, 값을 저장할 때 어떤 멤버 변수를 사용했는지에 따라 달리 해석됨
union Share {
	unsigned char a;
    unsigned short b;
    unsigned int c;
};

Share var;
var.c = 0x12345678;

cout << hex;
cout << var.a << " ";
cout << var.b << " ";
cout << var.c;

결과: x 5678 12345678

 

 

 


열거체 

  • enum 키워드 사용
  • 새로운 타입을 선언하면서 동시에 그 타입이 가질 수 있는 정수형 상숫값도 명시
  • 상숫값 따로 명시하지 않으면 0부터 시작해 자신보다 바로 앞의 상숫값보다 1만큼 증가되며 정의됨
  • 열거체를 사용하면 프로그램 가독성이 높아짐 + 변수가 지니는 값에 의미를 부여할 수 있음
enum Weather { SUNNY = 0, CLOUD = 10, RAIN = 20, SNOW = 30 };

 

 

 

 

 


참고)

코딩의 시작, TCP School

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com