만약, 학생의 정보를 관리한다면 이름, 학번, 학과, 성별, 생일, 주소등의 정보를 관리할 수 있습니다. 이들을 관리하기 위해서 C언어에서는

char name[30];     // 이름
long no;           // 학번
char subject[40];  // 학과
char gendr;        // 성별(남: 'M', 여: 'F')
char birth[9];     // 생일
char addr[100];    // 주소

처럼 표현할 수 있습니다.

 

만약 100명의 정보를 관리한다면

char name[100][30];     // 이름
long no[100];           // 학번
char subject[100][40];  // 학과
char gendr[100];        // 성별(남: 'M', 여: 'F')
char birth[100][9];     // 생일
char addr[100][100];    // 주소

위와 같이 2차원 배열의 형식으로 표현할 수 있습니다.

 

만약 학생정보와 교직원 정보를 함께 관리한다면, 변수간의 연관관계를 쉽게 하기 위해서 이름을 알아보기 쉽게 다시 구성을 해야 합니다. 예를들면, 이름은 학생명, 직원명 처럼, student_name[30], employee_name[30]처럼 표현을 해야 합니다. 변수간의 연관관계도 직관적이지 않게됩니다. 이를 해결하기 위해서 데이터를 그룹화하여 여러가지의 정보를 묶어주는 사용자 정의 데이터 타입을 구조체(struct)라고 합니다.

 


사용자 정의 데이터 타입 정의

struct 구조체타입명
{
    데이터 멤버변수1;
    데이터 멤버변수2
    ...
};

형태로 구조체 타입을 정의할 수 있습니다.

 

위의 학생정보는

struct student
{
    char name[30];     // 이름
    long no;           // 학번
    char subject[40];  // 학과
    char gendr;        // 성별(남: 'M', 여: 'F')
    char birth[9];     // 생일
    char addr[100];    // 주소
};

위와 같이 구조체(struct)의 멤버변수로 정의할 수 있습니다.

 

이들 멤버변수를 사용하기 위해서는

struct student s1;

strcpy(s1.name, "홍길동");
s1.no = 2019123456;             // 학번
strcpy(s1.subject, "물리학과");  // 학과
s1.gendr = 'M';                 // 성별(남: 'M', 여: 'F') 
......

처럼 변수명.멤버변수명 형식으로 멤버 참조 연산자( . )으로 이용할 수 있습니다.

 

변수를 선언과 함께 초기화를 한다면,

struct student s1 = {"홍길동", 2019123456, "물리학과", 'M', "20000529", "서울 노원"};

 위와 같이 초기화를 할 수 있습니다.

 

또한 구조체를 정의하면서, 변수도 선언을 함께 하고싶다면,

struct student
{
    char name[30];     // 이름
    long no;           // 학번
    char subject[40];  // 학과
    char gendr;        // 성별(남: 'M', 여: 'F')
    char birth[9];     // 생일
    char addr[100];    // 주소
} student1, student2;

위와 같이 할 수 있습니다. 

 


typedef로 구조체 타입 재정의

일반적으로 구조체 타입을 정의한 후에 사용할 때 마다 struct student student1; 처럼 변수를 선언하면 귀찮기 때문에 typedef를 통하여 타입을 재정의하기도 합니다.

 

struct student
{
    char name[30];     // 이름
    long no;           // 학번
    char subject[40];  // 학과
    char gendr;        // 성별(남: 'M', 여: 'F')
    char birth[9];     // 생일
    char addr[100];    // 주소
};

typedef struct student student_t;

위와 같이 struct student 타입을 재정의하여 student_t라는 이름으로 사용할 수 있게 됩니다.

 

마찬가지로 구조체의 정의와 함께, 타입을 재정의할 수 있습니다.

typedef struct student
{
    char name[30];     // 이름
    long no;           // 학번
    char subject[40];  // 학과
    char gendr;        // 성별(남: 'M', 여: 'F')
    char birth[9];     // 생일
    char addr[100];    // 주소
} student_t;

그리고 위와 같이 구조체의 정의와 동시에 typedef로 타입을 재정의 한다면

typedef struct 
{
    char name[30];     // 이름
    long no;           // 학번
    char subject[40];  // 학과
    char gendr;        // 성별(남: 'M', 여: 'F')
    char birth[9];     // 생일
    char addr[100];    // 주소
} student_t;

구조체의 이름없이 student_t 타입을 정의할 수도 있습니다.

 


구조체 타입의 변수에 대한 배열 선언

만약, 여러명의 학생의 정보를 관리해야 한다면 배열을 선언하게 되는 데,

struct student s[100];

......

printf("name: %s\n", s[0].name);
printf("no  : %d\n", s[0].no);
......

배열 연산자 뒤에 멤버 참조 연산자를 붙여서 사용할 수 있습니다.

 


구조체 타입의 포인터 변수 선언

만약 데이터의 양이 정할 수 없어서 동적으로 메모리 할당을 해야 하는 경우에는 포인터로 선언하여 사용할 수 있습니다.

struct student *students;

students = (struct student *)malloc(sizeof(struct student) * 250); // 250명의 학생 데이터 처리
...

printf("name: %s\n", students[0].name);

위와 같이 배열 연산자로 처리하거나

struct student *students;

students = (struct student *)malloc(sizeof(struct student) * 250); // 250명의 학생 데이터 처리
...

printf("name: %s\n", students->name);
...
printf("name: %s\n", (students + 1)->name);

간접 멤버 참조 연산자(->)를 통하여 확인할 수 있습니다.

 

예제). 간접참조 연산자 사용

struct student *students, *cur;

students = (struct student *)malloc(sizeof(struct student) * 250); // 250명의 학생 데이터 처리

......

cur = students;

while(cur != NULL && strlen(cur->name) > 0) {
    printf("name: %s\n", cur->name);
    ......
    cur++;
}

 

 

 

 

 

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.

Tag ,

댓글을 달아 주세요