C++ 데이터 구조: 배열, 구조체, 포인터로 효율적인 프로그램 만들기
C/C++ 배열은 같은 종류의 데이터 항목 여러 개를 결합한 변수를 정의할 수 있게 하지만, 구조체(structure)는 다른 종류의 데이터 항목들을 결합할 수 있게 하는 또 다른 사용자 정의 데이터 타입입니다.
구조체는 레코드를 표현하는 데 사용됩니다. 도서관의 책들을 추적하고 싶다고 가정해 보세요. 각 책에 대해 다음 속성들을 추적하고 싶을 수 있습니다.
- 제목(Title)
- 저자(Author)
- 주제(Subject)
- 도서 ID(Book ID)
구조체 정의
구조체를 정의하려면 struct 문을 사용해야 합니다. struct 문은 프로그램에 둘 이상의 멤버를 가진 새 데이터 타입을 정의합니다. struct 문의 형식은 다음과 같습니다.
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
구조체 태그(structure tag)는 선택 사항이며, 각 멤버 정의는 int i;나 float f; 같은 일반 변수 정의이거나 기타 유효한 변수 정의일 수 있습니다. 구조체 정의의 끝, 마지막 세미콜론 전에 하나 이상의 구조체 변수를 지정할 수 있지만 선택 사항입니다. Book 구조체를 선언하는 방법은 다음과 같습니다.
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
구조체 멤버 접근
구조체의 멤버에 접근하려면 멤버 접근 연산자(.)를 사용합니다. 멤버 접근 연산자는 구조체 변수 이름과 접근하려는 구조체 멤버 사이에 점을 찍어 코딩합니다. struct 키워드를 사용해 구조체 타입의 변수를 정의합니다. 구조체 사용법을 설명하는 예제:
Live Demo
#include <iostream>
#include <cstring>
using namespace std;
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1; // Book 타입의 Book1 선언
struct Books Book2; // Book 타입의 Book2 선언
// 책 1 사양
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 책 2 사양
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Book1 정보 출력
cout << "Book 1 title : " << Book1.title << endl;
cout << "Book 1 author : " << Book1.author << endl;
cout << "Book 1 subject : " << Book1.subject << endl;
cout << "Book 1 id : " << Book1.book_id << endl;
// Book2 정보 출력
cout << "Book 2 title : " << Book2.title << endl;
cout << "Book 2 author : " << Book2.author << endl;
cout << "Book 2 subject : " << Book2.subject << endl;
cout << "Book 2 id : " << Book2.book_id << endl;
return 0;
}
위 코드를 컴파일하고 실행하면:
Book 1 title : Learn C++ Programming
Book 1 author : Chand Miyan
Book 1 subject : C++ Programming
Book 1 id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Yakit Singha
Book 2 subject : Telecom
Book 2 id : 6495700
함수 인자로서의 구조체
구조체를 함수 인자로 전달하는 것은 다른 변수나 포인터를 전달하는 것과 매우 유사합니다. 위 예제에서와 유사한 방식으로 구조체 변수에 접근합니다.
Live Demo
#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// 책 1 사양
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 책 2 사양
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Book1 정보 출력
printBook(Book1);
// Book2 정보 출력
printBook(Book2);
return 0;
}
void printBook(struct Books book) {
cout << "Book title : " << book.title << endl;
cout << "Book author : " << book.author << endl;
cout << "Book subject : " << book.subject << endl;
cout << "Book id : " << book.book_id << endl;
}
위 코드를 컴파일하고 실행하면:
Book title : Learn C++ Programming
Book author : Chand Miyan
Book subject : C++ Programming
Book id : 6495407
Book title : Telecom Billing
Book author : Yakit Singha
Book subject : Telecom
Book id : 6495700
구조체 포인터
다른 변수에 대한 포인터를 정의하는 것과 매우 유사하게 구조체 포인터를 정의할 수 있습니다.
struct Books *struct_pointer;
이제 위 정의된 포인터 변수에 구조체 변수의 주소를 저장할 수 있습니다. 구조체 변수의 주소를 찾으려면 구조체 이름 앞에 & 연산자를 붙입니다.
struct_pointer = &Book1;
구조체 포인터를 사용해 구조체 멤버에 접근하려면 -> 연산자를 사용해야 합니다.
struct_pointer->title;
위 예제를 구조체 포인터를 사용해 다시 작성해 보겠습니다. 이 개념을 이해하기 쉬울 것입니다.
Live Demo
#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books *book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// 책 1 사양
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 책 2 사양
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 구조체 주소 전달하며 Book1 정보 출력
printBook(&Book1);
printBook(&Book2);
return 0;
}
// 구조체 포인터를 매개변수로 받는 함수
void printBook(struct Books *book) {
cout << "Book title : " << book->title << endl;
cout << "Book author : " << book->author << endl;
cout << "Book subject : " << book->subject << endl;
cout << "Book id : " << book->book_id << endl;
}
위 코드를 컴파일하고 실행하면:
Book title : Learn C++ Programming
Book author : Chand Miyan
Book subject : C++ Programming
Book id : 6495407
Book title : Telecom Billing
Book author : Yakit Singha
Book subject : Telecom
Book id : 6495700
typedef 키워드
구조체를 더 쉽게 정의하거나 생성한 타입에 "별칭"을 줄 수 있습니다. 예:
typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Books;
이제 struct 키워드 없이 Books를 직접 사용해 Books 타입의 변수를 정의할 수 있습니다.
Books Book1, Book2;
typedef 키워드는 구조체가 아닌 타입에도 사용할 수 있습니다.
typedef long int *pint32;
pint32 x, y, z;
x, y, z는 모두 long int 포인터입니다.