구조체 활용
✒️ 2025-05-15 15:48 내용 수정
수제비 2024 정보처리기사 필기 5판 1권의 내용을 정리
TCPSchool의 내용을 정리
1. 구조체 배열 선언
- 기본 타입 배열처럼 구조체를 요소로 가지는 배열을 생성할 수 있다.
- 각 구조체 배열 요소의 멤버 변수에 접근할 때도
.를 사용하여 접근한다.
#include <stdio.h>
#include <string.h>
struct book
{
// 멤버 변수
char title[50];
char author[50];
int price;
};
int main(void)
{
struct book best_seller[3] = {
{"세이노의 가르침", "세이노", 12800},
{"원씽", "게리 켈러, 제이 파파산", 16000},
{"역행자", "자청", 17500}
};
int arr_size = sizeof(best_seller) / sizeof(best_seller[0]);
for(int i = 0; i < arr_size; i++) {
printf("%s | %s | %d\n", best_seller[i].title,
best_seller[i].author, best_seller[i].price);
}
return 0;
}
세이노의 가르침 | 세이노 | 12800
원씽 | 게리 켈러, 제이 파파산 | 16000
역행자 | 자청 | 17500
2. 구조체를 가리키는 포인터
- 구조체 변수를 가리키는 구조체 포인터도 선언할 수 있다.
- 포인터 참고.
// 포인터 선언
struct 구조체이름* 구조체포인터명;
// 포인터로 구조체 멤버 접근
(*구조체포인터).멤버변수명;
구조체포인터->멤버변수명;
- 배열과 달리 구조체의 이름은 구조체를 가리키는 주소가 아니기 때문에 포인터에 할당할 때는 반드시 주소 연산자
&를 사용해야 한다.- 포인터와 배열 참고.
// 배열의 경우
int arr[3] = {1, 2, 3};
int *p = arr; // 배열 이름 = 주소
// 구조체의 경우
struct Student {
int id;
char name[20];
};
struct Student s = {1, "Alice"}; // s는 구조체 전체
// struct Student *ps = s; // 컴파일 오류
struct Student *ps = &s;
struct book best_seller = {"title", "author", 10000};
struct book* pb = &best_seller;
(*pb).title;
pb->title;
3. 함수와 구조체
- 함수에 전달할 인수나 반환값으로 구조체를 사용할 수 있다.
- 함수의 인자로 구조체를 전달할 때 구조체 포인터를 전달하는 방식은 구조체의 복사본이 아닌 주소를 전달하기 때문에 처리가 빠르다.
- 함수, 포인터 연산과 인수 전달#인수 전달 참고.
- 구조체를 함수의 인자로 직접 전달할 때 구조체의 멤버 변수를 함수에서 변경할 가능성이 있다.
- 데이터 변경을 막으려면 함수에서 인자를 받을 때
const를 추가하여 읽기 전용으로 설정한다.
- 데이터 변경을 막으려면 함수에서 인자를 받을 때
#include <stdio.h>
typedef struct {
char title[30];
int stock;
int price;
} BOOK;
int total(BOOK b)
{
return b.stock * b.price;
}
int main(void)
{
BOOK textbook = {"C 입문", 15, 16000};
printf("%s의 총 개수는 %d권이고, 전체 가격은 %d이다.",
textbook.title, textbook.stock, total(textbook));
return 0;
}
C 입문의 총 개수는 15권이고, 전체 가격은 240000이다.
4. 중첩된 구조체
- 구조체를 정의할 때 구조체의 멤버 변수로 또 다른 구조체를 포함할 수 있다.
- 중첩된 구조체를 사용하면 관련 있는 데이터를 묶어 관리하기 쉽고, 해당 구조체를 다른 곳에서도 재사용이 가능하다.
struct 구조체1이름
{
타입 구조체1멤버1;
타입 구조체1멤버2;
}
struct 구조체2이름
{
타입 구조체2멤버1;
타입 구조체2멤버2;
구조체1이름 구조체1멤버변수명;
...
}
#include <stdio.h>
typedef struct { // 멤버로 쓸 구조체
char name[30];
char location[50];
} Publisher;
typedef struct { // 상위 구조체
char title[50];
int price;
Publisher pubInfo; // 중첩 구조체로 설정
} Book;
int main(void) {
Book b1 = {
"C 언어 완전 정복",
22000,
{"한빛미디어", "서울시 마포구"}
};
printf("제목: %s\n", b1.title);
printf("가격: %d원\n", b1.price);
printf("출판사: %s\n", b1.pubInfo.name);
printf("위치: %s\n", b1.pubInfo.location);
return 0;
}
제목: C 언어 완전 정복
가격: 22000원
출판사: 한빛미디어
위치: 서울시 마포구