C/C++ 학습 · 6 min read · Oct 10, 2025
C/C++ 단계별 학습 - 페이지 10
10. 단계별 C/C++ — C 프로그래밍 - 구조
구조
| | 1. 소개
- 구조체 선언
- 구조체 변수 정의
- 구조체 변수 초기화
- 구조체의 직접 할당
- 구조체 크기 계산
- 중첩 구조체
- 구조체 배열
- 구조체 내 배열
- 함수에 구조체 전달
- 함수에서 구조체 반환
- 구조체에 대한 포인터
- 포인터를 포함하는 구조체
- 자기 참조 구조체 |
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)); / 2 /
printf(“%d”, sizeof(float)); / 4 /
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;
}; |
자기 참조 구조체는 주로 데이터 정리, 정렬, 요소 검색, 요소 삽입, 삭제 등에 사용될 수 있습니다.
이러한 접근 방식은 데이터 구조(즉, 연결 리스트, 스택, 큐, 트리 및 그래프)로 이어집니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.