본문 바로가기
서적 정리/C++ 기초 플러스

15.구조체(struct)

by 민돌이2 2022. 8. 3.

한 사람에 관련된 이름, 주소, 나이, 번호 등 정보를 저장해야 할 때, 어떻게 저장할 것인가? 클래스를 떠올릴 수 있지만, 구조체를 사용할 수도 있다. 구조체는 사용자가 정의할 수 있는 데이터형이다.

struct Information
{
	char name[20];
	char address[30];
	int age;
	int number;
};

 

 

 


클래스와의 차이점

기본적으로 클래스와 구조체는 같다고 봐도 무방하다. 클래스가 갖고 있는 기능 모두 사용할 수 있으며, 구조체라는 객체 안에 멤버 변수나 함수, 생성자 등을 선언할 수 있다. 다만, 소소한 차이점은 존재한다.

  1. 명시적인 struct와 class 키워드 차이점
  2. 접근제어 지시자를 선언하지 않았을 때, class는 private이고 struct는 public이다.

내 코딩 스타일상 구조체보단 클래스를 선호하며, 구조체는 클래스안에서 사용한다. 예를 들어, 몬스터 객체가 있고, 몬스터의 이동속도, 공격력, 체력 등은 몬스터 클래스 안에 구조체로 선언한다.

 

 

구조체 사용하기

클래스 대부분 비슷하지만, 생성자를 선언하지 않는 경우에 기본 생성자의 초기화하는 방법이 다르다.

struct Information
{
	char name[20];
	char address[30];
	int age;
	int number;
};

int main()
{	
	Information info //초기화 리스트
	{
		"Minju",
		"Seoul",
		29,
		010,
	};
		
	return 0;
}

생성자를 선언한 경우 클래스와 같은 방법으로 초기화하면 된다.

struct Information
{
	Information();

	char name[20];
	char address[30];
	int age;
	int number;
};

int main()
{	
	Information info()
		
	return 0;
}

 

 


나중에 원인을 알게 된다면 정리하겠다만, 구조체에 private 멤버 변수가 있으면 리스트 초기화가 불가능하다.

 

 

구조체의 기타 특성

C++에서는 사용자가 정의한 데이터형을 함수로 매개변수로 전달할 수 있으며, 리턴값으로 사용할 수도 있다. 또한 대입 연산자를 사용하여 같은 데이터형의 다른 구조체에 대입할 수 있다.

struct Information
{
	Information();

	char name[20];
	char address[30];
	int age;
	int number;
};

int main()
{	
	Information info();
	Information info2 = info;

	return 0;
}

 

구조체 템플릿의 정의와 구조체 변수의 생성을 하나로 결합할 수 있다.

struct Information
{
	char name[20];
	char address[30];
	int age;
	int number;
} information; //Information형 변수 생성

위 방법은 클래스도 가능하다.

 

 

구조체의 배열

구조체를 원소로 하는 배열을 사용할 수 있다. 구조체 배열의 초기화는 아래 방식을 사용할 수 있다.

struct Information
{
	char name[20];
	char address[30];
	int age;
	int number;
};

int main()
{	
	Information info[2] //구조체 Information형 배열 선언
	{
		{"Minju", "Seoul", 29, 010}, //인덱스0
		{"Minju", "Seoul", 29, 010} //인덱스1
	};
	
	return 0;
}

 

 

 

구조체 안의 비트 필드

C와 마찬가지로 C++에서도 구조체 멤버들이 각각 일정 비트 수를 차지하도록 지정할 수 있다. 어떤 하드웨어 장치에 들어 있는 레지스터에 대응하는 데이터 구조를 만들 때 매우 편리하다. 필드형은 정수형이나 열거자여야 하고, 사용할 비트 수는 콜론을 찍고 뒤에 적는다. 이름이 없는 필드를 사용하여 패딩(padding)을 줄 수도 있다. 이러한 각 멤벌르 비트 필드라 한다.

struct TorgleRegister
{
	unsigned int SN : 4; //4비트
	unsigned int : 4; //패딩
	bool goodIn : 1; //1비트
	bool goodTorgle : 1; //1비트
};

비트 필드들 역시 초기화할 수 있다. 기억해야 할 점은 초기화 할 때, 패딩은 무시한다.

TorgleRegister tr
{
	1,
	true,
	true
};
728x90

'서적 정리 > C++ 기초 플러스' 카테고리의 다른 글

19.포인터, 배열, 포인터 연산  (0) 2022.08.09
18.포인터와 메모리 해제  (0) 2022.08.03
17.열거체(enumeration)  (0) 2022.08.03
16.공용체(union)  (0) 2022.08.03
14.string 클래스  (0) 2022.07.29
13.문자열(string)  (0) 2022.07.26
12.배열(array)  (0) 2022.07.26
11.C++ 산술 연산자  (0) 2022.07.26

댓글