반응형

이전 글에서 구조체는 여러가지의 데이터를 그룹화하는 경우에 사용한다고 하였습니다. 그런데, 구조체 내에 다른 구조체를 멤버로 가질 수 있을까? 가능합니다.

struct person
{
    char name[20];
    char birth[9];
    char gendr;
};

struct student
{
    long no;              // 학번
    char subject[100];    // 학과
    struct person p_info; // 개인정보
};

struct employee
{
    long no;               // 직원번호
    struct person p_info; // 개인정보
};

위와 같이 학생과 직원의 개인정보는 같으므로 person이라는 개인정보를 별도로 정의해서 각각의 구조체에 사용하는 것입니다. 위와 같이 구조체를 사용하려면 사용할 구조체의 위쪽에 선언해주면 됩니다.

 

#include <string.h>
#include <stdio.h>

......

int main( )
{
    struct student s;
    
    s.no = 2000123456;
    strcpy(s.subject, "physics");
    strcpy(s.p_info.name, "홍길동");
    ......
}

실제로 멤버변수를 사용하기 위해서는 위와 같이 멤버참조 연산자를 통해서 사용하게 됩니다.

 


구조체 자기 자신을 멤버로 구성하기

구조체 내에 구조체 자기 자신을 멤버로 구성할 수 있을까?

struct person
{
    char name[20];
    char birth[9];
    char gendr;
    
    struct person father;
    struct person mother;
};

위와 같이 person의 멤버로 아버지, 어머니 정보를 기술하였습니다. 이 것은 불가능합니다. 이유는 father, mother 변수도 또 부모님 정보를 갖게 되어 재귀적 구성으로 데이터가 무한대로 늘어나기 때문입니다.

 

그러나

struct person
{
    char name[20];
    char birth[9];
    char gendr;
    
    struct person *father;
    struct person *mother;
};

위와 같이 포인터로 구성하는 것은 가능합니다. 포인터는 데이터를 할당하지 않은 상태이기 때문에 8바이트(64비트 기준)씩을 차지할 뿐이고, 향후에 필요시에 메모리를 할당하는 방식으로 사용해야 합니다. 위와 같이 자기 자신의 구조체를 구성하는 경우에는 포인터 형으로 구성해야 하며, 많은 종류의 자료 구조에 대한 프로그램에서 사용됩니다. (Linked List, Double Linked List, Tree, Graph, Stack, Queue 등...)

 


상호 참조 구조체

2개 이상의 구조체가 서로 참조를 하는 경우도 가능합니다. 다만 이 경우도 마찬가지로 포인터의 형태로 상호 참조를 해야 합니다.

struct teacher;

struct student
{
    char name[20];
    ......
    struct teacher *teacher; 
};

struct teacher
{
    char name[20];
    ......
    int  student_count;
    struct student *students;
};

위와 같이 학생은 담임선생님 정보를, 선생님은 학생수와 학생 목록을 저장하는 형식으로 관리를 할 수 있습니다. 특이 사항은 struct student 정의할 때에 teacher가 정의 되어 있지 않기 때문에 오류가 발생하게 됩니다. 그렇다고 teacher를 위쪽에 올리면 student가 정의되지 않았다고 오류가 발생하는 데, 이를 방지하기 위해서 위쪽에 구조체 이름만 적어주고 아래쪽에 정의를 하면 됩니다.

 

 

 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,