C/C++ 학습 · 6 min read · Oct 10, 2025

C/C++ 단계별 학습 - 페이지 10

10. 단계별 C/C++ — C 프로그래밍 - 구조

구조

| | 1. 소개

  1. 구조체 선언
  2. 구조체 변수 정의
  3. 구조체 변수 초기화
  4. 구조체의 직접 할당
  5. 구조체 크기 계산
  6. 중첩 구조체
  7. 구조체 배열
  8. 구조체 내 배열
  9. 함수에 구조체 전달
  10. 함수에서 구조체 반환
  11. 구조체에 대한 포인터
  12. 포인터를 포함하는 구조체
  13. 자기 참조 구조체 |

1. 소개

| | int a[4] = { 3, 4, 5, 6 };                / 유효한 표현 /
int a[4] = { 3, 4.23, 5, 6 };                / 유효하지 않은 표현 /
int a[4] = { 3, “Siglov”, 5,3}                / 유효하지 않은 표현 / |

마지막 두 표현이 유효하지 않은 이유는 무엇인가요? 배열은 동일한 유형의 값을 저장할 수 있습니다. 반드시 동일한 유형이어야 합니다. 반면 구조체는 정의에 따라 여러 유형의 데이터를 보유할 수 있습니다.

| | • 서로 다른 데이터 유형의 하나 이상의 변수가 단일 이름 아래에 조직된 그룹을 구조체라고 합니다.
• 이질적인(유사하지 않은) 데이터 유형의 모음이 단일 이름 아래에 그룹화된 것을 구조체라고 합니다.
• 구조체는 간단한 변수의 모음입니다. 구조체의 변수는 서로 다른 유형일 수 있습니다. 구조체의 데이터 항목은 구조체의 멤버라고 합니다. |

2. 구조체 선언

구조체가 정의되면 전체 그룹은 구조체 이름을 통해 참조됩니다. 구조체에 존재하는 개별 구성 요소는 구조체 멤버라고 하며, 이들은 별도로 접근하고 처리할 수 있습니다.

| | |

예:

| | struct date
{
int day;
int month;
int year;
}; | struct student
{
int sno;
char name[20];
int marks;
float avg;
}; |

3. 구조체 변수 정의

구조체 변수를 정의하는 것은 int와 같은 내장 데이터 유형을 정의하는 것과 동일합니다.

| | int a;                             /  유효 /
date d;                          / 유효 (하지만 C++에서만) /
struct date d;                 / C와 C++ 모두에서 유효 / |

4. 구조체 변수 초기화

구조체의 멤버는 다른 변수와 마찬가지로 초기화할 수 있습니다. 이는 선언 시 또는 설계 시에 수행할 수 있습니다.

| 1. 선언 시 초기화:
struct ddate
{
int day;
int month;
int year;
} d = { 27, 10, 2000 }; | 2. 정의 시 초기화:
struct ddate d = { 27, 10, 2000 }; | | 1.
설계 시 초기화: ddate d;
d.day = 27;
d.month = 10;
d.year = 2000;
| 4. 실행 시 초기화:
scanf(“%d%d%d”, &d.day, &d.month, &d.year); |

예:

| | / 직원의 세부 정보를 입력하고 출력하는 프로그램 작성 /
/ 73_struct.c /
#include
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e;

printf(“직원 번호 입력: “); scanf(“%d”, &e.eno);
printf(“직원 이름 입력: “); scanf(“%s”, e.name);
printf(“직원 급여 입력: “); scanf(“%d”, &e.sal);
printf(“\n\n직원 세부 정보는 다음과 같습니다…. “);
printf(“%d    %s      %d”, e.eno, e.name, e.sal);
return 0;
} |

5. 구조체의 직접 할당

구조체를 사용하여 여러 변수를 직접 할당할 수 있습니다.

| | struct emp a, b = {1001, “Vimal”, 6700.00 };
a = b; / 유효 /
printf(“%d %s %d” , a.eno, a.name, a.sal ); | | | 출력:
1001 Vimal 6700.00 |

6. 구조체 크기 계산

C/C++의 모든 데이터 유형은 지정된 크기를 가지고 있습니다. 즉, int는 2바이트, float는 4바이트 크기를 가집니다. 구조체 변수의 크기를 찾는 방법은 다음과 같습니다.

sizeof:- 이 함수는 주어진 변수의 크기를 찾는 데 사용됩니다.

| | printf(“%d”, sizeof(int));                           //
printf(“%d”, sizeof(float));                       //
printf(“%d”, sizeof(struct emp));              / emp 구조체의 크기를 표시 / |

7. 중첩 구조체

구조체 내의 구조체를 중첩 구조체라고 합니다. 중첩 구조체 멤버에 접근하려면 호출하는 구조체 멤버에서 점 연산자를 두 번 적용해야 합니다.

예:

| | / 직원 구조체와 함께 중첩 구조체를 보여주는 프로그램 /
/ 74_nested.c /
#include
struct emp
{
int eno;
char name[10];
float sal;
struct                                                    / 중첩 구조체  /
{
street char[10];
city char[10];
} addr;
};
int main()
{
struct emp e;
printf(“직원 번호, 직원 이름, 직원 급여, 거리, 도시 입력: “);
scanf(“%d%s%d%s%s”, &e.eno, e.name, &e.sal, e.addr.street, e.addr.city );
printf(“\n\n직원 세부 정보는 다음과 같습니다   …. “);
printf(“%d%s%d%s%s”, e.eno, e.name, e.sal, e.addr.street, e.addr.city );
return 0;
} |

8. 구조체 배열

구조체 배열을 생성할 수 있습니다. 배열은 개별 구조체를 요소로 가집니다.

| | / 직원의 세부 정보를 입력하고 출력하는 프로그램 작성 /
/ 75_array.c  /
#include
struct emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct emp e [10];
int i;
for(i = 0; i<10; i++)
{
printf(“직원 번호 입력: “); scanf(“%d”, &e [i].eno);
printf(“직원 이름 입력: “); scanf(“%s”, e [i].name);
printf(“직원 급여 입력: “); scanf(“%d”, &e [i].sal);
}
printf(“\n\n직원 세부 정보는 다음과 같습니다…. “);
for(i = 0; i<10; i++)
printf(“%d    %s      %d”, e [i].eno, e [i].name, e [i].sal);
return 0;
} |

위 프로그램에서 새로운 것은 없습니다. 전체 프로그램은 표시된 데이터 외에는 간단한 구조화된 프로그램과 동일합니다.

9. 구조체 내 배열

구조체 내에서 배열을 활용해야 하는 상황이 있을 수 있습니다. 구조체 내에서 배열을 달성하는 방법은 다음과 같습니다. 간단한 프로그램을 통해 접근합니다.

| | / 학생 정보를 입력하고 출력하는 프로그램  /
/ 76_array.c /
#include
struct stud
{
int sno;
char name[10];
int marks[5];                              / 구조체 내 배열 /
};
int main()
{
struct stud s;
int i;
printf(“학생 번호 입력: “); scanf(“%d”, &s.sno);
printf(“학생 이름 입력: “); scanf(“%d”, s.name);
for( i = 0; i<3; i++)
{
printf(“학생 점수 입력: “); scanf(“%d”, &s.marks[i]);
}
printf(“\n\n학생 기록은 다음과 같습니다…. “);
printf(“%d  %s  %d  %d  %d”, s.sno, s.name, s.marks[0], s.marks[1], s.marks[2] );
return 0;
} |

10. 함수에 구조체 전달

전체 구조체를 함수 호출 시 인수로 전달할 수 있습니다. 구조체 변수는 일반 변수처럼 취급됩니다.

| | / 구조체 변수를 함수에 전달하는 프로그램 /
/ 77_funct.c /
#include
struct emp
{
int eno;
char name[10];
float sal;
};
void display(struct emp temp);
int main()
{
struct emp e;
display(e);
return 0;
}
void display(struct emp temp)
{
printf(“%d  %s  %d”, temp.eno, temp.name, temp.sal );
} |

11. 함수에서 구조체 반환

함수에서 구조체를 반환할 수 있습니다. 예, 구조체는 다른 유형의 변수처럼 함수에서 반환될 수 있습니다.

| | / 함수에서 구조체 객체 반환 /
/ 78_funct.c /
struct emprec
{
int eno;
char name[10];
};
struct emprec read();
void write(struct emprec t);
int main()
{
struct emprec e;
e = read();
write(e);
return 0;
}
void write(struct emprec t)
{
printf(“\n\n%d  %s”, t.eno, t.name);
}
struct emprec read()
{
struct emprec t;
printf(“직원 번호 입력: “); scanf(“%d”, &t.eno);
printf(“직원 이름 입력: “); scanf(“%s”, t.name);
return t;
} |

12. 구조체에 대한 포인터

지금까지 우리는 구조체의 멤버가 int, char, float 또는 심지어 구조체와 같은 데이터 유형일 수 있음을 보았습니다. C/C++ 언어는 또한 구조체의 멤버로 포인터 변수를 선언하는 것을 허용합니다. 포인터 변수는 구조체 변수의 주소를 저장하는 데 사용할 수 있습니다. 포인터는 구조체 데이터 유형을 가리키는 것처럼 선언될 수 있습니다.

| | / 구조체에 대한 포인터 프로세스를 보여주는 프로그램 /
/ 79_pointer.c /
#include
struct employee
{
int eno;
char name[10];
};
struct employee emp;
int main()
{
emp = (struct employee
)malloc(sizeof(emp));
printf(“직원 세부 정보 입력 ..”);
scanf(“%d%s%”, &emp->eno, emp->name);
printf(“\n\n%d   %s”, emp->eno, emp->name);
return 0;
} |

표시된 데이터는 구조체에 대한 포인터를 구현하는 데 필수적입니다.
다음 문장은 선택 사항이지만 더 나은 메모리 관리를 위해 활용하는 것이 좋습니다.
emp = (struct employee * )malloc(sizeof(emp));

13. 포인터를 포함하는 구조체

포인터 변수를 구조체의 멤버로 사용할 수도 있습니다.
다음 프로그램은 구조체의 포인터 변수가 포함된 포인터 멤버를 포함합니다.

| | / 포인터를 포함하는 구조체 사용을 보여주는 프로그램 /
/ 80_pointers.c  /
#include
struct
{
int a;
int
b;
} *temp;
int main()
{
int x, y;
x = 20; y = 50;
rk -> a = &x;
rk -> b = &y;

printf(“%d %d “, temp->a, temp->b );
return 0;
} | | | 출력:
20    50 |

14. 자기 참조 구조체

구조체는 포함된 동일한 구조체 유형의 멤버를 가질 수 있습니다. 이는 포인터를 사용하여 가능하며, 이 현상을 자기 참조 구조체라고 합니다.

| | struct emp
{
int eno;
char name[10];
struct emp *e;
}; |

자기 참조 구조체는 주로 데이터 정리, 정렬, 요소 검색, 요소 삽입, 삭제 등에 사용될 수 있습니다.

이러한 접근 방식은 데이터 구조(즉, 연결 리스트, 스택, 큐, 트리 및 그래프)로 이어집니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.