26. 구조체(struct) - 기초
만약, 학생의 정보를 관리한다면 이름, 학번, 학과, 성별, 생일, 주소등의 정보를 관리할 수 있습니다. 이들을 관리하기 위해서 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